1 # Copyright (c) 2009 Paolo Capriotti <p.capriotti@gmail.com>
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.
9 require 'plugins/loader'
11 class EngineData < KDE::Dialog
14 def initialize(caption, parent, engine = nil)
16 self.caption = caption
17 self.buttons = KDE::Dialog::Ok | KDE::Dialog::Cancel
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)
25 name = KDE::LineEdit.new(page)
28 layout.add_layout(tmp)
30 tmp = Qt::HBoxLayout.new
31 label = Qt::Label.new(KDE.i18n("&Type:"), page)
33 type = KDE::ComboBox.new(page)
35 loader = PluginLoader.new
36 protocols = loader.get_all_matching(:engine).map do |klass|
39 protocols.each do |prot|
44 layout.add_layout(tmp)
46 tmp = Qt::HBoxLayout.new
47 label = Qt::Label.new(KDE.i18n("&Game:"), page)
49 games = Game.new_combo(page)
53 layout.add_layout(tmp)
55 tmp = Qt::HBoxLayout.new
56 label = Qt::Label.new(KDE.i18n("&Path:"), page)
58 path = KDE::UrlRequester.new(page)
61 layout.add_layout(tmp)
63 tmp = Qt::HBoxLayout.new
64 label = Qt::Label.new(KDE.i18n("&Work directory:"), page)
66 workdir = KDE::UrlRequester.new(page)
68 tmp.add_widget(workdir)
69 layout.add_layout(tmp)
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
83 self.main_widget = page
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
93 :protocol => type.current_text,
95 :path => path.url.path,
96 :workdir => workdir.url.path }
102 class EnginePrefs < KDE::Dialog
103 def initialize(loader, parent)
106 self.caption = KDE.i18n("Configure Engines")
107 self.buttons = KDE::Dialog::Ok | KDE::Dialog::Cancel
108 widget = Qt::Frame.new(self)
110 layout = Qt::HBoxLayout.new(widget)
112 @list = Qt::ListView.new(widget)
113 @list.model = Qt::StringListModel.new(
114 @loader.map{|name, engine| name }, self)
118 @loader.each do |name, engine|
119 @engines[name] = engine
122 layout.add_widget(@list)
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)
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
146 @loader.update_entries(@engines)
153 @list.model.remove_rows(index.row, 1)
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),
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)
182 @engines[engine.name] = engine
183 @list.model.set_data(index, engine.name, Qt::DisplayRole)
190 indexes = @list.selection_model.selection.indexes
191 unless indexes.empty?