Simple linear move list.
[kaya.git] / lib / mainwindow.rb
blob7fdc277c0bfb3ba14d52593aece45ea2770977f6
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 class MainWindow < KDE::XmlGuiWindow
10   include ActionHandler
11   
12   Theme = Struct.new(:pieces, :board, :layout)
13   
14   def initialize(loader, game)
15     super nil
16     
17     @loader = loader
18     
19     load_board(game)
20     
21     setup_actions
22     setupGUI
23   end
25 private
27   def setup_actions
28     std_action :open_new do
29       puts "new game"
30     end
31     std_action :quit, :slot => :close
32     regular_action :back, :icon => 'go-previous', 
33                           :text => KDE.i18n("&Back") do
34       @controller.back
35     end
36     regular_action :forward, :icon => 'go-next', 
37                              :text => KDE.i18n("&Forward") do
38       @controller.forward
39     end
40                   
41   end
42   
43   def load_board(game)
44     config = KDE::Global.config.group('themes')
45     
46     theme = Theme.new
47     theme.pieces = @loader.
48       get_matching((game.keywords || []) + %w(pieces)).
49       new(:game => game, :shadow => true)
50     theme.board = @loader.
51       get_matching(%w(board), game.keywords || []).
52       new(:game => game)
53     theme.layout = @loader.
54       get_matching(%w(layout), game.keywords || []).
55       new(game)
56     
57     scene = Scene.new
58     
59     state = game.state.new.tap {|s| s.setup }
60     
61     field = AnimationField.new(20)
62     board = Board.new(scene, theme, game)
63     pools = if game.respond_to? :pool
64       game.players.inject({}) do |res, player|
65         res[player] = Pool.new(scene, theme, game)
66         res
67       end
68     else
69       {}
70     end
71     clock_class = @loader.get_matching(%w(clock))
72     clocks = game.players.inject({}) do |res, player|
73       res[player] = clock_class.new(scene)
74       res
75     end
76     
77     elements = { :board => board,
78                  :pools => pools,
79                  :clocks => clocks }
80     table = Table.new scene, theme, self, elements
82     history = History.new(state)
83     @controller = Controller.new(scene, elements, game, history)
84     
85     movelist = @loader.get_matching(%w(movelist)).
86       new(parent, history, game)
87     
88     movelist_dock = Qt::DockWidget.new(self)
89     movelist_dock.widget = movelist
90     movelist_dock.window_title = KDE.i18n("Move list")
91     movelist_dock.object_name = "movelist"
92     add_dock_widget(Qt::LeftDockWidgetArea, movelist_dock, Qt::Vertical)
93     movelist_dock.show
94     
95     self.central_widget = table
96   end
97 end