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