Update connect/disconnect action states.
[kaya.git] / lib / engine_prefs.rb
blob89dd207985e827a8cb3ba137de8d7ba58d92d265
1 # Copyright (c) 2009 Paolo Capriotti <p.capriotti@gmail.com>
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
8 require 'toolkit'
9 require 'plugins/loader'
11 class EngineData < KDE::Dialog
12   include Observable
13   
14   def initialize(caption, parent, engine = nil)
15     super(parent)
16     
17     @gui = KDE::autogui(:engine_data,
18                         :caption => caption) do |g|
19       g.layout(:type => :vertical) do |l|
20         labelled(l, :name, KDE::i18n("&Name:")) do |h|
21           h.line_edit(:name)
22         end
23         labelled(l, :type, KDE::i18n("&Type:")) do |h|
24           h.combo_box(:type)
25         end
26         labelled(l, :games, KDE::i18n("&Games:")) do |h|
27           h.widget(:games, :factory => Factory.new {|p| Game.new_combo(p) })
28         end
29         labelled(l, :path, KDE::i18n("&Path:")) do |h|
30           h.url_requester(:path)
31         end
32         labelled(l, :args, KDE::i18n("&Arguments:")) do |h|
33           h.line_edit(:args)
34         end
35         labelled(l, :workdir, KDE::i18n("&Work directory:")) do |h|
36           h.url_requester(:workdir)
37         end
38       end
39     end
40     setGUI(@gui)
41     
42     loader = PluginLoader.new
43     protocols = loader.get_all_matching(:engine).map do |klass|
44       klass.data(:protocol)
45     end.uniq
46     protocols.each do |prot|
47       type.add_item(prot)
48     end
50     if engine
51       name.text = engine.name
52       path.url = KDE::Url.new(engine.path) if engine.path
53       args.text = engine.arguments if engine.arguments
54       workdir.url = KDE::Url.new(engine.workdir) if engine.workdir
55       current = (0...games.count).
56         map{|i| games.item_data(i).toString }.
57         index(engine.game.class.data(:id).to_s)
58       games.current_index = current if current
59       current = protocols.index(engine.protocol)
60       type.current_index = current if current
61     end
62     
63     name.set_focus
64     
65     on(:ok_clicked) do
66       unless path.text.empty? or name.text.empty?
67         protocol = type.current_text
68         game = games.item_data(games.current_index).toString.to_sym
69         fire :ok => {
70           :name => name.text,
71           :protocol => type.current_text,
72           :arguments => args.text,
73           :game => game,
74           :path => path.url.path,
75           :workdir => workdir.url.path }
76       end
77     end
78   end
79   
80   def labelled(builder, name, label)
81     builder.layout(:type => :horizontal) do |l|
82       l.label(:text => label, :buddy => name)
83       yield l
84     end
85   end
86 end
88 class EnginePrefs < KDE::Dialog
89   def initialize(loader, parent)
90     super(parent)
91     @loader = loader
92     
93     @gui = KDE::autogui(:engine_prefs,
94                         :caption => KDE.i18n("Configure Engines")) do |g|
95       g.layout(:type => :horizontal) do |l|
96         l.list(:list)
97         l.layout(:type => :vertical) do |buttons|
98           buttons.button(:add_engine,
99                          :text => KDE.i18nc("engine", "&New..."),
100                          :icon => 'list-add')
101           buttons.button(:edit_engine,
102                          :text => KDE.i18nc("engine", "&Edit..."),
103                          :icon => 'configure')
104           buttons.button(:delete_engine,
105                          :text => KDE.i18nc("engine", "&Delete"),
106                          :icon => 'list-remove')
107           buttons.stretch
108         end
109       end
110     end
111     setGUI(@gui)
113     list.model = Qt::StringListModel.new(
114       @loader.map{|name, engine| name }, self)
115     
116     # save loader state
117     @engines = { }
118     @loader.each do |name, engine|
119       @engines[name] = engine
120     end
121     
122     add_engine.on(:clicked) { do_add_engine }
123     edit_engine.on(:clicked) { do_edit_engine }
124     delete_engine.on(:clicked) { do_delete_engine }
126     on(:ok_clicked) do
127       @loader.update_entries(@engines)
128     end
129   end
130   
131   def do_delete_engine
132     index = current
133     if index
134       name = list.model.data(index, Qt::DisplayRole).toString
135       list.model.remove_rows(index.row, 1)
136       @engines.delete(name)
137     end
138   end
139   
140   def do_add_engine
141     dialog = EngineData.new(KDE.i18n("New Engine"), self)    
142     dialog.on(:ok) do |data|
143       engine = @loader.engine.new(data)
144       @engines[engine.name] = engine
145       index = list.model.row_count
146       list.model.insert_rows(index, 1)
147       list.model.set_data(list.model.index(index, 0), 
148                            Qt::Variant.new(engine.name),
149                            Qt::DisplayRole)
150     end
151     dialog.exec
152   end
153   
154   def do_edit_engine
155     index = current
156     if index
157       old_name = list.model.data(index, Qt::DisplayRole).toString
158       old_engine = @engines[old_name]
159       dialog = EngineData.new(KDE.i18n("Edit Engine"), self, old_engine)
160       dialog.on(:ok) do |data|
161         engine = @loader.engine.new(data)
162         if engine.name != old_name
163           @engines.delete(old_name)
164         end
165         @engines[engine.name] = engine
166         list.model.set_data(index, Qt::Variant.new(engine.name), Qt::DisplayRole)
167       end
168       dialog.exec
169     end
170   end
171   
172   def current
173     indexes = list.selection_model.selection.indexes
174     unless indexes.empty?
175       indexes.first
176     end
177   end