New game dialog allows selecting engines.
[kaya.git] / lib / newgame.rb
blobd105f274a69bf78c66fd9ca92146741c22bbf205
1 require 'qtutils'
3 class NewGame < KDE::Dialog
4   include Observable
5   
6   def initialize(parent, engine_loader)
7     super(parent)
8     self.caption = KDE.i18n("New game")
9     self.buttons = KDE::Dialog::Ok | KDE::Dialog::Cancel
10     
11     @widget = Qt::Widget.new(self)
12     
13     @engine_loader = engine_loader
14     @games = KDE::ComboBox.new(@widget) do
15       self.editable = false
16       Game.each do |id, game|
17         add_item(game.class.data(:name), id.to_s)
18       end
19     end
20     @players = { }
22     @layout = Qt::VBoxLayout.new(@widget)
23     @layout.add_widget(@games)
25     @games.on('currentIndexChanged(int)') do |index|
26       update_players(index)
27     end
28     
29     update_players(@games.current_index)
30     
31     self.main_widget = @widget
32     
33     on(:okClicked) do
34       engines = { }
35       humans = []
36       g = game
37       g.players.each do |player|
38         # iterate over the player array to preserve order
39         combo = @players[player]
40         data = combo.item_data(combo.current_index).to_a
41         if data.first == 'engine'
42           engine_name = data[1]
43           engines[player] = engine_loader[engine_name]
44         else
45           humans << player
46         end
47       end
48       fire :ok => {
49         :game => game,
50         :engines => engines,
51         :humans => humans }
52     end
53   end
54   
55   def update_players(index)
56     @players.each {|player, combo| combo.dispose }
57     @players = { }
58     g = game(index)
59     engines = @engine_loader.find_by_game(g)
60     g.players.each do |player|
61       combo = KDE::ComboBox.new(@widget) do
62         self.editable = false
63         add_item(KDE.i18n('Human'), Qt::Variant.new(['human']))
64       end
65       engines.each do |id, engine|
66         combo.add_item(engine.name, Qt::Variant.new(['engine', engine.name]))
67       end
68       @players[player] = combo
69       @layout.add_widget(combo)
70     end
71   end
72   
73   def game(index = nil)
74     index = @games.current_index if index.nil?
75     game_id = @games.item_data(index).toString.to_sym
76     Game.get(game_id)
77   end
78 end