Update feature list in README.
[kaya.git] / lib / newgame.rb
blob4ec66e91b95a86eca586782dcbb7ab19e9c1f2e6
1 require 'qtutils'
3 class NewGame < KDE::Dialog
4   include Observable
5   
6   def initialize(parent, 
7                  engine_loader, 
8                  current_game)
9     super(parent)
10     self.caption = KDE.i18n("New game")
11     self.buttons = KDE::Dialog::Ok | KDE::Dialog::Cancel
12     
13     @widget = Qt::Widget.new(self)
14     
15     @engine_loader = engine_loader
16     label = Qt::Label.new(KDE.i18n("&Game:"), @widget)
17     @games = Game.new_combo(@widget)
18     
19     label.buddy = @games
20     hlayout = Qt::HBoxLayout.new
21     hlayout.add_widget(label)
22     hlayout.add_widget(@games)
23     @players = { }
25     @layout = Qt::VBoxLayout.new(@widget)
26     @layout.add_layout(hlayout)
28     current = (0...@games.count).
29       map{|i| @games.item_data(i).toString }.
30       index(current_game.class.data(:id).to_s)
31     @games.current_index = current if current
32     @games.on('currentIndexChanged(int)') do |index|
33       update_players(index)
34     end
35     
36     update_players(@games.current_index)
37     
38     self.main_widget = @widget
39     
40     on(:okClicked) do
41       engines = { }
42       humans = []
43       g = game
44       g.players.each do |player|
45         # iterate over the player array to preserve order
46         combo = @players[player]
47         data = combo.item_data(combo.current_index).to_a
48         if data.first == 'engine'
49           engine_name = data[1]
50           engines[player] = engine_loader[engine_name]
51         else
52           humans << player
53         end
54       end
55       fire :ok => {
56         :game => game,
57         :engines => engines,
58         :humans => humans }
59     end
60   end
61   
62   def update_players(index)
63     @player_widget.dispose if @player_widget
64     @player_widget = Qt::Widget.new(@widget)
65     layout = Qt::VBoxLayout.new(@player_widget)
66     layout.margin = 0
67     @layout.add_widget(@player_widget)
68     
69     @players = { }
70     g = game(index)
71     engines = @engine_loader.find_by_game(g)
72     g.players.each do |player|
73       label = Qt::Label.new(player.to_s.capitalize + ':', @player_widget)
74       combo = KDE::ComboBox.new(@player_widget) do
75         self.editable = false
76         add_item(KDE.i18n('Human'), Qt::Variant.new(['human']))
77       end
78       engines.each do |id, engine|
79         combo.add_item(engine.name, Qt::Variant.new(['engine', engine.name]))
80       end
81       @players[player] = combo
82       
83       hlayout = Qt::HBoxLayout.new
84       hlayout.add_widget(label)
85       hlayout.add_widget(combo)
86       layout.add_layout(hlayout)
87     end
88   end
89   
90   def game(index = nil)
91     index = @games.current_index if index.nil?
92     game_id = @games.item_data(index).toString.to_sym
93     Game.get(game_id)
94   end
95 end