9 require 'interaction/match'
11 require 'ics/protocol'
12 require 'ics/match_handler'
13 require 'ics/connection'
19 class MainWindow < KDE::XmlGuiWindow
23 def initialize(loader, game)
32 new_game(Match.new(game))
38 std_action(:open_new) { create_game }
39 std_action(:open) { load_game }
40 std_action :quit, :slot => :close
41 std_action(:save) { save_game }
42 std_action(:saveAs) { save_game_as }
44 regular_action :back, :icon => 'go-previous',
45 :text => KDE.i18n("B&ack") do
48 regular_action :forward, :icon => 'go-next',
49 :text => KDE.i18n("&Forward") do
52 regular_action :connect, :icon => 'network-connect',
53 :text => KDE.i18n("&Connect to ICS") do
56 regular_action :disconnect, :icon => 'network-disconnect',
57 :text => KDE.i18n("&Disconnect from ICS") do
64 regular_action :flip, :icon => 'object-rotate-left',
65 :text => KDE.i18n("F&lip") do
66 @table.flip(! @table.flipped?)
72 @table = Table.new scene, @loader, self
73 @controller = Controller.new(@table)
74 @table.observe(:reset) do |match|
75 update_game_actions(match)
77 @engine_loader = @loader.get_matching(:engine_loader).new(@loader)
79 movelist = @loader.get_matching(:movelist).new(@controller)
80 movelist_dock = Qt::DockWidget.new(self)
81 movelist_dock.widget = movelist
82 movelist_dock.window_title = KDE.i18n("History")
83 movelist_dock.object_name = "movelist"
84 add_dock_widget(Qt::LeftDockWidgetArea, movelist_dock, Qt::Vertical)
87 @console = Console.new(nil)
88 console_dock = Qt::DockWidget.new(self)
89 console_dock.widget = @console
90 console_dock.focus_proxy = @console
91 console_dock.window_title = KDE.i18n("Console")
92 console_dock.object_name = "console"
93 add_dock_widget(Qt::BottomDockWidgetArea, console_dock, Qt::Horizontal)
94 console_dock.window_flags = console_dock.window_flags & ~Qt::WindowStaysOnTopHint
97 self.central_widget = @table
101 protocol = ICS::Protocol.new(:debug)
102 @connection = ICS::Connection.new('freechess.org', 23)
103 config = KDE::Global.config.group("ICS")
104 protocol.add_observer ICS::AuthModule.new(@connection,
105 config.read_entry('username', 'guest'),
106 config.read_entry('password', ''))
107 protocol.add_observer ICS::StartupModule.new(@connection)
108 protocol.link_to @connection
110 protocol.observe :text do |text|
111 @console.append(text)
114 @console.observe :input do |text|
115 @connection.send_text text
118 handler = ICS::MatchHandler.new(@controller, protocol)
124 setup_single_player(match)
125 @controller.reset(match)
128 def setup_single_player(match)
129 @controller.color = match.game.players.first
130 opponents = match.game.players[1..-1].map do |color|
131 DummyPlayer.new(color)
133 opponents.each do |p|
134 @controller.add_controlled_player(p)
137 @controller.controlled.values.each do |p|
140 @controller.controlled.values.each do |p|
146 diag = NewGame.new(self, @engine_loader)
147 diag.observe(:ok) do |data|
149 match = Match.new(game)
151 match.observe(:started) { @controller.reset(match) }
153 # set up engine players
154 players = game.players
155 data[:engines].each do |player, engine|
156 e = engine.new(player, match)
160 # set up human players
161 if data[:humans].empty?
162 @controller.color = nil
164 @controller.color = data[:humans].first
165 match.register(@controller)
167 data[:humans][1..-1].each do |player|
168 p = DummyPlayer.new(player)
169 @controller.add_controlled_player(p)
173 @controller.controlled.values.each {|p| match.start(p) }
179 url = KDE::FileDialog.get_open_url(KDE::Url.new, '*.*', self,
180 KDE.i18n("Open game"))
183 ext = File.extname(url.path)[1..-1]
185 readers = Game.to_enum.find_all do |_, game|
186 game.respond_to?(:game_extensions) and
187 game.game_extensions.include?(ext)
189 [game, game.game_reader]
193 warn "Unknown file extension #{ext}"
198 return unless KIO::NetAccess.download(url, tmp_file, self)
204 readers.each do |g, reader|
206 data = File.open(tmp_file) do |f|
210 history = reader.read(data, i)
214 rescue ParseException
219 warn "Could not load file #{url.path}"
224 match = Match.new(game)
225 setup_single_player(match)
226 match.history = history
229 @controller.reset(match)
234 match = @controller.match
236 pattern = if match.game.respond_to?(:game_extensions)
237 match.game.game_extensions.map{|ext| "*.#{ext}"}.join(' ')
241 url = KDE::FileDialog.get_save_url(
242 KDE::Url.new, pattern, self, KDE.i18n("Save game"))
243 match.url = write_game(url)
248 match = @controller.match
258 def write_game(url = nil)
259 match = @controller.match
262 writer = match.game.game_writer
264 info[:players] = info[:players].inject({}) do |res, pl|
265 res[pl.color] = pl.name
268 result = writer.write(info, match.history)
269 write_file(url, result)
273 def update_game_actions(match)
274 unplug_action_list('game_actions')
275 actions = if match.game.respond_to?(:actions)
276 match.game.actions(self, action_collection, @controller.policy)
280 plug_action_list('game_actions', actions)
291 def initialize(color)