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) do
39 action = lambda do |game|
40 new_game(Match.new(game))
42 diag = NewGame.new(self, action)
45 std_action(:open) { load_game }
46 std_action :quit, :slot => :close
47 std_action(:save) { save_game }
48 std_action(:saveAs) { save_game_as }
50 regular_action :back, :icon => 'go-previous',
51 :text => KDE.i18n("B&ack") do
54 regular_action :forward, :icon => 'go-next',
55 :text => KDE.i18n("&Forward") do
58 regular_action :connect, :icon => 'network-connect',
59 :text => KDE.i18n("&Connect to ICS") do
62 regular_action :disconnect, :icon => 'network-disconnect',
63 :text => KDE.i18n("&Disconnect from ICS") do
70 regular_action :flip, :icon => 'object-rotate-left',
71 :text => KDE.i18n("F&lip") do
72 @table.flip(! @table.flipped?)
78 @table = Table.new scene, @loader, self
79 @controller = Controller.new(@table)
80 @table.observe(:reset) do |match|
81 update_game_actions(match)
84 movelist = @loader.get_matching(:movelist).new(@controller)
85 movelist_dock = Qt::DockWidget.new(self)
86 movelist_dock.widget = movelist
87 movelist_dock.window_title = KDE.i18n("History")
88 movelist_dock.object_name = "movelist"
89 add_dock_widget(Qt::LeftDockWidgetArea, movelist_dock, Qt::Vertical)
92 @console = Console.new(nil)
93 console_dock = Qt::DockWidget.new(self)
94 console_dock.widget = @console
95 console_dock.focus_proxy = @console
96 console_dock.window_title = KDE.i18n("Console")
97 console_dock.object_name = "console"
98 add_dock_widget(Qt::BottomDockWidgetArea, console_dock, Qt::Horizontal)
99 console_dock.window_flags = console_dock.window_flags & ~Qt::WindowStaysOnTopHint
102 self.central_widget = @table
106 protocol = ICS::Protocol.new(:debug)
107 @connection = ICS::Connection.new('freechess.org', 23)
108 protocol.add_observer ICS::AuthModule.new(@connection, 'ujjajja', '')
109 protocol.add_observer ICS::StartupModule.new(@connection)
110 protocol.link_to @connection
112 protocol.observe :text do |text|
113 @console.append(text)
116 @console.observe :input do |text|
117 @connection.send_text text
120 handler = ICS::MatchHandler.new(@controller, protocol)
126 setup_single_player(match)
127 @controller.reset(match)
130 def setup_single_player(match)
131 @controller.color = match.game.players.first
132 opponents = match.game.players[1..-1].map do |color|
133 DummyPlayer.new(color)
135 opponents.each do |p|
136 @controller.add_controlled_player(p)
139 @controller.controlled.values.each do |p|
142 @controller.controlled.values.each do |p|
148 url = KDE::FileDialog.get_open_url(KDE::Url.new, '*.*', self,
149 KDE.i18n("Open game"))
152 ext = File.extname(url.path)[1..-1]
154 readers = Game.to_enum.find_all do |_, game|
155 game.respond_to?(:game_extensions) and
156 game.game_extensions.include?(ext)
158 [game, game.game_reader]
162 warn "Unknown file extension #{ext}"
167 return unless KIO::NetAccess.download(url, tmp_file, self)
173 readers.each do |g, reader|
175 data = File.open(tmp_file) do |f|
179 history = reader.read(data, i)
183 rescue ParseException
188 warn "Could not load file #{url.path}"
193 match = Match.new(game)
194 setup_single_player(match)
195 match.history = history
198 @controller.reset(match)
203 match = @controller.match
205 pattern = if match.game.respond_to?(:game_extensions)
206 match.game.game_extensions.map{|ext| "*.#{ext}"}.join(' ')
210 url = KDE::FileDialog.get_save_url(
211 KDE::Url.new, pattern, self, KDE.i18n("Save game"))
212 match.url = write_game(url)
217 match = @controller.match
227 def write_game(url = nil)
228 match = @controller.match
231 writer = match.game.game_writer
233 info[:players] = info[:players].inject({}) do |res, pl|
234 res[pl.color] = pl.name
237 result = writer.write(info, match.history)
238 write_file(url, result)
242 def update_game_actions(match)
243 unplug_action_list('game_actions')
244 actions = if match.game.respond_to?(:actions)
245 match.game.actions(self, action_collection, @controller.policy)
249 plug_action_list('game_actions', actions)
260 def initialize(color)