Add caption for the engine configuration dialog.
[kaya.git] / lib / engine_prefs.rb
blobe3215264a859aa11a05bf9cdaf86b813953c6f64
1 require 'qtutils'
2 require 'plugins/loader'
4 class EngineData < KDE::Dialog
5   include Observable
6   
7   def initialize(caption, parent, engine = nil)
8     super(parent)
9     self.caption = caption
10     self.buttons = KDE::Dialog::Ok | KDE::Dialog::Cancel
11     
12     page = Qt::Frame.new(self)
13     layout = Qt::VBoxLayout.new(page)
15     tmp = Qt::HBoxLayout.new
16     label = Qt::Label.new(KDE.i18n("&Name:"), page)
17     tmp.add_widget(label)
18     name = KDE::LineEdit.new(page)
19     label.buddy = name
20     tmp.add_widget(name)
21     layout.add_layout(tmp)
22     
23     tmp = Qt::HBoxLayout.new
24     label = Qt::Label.new(KDE.i18n("&Type:"), page)
25     tmp.add_widget(label)
26     type = KDE::ComboBox.new(page)
27     label.buddy = type
28     loader = PluginLoader.new
29     protocols = loader.get_all_matching(:engine).map do |klass|
30       klass.data(:protocol)
31     end.uniq
32     protocols.each do |prot|
33       type.add_item(prot)
34     end
36     tmp.add_widget(type)
37     layout.add_layout(tmp)
38     
39     tmp = Qt::HBoxLayout.new
40     label = Qt::Label.new(KDE.i18n("&Game:"), page)
41     tmp.add_widget(label)
42     games = Game.new_combo(page)
44     label.buddy = games
45     tmp.add_widget(games)
46     layout.add_layout(tmp)
47     
48     tmp = Qt::HBoxLayout.new
49     label = Qt::Label.new(KDE.i18n("&Path:"), page)
50     tmp.add_widget(label)
51     path = KDE::UrlRequester.new(page)
52     label.buddy = path
53     tmp.add_widget(path)
54     layout.add_layout(tmp)
55     
56     tmp = Qt::HBoxLayout.new
57     label = Qt::Label.new(KDE.i18n("&Work directory:"), page)
58     tmp.add_widget(label)
59     workdir = KDE::UrlRequester.new(page)
60     label.buddy = workdir
61     tmp.add_widget(workdir)
62     layout.add_layout(tmp)
64     if engine
65       name.text = engine.name
66       path.path = engine.path
67       workdir.path = engine.workdir
68       current = (0...games.count).
69         map{|i| games.item_data(i).toString }.
70         index(engine.game.class.data(:id).to_s)
71       games.current_index = current if current
72       current = protocols.index(engine.protocol)
73       type.current_index = current if current
74     end
76     self.main_widget = page
77     
78     name.set_focus
79     
80     on(:okClicked) do
81       unless path.text.empty? or name.text.empty?
82         protocol = type.current_text
83         game = games.item_data(games.current_index).toString.to_sym
84         fire :ok => {
85           :name => name.text,
86           :protocol => type.current_text,
87           :game => game,
88           :path => path.text,
89           :workdir => workdir.text }
90       end
91     end
92   end
93 end
95 class EnginePrefs < KDE::Dialog
96   def initialize(loader, parent)
97     super(parent)
98     @loader = loader
99     self.caption = KDE.i18n("Configure Engines")
100     self.buttons = KDE::Dialog::Ok | KDE::Dialog::Cancel
101     widget = Qt::Frame.new(self)
102     
103     layout = Qt::HBoxLayout.new(widget)
104     
105     @list = Qt::ListView.new(widget)
106     @list.model = Qt::StringListModel.new(
107       @loader.map{|name, engine| name }, self)
108     
109     # save loader state
110     @engines = { }
111     @loader.each do |name, engine|
112       @engines[name] = engine
113     end
114     
115     layout.add_widget(@list)
116     
117     buttons = Qt::VBoxLayout.new
118     @add_engine = KDE::PushButton.new(
119       KDE::Icon.new('list-add'), KDE.i18n("&New..."), widget)
120     buttons.add_widget(@add_engine)
121     @edit_engine = KDE::PushButton.new(
122       KDE::Icon.new('configure'), KDE.i18n("&Edit..."), widget)
123     buttons.add_widget(@edit_engine)
124     @delete_engine = KDE::PushButton.new(
125       KDE::Icon.new('list-remove'), KDE.i18n("&Delete"), widget)
126     buttons.add_widget(@delete_engine)
127     
128     buttons.add_stretch
129     layout.add_layout(buttons)
131     @add_engine.on(:pressed) { add_engine }
132     @edit_engine.on(:pressed) { edit_engine }
133     @delete_engine.on(:pressed) { delete_engine }
134 #     @list.on('itemDoubleClicked(QListWidgetItem*)') { edit_engine }
136     self.main_widget = widget
138     on(:okClicked) do
139       @loader.update_entries(@engines)
140     end
141   end
142   
143   def delete_engine
144     index = current
145     if index
146       @list.model.remove_rows(index.row, 1)
147     end
148   end
149   
150   def add_engine
151     dialog = EngineData.new(KDE.i18n("New Engine"), self)
152     dialog.observe(:ok) do |data|
153       engine = @loader.engine.new(data)
154       @engines[engine.name] = engine
155       index = @list.model.row_count
156       @list.model.insert_rows(index, 1)
157       @list.model.set_data(@list.model.index(index, 0), 
158                            engine.name,
159                            Qt::DisplayRole)
160     end
161     dialog.exec
162   end
163   
164   def edit_engine
165     index = current
166     if index
167       old_name = @list.model.data(index, Qt::DisplayRole).toString
168       old_engine = @engines[old_name]
169       dialog = EngineData.new(KDE.i18n("Edit Engine"), self, old_engine)
170       dialog.observe(:ok) do |data|
171         engine = @loader.engine.new(data)
172         if engine.name != old_name
173           @engines.delete(old_name)
174         end
175         @engines[engine.name] = engine
176         @list.model.set_data(index, engine.name, Qt::DisplayRole)
177       end
178       dialog.exec
179     end
180   end
181   
182   def current
183     indexes = @list.selection_model.selection.indexes
184     unless indexes.empty?
185       indexes.first
186     end
187   end