Actually save files instead of printing them.
[kaya.git] / lib / mainwindow.rb
blob2061078d47bebe5aeebcf7e3892603b74699b362
1 require 'qtutils'
2 require 'board/board'
3 require 'board/pool'
4 require 'board/table'
5 require 'board/scene'
6 require 'history'
7 require 'controller'
9 require 'interaction/match'
11 require 'ics/protocol'
12 require 'ics/match_handler'
13 require 'ics/connection'
14 require 'console'
16 require 'filewriter'
18 class MainWindow < KDE::XmlGuiWindow
19   include ActionHandler
20   include FileWriter
22   def initialize(loader, game)
23     super nil
24     
25     @loader = loader
26     @default_game = game
27     
28     load_board(game)
29     
30     setup_actions
31     setupGUI
32   end
34 private
36   def setup_actions
37     std_action(:open_new) { new_game(@default_game) }
38     std_action :quit, :slot => :close
39     std_action(:save) { save_game }
40     
41     regular_action :back, :icon => 'go-previous', 
42                           :text => KDE.i18n("&Back") do
43       @controller.back
44     end
45     regular_action :forward, :icon => 'go-next', 
46                              :text => KDE.i18n("&Forward") do
47       @controller.forward
48     end
49     regular_action :connect, :icon => 'network-connect',
50                              :text => KDE.i18n("&Connect to ICS") do
51       connect_to_ics
52     end
53     regular_action :disconnect, :icon => 'network-disconnect',
54                                 :text => KDE.i18n("&Disconnect from ICS") do
55       if @connection
56         @connection.close
57         @connection = nil
58       end
59     end
60     
61     regular_action :flip, :icon => 'object-rotate-left',
62                           :text => KDE.i18n("F&lip") do
63       @table.flip(! @table.flipped?)
64     end
65                   
66   end
67   
68   def load_board(game)
69     scene = Scene.new
70     @table = Table.new scene, @loader, self
71     @controller = Controller.new(@table)
73     movelist = @loader.get_matching(%w(movelist)).new(@controller)
74     movelist_dock = Qt::DockWidget.new(self)
75     movelist_dock.widget = movelist
76     movelist_dock.window_title = KDE.i18n("Move list")
77     movelist_dock.object_name = "movelist"
78     add_dock_widget(Qt::LeftDockWidgetArea, movelist_dock, Qt::Vertical)
79     movelist_dock.show
81     @console = Console.new(nil)
82     console_dock = Qt::DockWidget.new(self)                                                      
83     console_dock.widget = @console                                                             
84     console_dock.focus_proxy = @console                                                        
85     console_dock.window_title = KDE.i18n("Console")                                              
86     console_dock.object_name = "console"                                                         
87     add_dock_widget(Qt::BottomDockWidgetArea, console_dock, Qt::Horizontal)                      
88     console_dock.window_flags = console_dock.window_flags & ~Qt::WindowStaysOnTopHint            
89     console_dock.show                                                                            
91     new_game(game)
92     
93     self.central_widget = @table
94   end
95   
96   def connect_to_ics
97     protocol = ICS::Protocol.new(:debug)
98     @connection = ICS::Connection.new('freechess.org', 23)
99     protocol.add_observer ICS::AuthModule.new(@connection, 'ujjajja', '')
100     protocol.add_observer ICS::StartupModule.new(@connection)
101     protocol.link_to @connection
103     protocol.observe :text do |text|
104       @console.append(text)
105     end
107     @console.observe :input do |text|
108       @connection.send_text text
109     end
111     handler = ICS::MatchHandler.new(@controller, protocol)
113     protocol.observe :creating_game do |data|
114       puts "CREATING GAME: #{data.inspect}"
115     end
117     @connection.start
118   end
119   
120   def new_game(game)
121     @controller.color = game.players.first
122     opponents = game.players[1..-1].map do |color|
123       DummyPlayer.new(color)
124     end
125     opponents.each do |p| 
126       @controller.add_controlled_player(p)
127     end
129     match = Match.new(game)
130     @controller.controlled.values.each do |p|
131       match.register(p)
132     end
133     @controller.controlled.values.each do |p|
134       match.start(p)
135     end
136     
137     @controller.reset(match)
138   end
139   
140   def save_game_as
141     match = @controller.match
142     if match
143       url = KDE::FileDialog.get_save_url(
144         KDE::Url.new, "*.pgn", self, KDE.i18n("Save game"))
145       match.url = write_game(url)
146     end
147   end
148   
149   def save_game
150     match = @controller.match
151     if match
152       if match.url
153         write_game
154       else
155         save_game_as
156       end
157     end
158   end
159   
160   def write_game(url = nil)
161     match = @controller.match
162     if match
163       url ||= match.url
164       writer = match.game.game_writer.new
165       info = match.info
166       info[:players] = info[:players].inject({}) do |res, pl|
167         res[pl.color] = pl.name
168         res
169       end
170       result = writer.write(info, match.history)
171       write_file(url, result)
172     end
173   end
176 class DummyPlayer
177   include Observer
178   include Player
179   
180   attr_reader :color
181   
182   def initialize(color)
183     @color = color
184   end