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 current_game = if @controller.match
147 @controller.match.game
149 diag = NewGame.new(self, @engine_loader, current_game)
150 diag.observe(:ok) do |data|
152 match = Match.new(game)
154 match.observe(:started) { @controller.reset(match) }
156 # set up engine players
157 players = game.players
158 data[:engines].each do |player, engine|
159 e = engine.new(player, match)
163 # set up human players
164 if data[:humans].empty?
165 @controller.color = nil
167 @controller.color = data[:humans].first
168 match.register(@controller)
170 data[:humans][1..-1].each do |player|
171 p = DummyPlayer.new(player)
172 @controller.add_controlled_player(p)
176 @controller.controlled.values.each {|p| match.start(p) }
182 url = KDE::FileDialog.get_open_url(KDE::Url.new, '*.*', self,
183 KDE.i18n("Open game"))
186 ext = File.extname(url.path)[1..-1]
188 readers = Game.to_enum.find_all do |_, game|
189 game.respond_to?(:game_extensions) and
190 game.game_extensions.include?(ext)
192 [game, game.game_reader]
196 warn "Unknown file extension #{ext}"
201 return unless KIO::NetAccess.download(url, tmp_file, self)
207 readers.each do |g, reader|
209 data = File.open(tmp_file) do |f|
213 history = reader.read(data, i)
217 rescue ParseException
222 warn "Could not load file #{url.path}"
227 match = Match.new(game)
228 setup_single_player(match)
229 match.history = history
232 @controller.reset(match)
237 match = @controller.match
239 pattern = if match.game.respond_to?(:game_extensions)
240 match.game.game_extensions.map{|ext| "*.#{ext}"}.join(' ')
244 url = KDE::FileDialog.get_save_url(
245 KDE::Url.new, pattern, self, KDE.i18n("Save game"))
246 match.url = write_game(url)
251 match = @controller.match
261 def write_game(url = nil)
262 match = @controller.match
265 writer = match.game.game_writer
267 info[:players] = info[:players].inject({}) do |res, pl|
268 res[pl.color] = pl.name
271 result = writer.write(info, match.history)
272 write_file(url, result)
276 def update_game_actions(match)
277 unplug_action_list('game_actions')
278 actions = if match.game.respond_to?(:actions)
279 match.game.actions(self, action_collection, @controller.policy)
283 plug_action_list('game_actions', actions)
294 def initialize(color)