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 | 77 ++++++++++++---
plugins/plugin_manager/plugin_manager.py | 91 +++++++++++++++---
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, 180 insertions(+), 43 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 @@
+
+
-
@@ -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 __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:
+ 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["enabled"] = False
- try:
- if args[name + "_enabled"]:
- setting["enabled"] = True
- except KeyError:
- pass
- setting["rank"] = "80"
+ 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