From aaf5b30129307ea2b397ac4080953eb1d553949a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Bili=C5=84ski?= Date: Thu, 19 Jun 2008 12:56:45 +0000 Subject: [PATCH] Added GajimPluginConfigDialog class - dialog that plugins should use to present configuration to user. Now, 'Configure' button is invoked only for plug-ins that have config_dialog. --- data/glade/plugins_window.glade | 4 ++- plugins/acronyms_expander.py | 2 ++ plugins/length_notifier.py | 2 ++ plugins/roster_buttons/plugin.py | 2 ++ src/plugins/gui.py | 57 ++++++++++++++++++++++++++++++-- src/plugins/plugin.py | 22 ++++++++---- 6 files changed, 79 insertions(+), 10 deletions(-) diff --git a/data/glade/plugins_window.glade b/data/glade/plugins_window.glade index 425d77dd7..4830f0c88 100644 --- a/data/glade/plugins_window.glade +++ b/data/glade/plugins_window.glade @@ -1,6 +1,6 @@ - + 650 @@ -242,6 +242,7 @@ True True 0 + True @@ -270,6 +271,7 @@ True True 0 + True diff --git a/plugins/acronyms_expander.py b/plugins/acronyms_expander.py index bca5fd04a..dda47cf17 100644 --- a/plugins/acronyms_expander.py +++ b/plugins/acronyms_expander.py @@ -44,6 +44,8 @@ class AcronymsExpanderPlugin(GajimPlugin): #super(AcronymsExpanderPlugin, self).__init__() def init(self): + self.config_dialog = None + self.gui_extension_points = { 'chat_control_base' : (self.connect_with_chat_control_base, self.disconnect_from_chat_control_base) diff --git a/plugins/length_notifier.py b/plugins/length_notifier.py index 3845d3061..7c14812e5 100644 --- a/plugins/length_notifier.py +++ b/plugins/length_notifier.py @@ -45,6 +45,8 @@ class LengthNotifierPlugin(GajimPlugin): @log_calls('LengthNotifierPlugin') def init(self): + #self.config_dialog = None + self.gui_extension_points = { 'chat_control' : (self.connect_with_chat_control, self.disconnect_from_chat_control) diff --git a/plugins/roster_buttons/plugin.py b/plugins/roster_buttons/plugin.py index 7e5671046..a1aa29482 100644 --- a/plugins/roster_buttons/plugin.py +++ b/plugins/roster_buttons/plugin.py @@ -52,6 +52,8 @@ class RosterButtonsPlugin(GajimPlugin): self.roster_vbox = gajim.interface.roster.xml.get_widget('roster_vbox2') self.show_offline_contacts_menuitem = gajim.interface.roster.xml.get_widget('show_offline_contacts_menuitem') + + self.config_dialog = None @log_calls('RosterButtonsPlugin') def activate(self): diff --git a/src/plugins/gui.py b/src/plugins/gui.py index 8aa0f3f79..5d1576bba 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -117,7 +117,10 @@ class PluginsWindow(object): desc_textbuffer.set_text(plugin.description) self.plugin_description_textview.set_property('sensitive', True) self.uninstall_plugin_button.set_property('sensitive', True) - self.configure_plugin_button.set_property('sensitive', True) + if plugin.config_dialog is None: + self.configure_plugin_button.set_property('sensitive', False) + else: + self.configure_plugin_button.set_property('sensitive', True) def _clear_installed_plugin_info(self): self.plugin_name_label.set_text('') @@ -163,4 +166,54 @@ class PluginsWindow(object): @log_calls('PluginsWindow') def on_close_button_clicked(self, widget): - self.window.destroy() \ No newline at end of file + self.window.destroy() + + @log_calls('PluginsWindow') + def on_configure_plugin_button_clicked(self, widget): + log.debug('widget: %s'%(widget)) + selection = self.installed_plugins_treeview.get_selection() + model, iter = selection.get_selected() + if iter: + plugin = model.get_value(iter, 0) + plugin_name = model.get_value(iter, 1) + is_active = model.get_value(iter, 2) + + + result = plugin.config_dialog.run(self.window) + + else: + # No plugin selected. this should never be reached. As configure + # plugin button should only my clickable when plugin is selected. + # XXX: maybe throw exception here? + pass + + @log_calls('PluginsWindow') + def on_uninstall_plugin_button_clicked(self, widget): + pass + + +class GajimPluginConfigDialog(gtk.Dialog): + + @log_calls('GajimPluginConfigDialog') + def __init__(self, plugin, **kwargs): + # TRANSLATORS: The window title for the generic configuration dialog of plugins + gtk.Dialog.__init__(self, '%s : %s'%(_('Configuration'), plugin.name), **kwargs) + self.plugin = plugin + self.add_button('gtk-close', gtk.RESPONSE_CLOSE) + + self.main = self.child + self.main.set_spacing(3) + + # TRANSLATORS: Short text stating which plugin a configuration dialog is for + label = gtk.Label(_('%s Configuration') % (plugin.name)) + label.set_markup(label.get_label()) + self.main.pack_start(label, False, False) + + @log_calls('GajimPluginConfigDialog') + def run(self, parent=None): + self.reparent(parent) + self.show_all() + result = super(GajimPluginConfigDialog, self).run() + self.hide() + return result + \ No newline at end of file diff --git a/src/plugins/plugin.py b/src/plugins/plugin.py index 1d5c1a9dc..27406edb0 100644 --- a/src/plugins/plugin.py +++ b/src/plugins/plugin.py @@ -27,6 +27,7 @@ Base class for implementing plugin. import os from plugins.helpers import log_calls +from plugins.gui import GajimPluginConfigDialog class GajimPlugin(object): ''' @@ -96,28 +97,29 @@ class GajimPlugin(object): @log_calls('GajimPlugin') def __init__(self): - self.config = Config() + self.config = GajimPluginConfig() ''' Plug-in configuration dictionary. Automatically saved and loaded and plug-in (un)load. - :type: `plugins.plugin.Config` + :type: `plugins.plugin.GajimPluginConfig` ''' self.load_config() + self.config_dialog = GajimPluginConfigDialog(self) self.init() @log_calls('GajimPlugin') def save_config(self): - pass + self.config.save() @log_calls('GajimPlugin') def load_config(self): - pass + self.config.load() @log_calls('GajimPlugin') def __del__(self): - self._save_config() + self.save_config() @log_calls('GajimPlugin') def local_file_path(self, file_name): @@ -135,5 +137,11 @@ class GajimPlugin(object): def deactivate(self): pass -class Config(dict): - pass \ No newline at end of file +class GajimPluginConfig(dict): + @log_calls('GajimPluginConfig') + def save(self): + pass + + @log_calls('GajimPluginConfig') + def load(self): + pass