Add 'save' action.
[kaya.git] / lib / mainwindow.rb
blobc431363c4ffd348c9ff60f56a790c2c08ec32b5e
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 class MainWindow < KDE::XmlGuiWindow
17   include ActionHandler
19   def initialize(loader, game)
20     super nil
21     
22     @loader = loader
23     @default_game = game
24     
25     load_board(game)
26     
27     setup_actions
28     setupGUI
29   end
31 private
33   def setup_actions
34     std_action(:open_new) { new_game(@default_game) }
35     std_action :quit, :slot => :close
36     std_action(:save) { save_game }
37     
38     regular_action :back, :icon => 'go-previous', 
39                           :text => KDE.i18n("&Back") do
40       @controller.back
41     end
42     regular_action :forward, :icon => 'go-next', 
43                              :text => KDE.i18n("&Forward") do
44       @controller.forward
45     end
46     regular_action :connect, :icon => 'network-connect',
47                              :text => KDE.i18n("&Connect to ICS") do
48       connect_to_ics
49     end
50     regular_action :disconnect, :icon => 'network-disconnect',
51                                 :text => KDE.i18n("&Disconnect from ICS") do
52       if @connection
53         @connection.close
54         @connection = nil
55       end
56     end
57     
58     regular_action :flip, :icon => 'object-rotate-left',
59                           :text => KDE.i18n("F&lip") do
60       @table.flip(! @table.flipped?)
61     end
62                   
63   end
64   
65   def load_board(game)
66     scene = Scene.new
67     @table = Table.new scene, @loader, self
68     @controller = Controller.new(@table)
70     movelist = @loader.get_matching(%w(movelist)).new(@controller)
71     movelist_dock = Qt::DockWidget.new(self)
72     movelist_dock.widget = movelist
73     movelist_dock.window_title = KDE.i18n("Move list")
74     movelist_dock.object_name = "movelist"
75     add_dock_widget(Qt::LeftDockWidgetArea, movelist_dock, Qt::Vertical)
76     movelist_dock.show
78     @console = Console.new(nil)
79     console_dock = Qt::DockWidget.new(self)                                                      
80     console_dock.widget = @console                                                             
81     console_dock.focus_proxy = @console                                                        
82     console_dock.window_title = KDE.i18n("Console")                                              
83     console_dock.object_name = "console"                                                         
84     add_dock_widget(Qt::BottomDockWidgetArea, console_dock, Qt::Horizontal)                      
85     console_dock.window_flags = console_dock.window_flags & ~Qt::WindowStaysOnTopHint            
86     console_dock.show                                                                            
88     new_game(game)
89     
90     self.central_widget = @table
91   end
92   
93   def connect_to_ics
94     protocol = ICS::Protocol.new(:debug)
95     @connection = ICS::Connection.new('freechess.org', 23)
96     protocol.add_observer ICS::AuthModule.new(@connection, 'ujjajja', '')
97     protocol.add_observer ICS::StartupModule.new(@connection)
98     protocol.link_to @connection
100     protocol.observe :text do |text|
101       @console.append(text)
102     end
104     @console.observe :input do |text|
105       @connection.send_text text
106     end
108     handler = ICS::MatchHandler.new(@controller, protocol)
110     protocol.observe :creating_game do |data|
111       puts "CREATING GAME: #{data.inspect}"
112     end
114     @connection.start
115   end
116   
117   def new_game(game)
118     @controller.color = game.players.first
119     opponents = game.players[1..-1].map do |color|
120       DummyPlayer.new(color)
121     end
122     opponents.each do |p| 
123       @controller.add_controlled_player(p)
124     end
126     match = Match.new(game)
127     @controller.controlled.values.each do |p|
128       match.register(p)
129     end
130     @controller.controlled.values.each do |p|
131       match.start(p)
132     end
133     
134     @controller.reset(match)
135   end
136   
137   def save_game
138     match = @controller.match
139     if match
140       writer = match.game.game_writer.new
141       info = match.info
142       info[:players] = info[:players].inject({}) do |res, pl|
143         res[pl.color] = pl.name
144         res
145       end
146       result = writer.write(info, match.history)
147       puts result
148     end
149   end
152 class DummyPlayer
153   include Observer
154   include Player
155   
156   attr_reader :color
157   
158   def initialize(color)
159     @color = color
160   end