From 3fe6170979e2e738d0f65d2905a9e08bcb3884c9 Mon Sep 17 00:00:00 2001 From: lars Date: Wed, 8 Nov 2006 12:19:30 +0000 Subject: [PATCH] improved usability of "plugin_manager" plugin --- plugins/date/date.py | 1 + plugins/disks/disks.py | 3 +- plugins/format_fs/format_fs.py | 1 + plugins/help/help.py | 3 +- .../language_selection/language_selection.py | 3 +- plugins/logs/logs.py | 1 + plugins/network/network.py | 1 + plugins/partition/partition.py | 1 + plugins/plugin-interface.txt | 8 +- plugins/plugin_manager/gtk-ok_nuvola.png | Bin 2838 -> 0 bytes plugins/plugin_manager/gtk-stop_nuvola.png | Bin 2596 -> 0 bytes plugins/plugin_manager/lang/en.hdf | 21 ++-- plugins/plugin_manager/plugin_list.cs | 87 ++++++++++++---- plugins/plugin_manager/plugin_manager.py | 93 +++++++++++++++--- plugins/plugin_manager/tango-go-down.png | Bin 0 -> 2464 bytes plugins/plugin_manager/tango-go-up.png | Bin 0 -> 2491 bytes plugins/shutdown/shutdown.py | 3 +- plugins/system_preferences/show_plugins.cs | 2 +- .../system_preferences/system_preferences.py | 3 +- plugins/user_manager/user_manager.py | 1 + plugins/volume_details/volume_details.py | 1 + plugins/volume_mount/volume_mount.py | 1 + plugins/volume_props/volume_props.py | 1 + 23 files changed, 186 insertions(+), 49 deletions(-) delete mode 100644 plugins/plugin_manager/gtk-ok_nuvola.png delete mode 100644 plugins/plugin_manager/gtk-stop_nuvola.png create mode 100644 plugins/plugin_manager/tango-go-down.png create mode 100644 plugins/plugin_manager/tango-go-up.png diff --git a/plugins/date/date.py b/plugins/date/date.py index 466a81a..6c6e4e3 100644 --- a/plugins/date/date.py +++ b/plugins/date/date.py @@ -4,6 +4,7 @@ import CryptoBoxPlugin class date(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "system" ] + pluginVisibility = [ "preferences" ] requestAuth = False rank = 10 diff --git a/plugins/disks/disks.py b/plugins/disks/disks.py index 5824a72..dddab93 100644 --- a/plugins/disks/disks.py +++ b/plugins/disks/disks.py @@ -2,7 +2,8 @@ import CryptoBoxPlugin class disks(CryptoBoxPlugin.CryptoBoxPlugin): - pluginCapabilities = [ "menu" ] + pluginCapabilities = [ "system" ] + pluginVisibility = [ "menu" ] requestAuth = False rank = 10 diff --git a/plugins/format_fs/format_fs.py b/plugins/format_fs/format_fs.py index a5463d8..3dafed8 100644 --- a/plugins/format_fs/format_fs.py +++ b/plugins/format_fs/format_fs.py @@ -4,6 +4,7 @@ from CryptoBoxExceptions import * class format_fs(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "volume" ] + pluginVisibility = [ "volume" ] requestAuth = True rank = 60 diff --git a/plugins/help/help.py b/plugins/help/help.py index b9c9be5..7381253 100644 --- a/plugins/help/help.py +++ b/plugins/help/help.py @@ -2,7 +2,8 @@ import CryptoBoxPlugin class help(CryptoBoxPlugin.CryptoBoxPlugin): - pluginCapabilities = [ "menu" ] + pluginCapabilities = [ "system" ] + pluginVisibility = [ "menu" ] requestAuth = False rank = 80 diff --git a/plugins/language_selection/language_selection.py b/plugins/language_selection/language_selection.py index 9b28764..7290ce9 100644 --- a/plugins/language_selection/language_selection.py +++ b/plugins/language_selection/language_selection.py @@ -3,7 +3,8 @@ import CryptoBoxPlugin class language_selection(CryptoBoxPlugin.CryptoBoxPlugin): - pluginCapabilities = [ "system", "menu" ] + pluginCapabilities = [ "system" ] + pluginVisibility = [ "menu", "preferences" ] requestAuth = False rank = 60 diff --git a/plugins/logs/logs.py b/plugins/logs/logs.py index 683056a..09b033e 100644 --- a/plugins/logs/logs.py +++ b/plugins/logs/logs.py @@ -4,6 +4,7 @@ import os class logs(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "system" ] + pluginVisibility = [ "preferences" ] requestAuth = False rank = 90 diff --git a/plugins/network/network.py b/plugins/network/network.py index 5d6d0d2..7a6f65f 100644 --- a/plugins/network/network.py +++ b/plugins/network/network.py @@ -10,6 +10,7 @@ CHANGE_IP_DELAY=1 class network(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "system" ] + pluginVisibility = [ "preferences" ] requestAuth = True rank = 30 diff --git a/plugins/partition/partition.py b/plugins/partition/partition.py index 20b2222..723ad48 100644 --- a/plugins/partition/partition.py +++ b/plugins/partition/partition.py @@ -7,6 +7,7 @@ import CryptoBoxPlugin class partition(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "system" ] + pluginVisibility = [ "preferences" ] requestAuth = True rank = 80 diff --git a/plugins/plugin-interface.txt b/plugins/plugin-interface.txt index 3fef72f..7e4e0ee 100644 --- a/plugins/plugin-interface.txt +++ b/plugins/plugin-interface.txt @@ -32,11 +32,13 @@ Python code interface: time (for the "date" plugin)) - the class variable "pluginCapabilities" must be an array of strings (supported: "system" and "volume") + - the class variable "pluginVisibility" may contain one or more of the following items: + menu/preferences/volume. This obviously should fit to the 'pluginCapabilities' variable. + An empty list is interpreted as a disabled plugin. - the class variable "requestAuth" is boolean and defines, if admin authentication is necessary for this plugin - the class variable "rank" is an integer in the range of 0..100 - it determines the order of plugins in listings (lower value -> higher priority) - - the class variable "enabled" is boolean and detemines the default availability of the plugin - volume plugins contain the attribute "device" (you may trust this value - a volume plugin will never get called with an invalid device) - the python module which contains the plugin's class should also contain a class called @@ -50,8 +52,8 @@ Language file structure: Name (a short description) Link (the visible text for links to this plugin) Rank (defines the order of the plugins displayed (0..100)) - - all warnings, error and success messages should be stored below WarningMessage.??? - (resp. ErrorMessage or SuccessMessage) + - all warnings, hints and success messages should be stored below WarningMessage.??? + (resp. AdviceMessage or SuccessMessage) Clearsilver template: diff --git a/plugins/plugin_manager/gtk-ok_nuvola.png b/plugins/plugin_manager/gtk-ok_nuvola.png deleted file mode 100644 index b89792c253801f6ece0378138fdd41eed7ebb6cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2838 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 @@ -22,36 +26,75 @@ +

+ - - - - - - - - +

- - - - + - + - - - - - - + + - -
X-X-X-checked="checked" />checked="checked" /> checked="checked" />
+ + "> + <?cs var:html_escape(Lang.Plugins.plugin_manager.Button.Down) ?> + " > + <?cs var:html_escape(Lang.Plugins.plugin_manager.Button.Up) ?> + + +

+ + +

+ +

+ + + + + + + + + + + + + + + + + + + + + + +
checked="checked" />checked="checked" />checked="checked" /> + "> + <?cs var:html_escape(Lang.Plugins.plugin_manager.Button.Down) ?> + " > + <?cs var:html_escape(Lang.Plugins.plugin_manager.Button.Up) ?> +

@@ -59,3 +102,5 @@

+ + diff --git a/plugins/plugin_manager/plugin_manager.py b/plugins/plugin_manager/plugin_manager.py index 3b6a839..cd6e19b 100644 --- a/plugins/plugin_manager/plugin_manager.py +++ b/plugins/plugin_manager/plugin_manager.py @@ -1,15 +1,30 @@ import CryptoBoxPlugin +import Plugins class plugin_manager(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "system" ] + pluginVisibility = [ "preferences" ] requestAuth = True rank = 90 - def doAction(self, store=None, **args): + def doAction(self, store=None, action=None, plugin_name=None, **args): import re - if store: + if plugin_name: + ## check for invalid characters + if re.search(u'\W', plugin_name): return "plugin_list" + pluginList = Plugins.PluginManager(self.cbox, self.cbox.prefs["Locations"]["PluginDir"]) + plugin = pluginList.getPlugin(plugin_name) + if not plugin: return "plugin_list" + ## take only plugins, that are of the same type as the choosen one + self.plugins = [e for e in pluginList.getPlugins() if e.pluginCapabilities == plugin.pluginCapabilities] + if action == "up": + self.__move_up(plugin) + elif action == "down": + self.__move_down(plugin) + return "plugin_list" + elif store: for key in args.keys(): if key.endswith("_listed"): if not re.search(u'\W',key): @@ -27,26 +42,80 @@ class plugin_manager(CryptoBoxPlugin.CryptoBoxPlugin): return "no status" - def __setConfig(self, name, args): - setting = {} - setting["enabled"] = False + def __sortPlugins(self): + """sort all plugins in the list according to their rank""" + def cmp_func(x,y): + xRank = x.getRank() + yRank = y.getRank() + if xRank < yRank: return -1 + elif xRank == yRank: return 0 + else: return 1 + self.plugins.sort(cmp = cmp_func) + + + def __distributeRanks(self): + """evenly distribute the 'rank' values according to the current order of + the list""" + dist = 100/len(self.plugins) + for index,pl in enumerate(self.plugins): + try: + self.cbox.prefs.pluginConf[pl.getName()]["rank"] = dist*index + except KeyError: + self.cbox.prefs.pluginConf[pl.getName()] = {} + self.cbox.prefs.pluginConf[pl.getName()]["rank"] = dist*index + self.cbox.prefs.pluginConf.write() + + + def __move_up(self, plugin): + self.__sortPlugins() try: - if args[name + "_enabled"]: - setting["enabled"] = True - except KeyError: - pass - setting["rank"] = "80" + index = self.plugins.index(plugin) + ## first elements may not move up + if index == 0: + return + except ValueError: + return + self.plugins.remove(plugin) + self.plugins.insert(index-1, plugin) + self.__distributeRanks() + + + def __move_down(self, plugin): + self.__sortPlugins() + try: + index = self.plugins.index(plugin) + ## last elements may not move down + if index == len(self.plugins) - 1: + return + except ValueError: + return + self.plugins.remove(plugin) + self.plugins.insert(index+1, plugin) + self.__distributeRanks() + + + def __setConfig(self, name, args): + import re + setting = {} + setting["visibility"] = [] + ## look for "_visible_" values and apply them + pattern = re.compile(u'%s_visible_([\w]+)$' % name) + for key in args.keys(): + if key.startswith(name + "_visible_"): + (vis_type, ) = pattern.match(key).groups() + setting["visibility"].append(vis_type) + setting["rank"] = "50" try: r = int(args[name + "_rank"]) if r>=0 and r<=100: setting["rank"] = r - except KeyError, ValueError: + except (KeyError, ValueError): pass setting["requestAuth"] = False try: if args[name + "_auth"]: setting["requestAuth"] = True - except KeyError, ValueError: + except (KeyError, ValueError): pass self.cbox.prefs.pluginConf[name] = setting diff --git a/plugins/plugin_manager/tango-go-down.png b/plugins/plugin_manager/tango-go-down.png new file mode 100644 index 0000000000000000000000000000000000000000..6a8566d60f28f08a7bc32a9de6ee56a7bae88ba0 GIT binary patch literal 2464 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 FV1j`>sV@Kk literal 0 HcmV?d00001 diff --git a/plugins/shutdown/shutdown.py b/plugins/shutdown/shutdown.py index 0638058..8f3773a 100644 --- a/plugins/shutdown/shutdown.py +++ b/plugins/shutdown/shutdown.py @@ -4,7 +4,8 @@ REDIRECT_DELAY = 180 class shutdown(CryptoBoxPlugin.CryptoBoxPlugin): - pluginCapabilities = [ "system", "menu" ] + pluginCapabilities = [ "system" ] + pluginVisibility = [ "preferences", "menu" ] requestAuth = False rank = 90 diff --git a/plugins/system_preferences/show_plugins.cs b/plugins/system_preferences/show_plugins.cs index b39f6a1..a36c9a1 100644 --- a/plugins/system_preferences/show_plugins.cs +++ b/plugins/system_preferences/show_plugins.cs @@ -7,7 +7,7 @@ + ?> diff --git a/plugins/system_preferences/system_preferences.py b/plugins/system_preferences/system_preferences.py index df86e14..cc67c22 100644 --- a/plugins/system_preferences/system_preferences.py +++ b/plugins/system_preferences/system_preferences.py @@ -2,7 +2,8 @@ import CryptoBoxPlugin class system_preferences(CryptoBoxPlugin.CryptoBoxPlugin): - pluginCapabilities = [ "menu" ] + pluginCapabilities = [ "system" ] + pluginVisibility = [ "menu" ] requestAuth = False rank = 20 diff --git a/plugins/user_manager/user_manager.py b/plugins/user_manager/user_manager.py index 088060f..f638ead 100644 --- a/plugins/user_manager/user_manager.py +++ b/plugins/user_manager/user_manager.py @@ -5,6 +5,7 @@ RESERVED_USERS = [ "admin" ] class user_manager(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "system" ] + pluginVisibility = [ "preferences" ] requestAuth = True rank = 45 diff --git a/plugins/volume_details/volume_details.py b/plugins/volume_details/volume_details.py index 40d82db..941ad62 100644 --- a/plugins/volume_details/volume_details.py +++ b/plugins/volume_details/volume_details.py @@ -4,6 +4,7 @@ import CryptoBoxPlugin class volume_details(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "volume" ] + pluginVisibility = [ "volume" ] requestAuth = False rank = 100 diff --git a/plugins/volume_mount/volume_mount.py b/plugins/volume_mount/volume_mount.py index 9d3cbf4..69979c8 100644 --- a/plugins/volume_mount/volume_mount.py +++ b/plugins/volume_mount/volume_mount.py @@ -5,6 +5,7 @@ from CryptoBoxExceptions import * class volume_mount(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "volume" ] + pluginVisibility = [ "volume" ] requestAuth = False rank = 0 diff --git a/plugins/volume_props/volume_props.py b/plugins/volume_props/volume_props.py index 605dc75..6cfcb5d 100644 --- a/plugins/volume_props/volume_props.py +++ b/plugins/volume_props/volume_props.py @@ -5,6 +5,7 @@ from CryptoBoxExceptions import * class volume_props(CryptoBoxPlugin.CryptoBoxPlugin): pluginCapabilities = [ "volume" ] + pluginVisibility = [ "volume" ] requestAuth = False rank = 40