diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py
index 68e17fd0aa..240621c51e 100644
--- a/src/calibre/customize/ui.py
+++ b/src/calibre/customize/ui.py
@@ -185,6 +185,20 @@ def add_plugin(path_to_zip_file):
initialize_plugins()
return plugin
+def remove_plugin(plugin_or_name):
+ name = getattr(plugin_or_name, 'name', plugin_or_name)
+ plugins = config['plugins']
+ removed = False
+ if name in plugins.keys():
+ removed = True
+ zfp = plugins[name]
+ if os.path.exists(zfp):
+ os.remove(zfp)
+ plugins.pop(name)
+ config['plugins'] = plugins
+ initialize_plugins()
+ return removed
+
def is_disabled(plugin):
return plugin.name in config['disabled_plugins']
@@ -237,6 +251,8 @@ def option_parser():
'''))
parser.add_option('-a', '--add-plugin', default=None,
help=_('Add a plugin by specifying the path to the zip file containing it.'))
+ parser.add_option('-r', '--remove-plugin', default=None,
+ help=_('Remove a custom plugin by name. Has no effect on builtin plugins'))
parser.add_option('--customize-plugin', default=None,
help=_('Customize plugin. Specify name of plugin and customization string separated by a comma.'))
parser.add_option('-l', '--list-plugins', default=False, action='store_true',
@@ -267,6 +283,11 @@ def main(args=sys.argv):
if opts.add_plugin is not None:
plugin = add_plugin(opts.add_plugin)
print 'Plugin added:', plugin.name, plugin.version
+ if opts.remove_plugin is not None:
+ if remove_plugin(opts.remove_plugin):
+ print 'Plugin removed'
+ else:
+ print 'No custom pluginnamed', opts.remove_plugin
if opts.customize_plugin is not None:
name, custom = opts.customize_plugin.split(',')
plugin = find_plugin(name.strip())
diff --git a/src/calibre/gui2/dialogs/config.py b/src/calibre/gui2/dialogs/config.py
index 82b07e81e7..def355d974 100644
--- a/src/calibre/gui2/dialogs/config.py
+++ b/src/calibre/gui2/dialogs/config.py
@@ -20,7 +20,7 @@ from calibre.ebooks.epub.iterator import is_supported
from calibre.library import server_config
from calibre.customize.ui import initialized_plugins, is_disabled, enable_plugin, \
disable_plugin, customize_plugin, \
- plugin_customization, add_plugin
+ plugin_customization, add_plugin, remove_plugin
class PluginModel(QAbstractItemModel):
@@ -242,6 +242,7 @@ class ConfigDialog(QDialog, Ui_Dialog):
self.plugin_view.setModel(self._plugin_model)
self.connect(self.toggle_plugin, SIGNAL('clicked()'), lambda : self.modify_plugin(op='toggle'))
self.connect(self.customize_plugin, SIGNAL('clicked()'), lambda : self.modify_plugin(op='customize'))
+ self.connect(self.remove_plugin, SIGNAL('clicked()'), lambda : self.modify_plugin(op='remove'))
self.connect(self.button_plugin_browse, SIGNAL('clicked()'), self.find_plugin)
self.connect(self.button_plugin_add, SIGNAL('clicked()'), self.add_plugin)
@@ -287,6 +288,13 @@ class ConfigDialog(QDialog, Ui_Dialog):
if ok:
customize_plugin(plugin, unicode(text))
self._plugin_model.refresh_plugin(plugin)
+ if op == 'remove':
+ if remove_plugin(plugin):
+ self._plugin_model.populate()
+ self._plugin_model.reset()
+ else:
+ error_dialog(self, _('Cannot remove builtin plugin'),
+ plugin.name + _(' cannot be removed. It is a builtin plugin. Try disabling it instead.')).exec_()
def up_column(self):
diff --git a/src/calibre/gui2/dialogs/config.ui b/src/calibre/gui2/dialogs/config.ui
index 05b66cac88..99c74fc345 100644
--- a/src/calibre/gui2/dialogs/config.ui
+++ b/src/calibre/gui2/dialogs/config.ui
@@ -72,7 +72,7 @@
- 0
+ 4
@@ -811,6 +811,13 @@
+ -
+
+
+ &Remove plugin
+
+
+
-
diff --git a/src/calibre/trac/donations/server.py b/src/calibre/trac/donations/server.py
index 2472524e95..18771d6fdf 100644
--- a/src/calibre/trac/donations/server.py
+++ b/src/calibre/trac/donations/server.py
@@ -199,7 +199,7 @@ class Server(object):
x = list(range(days-1, -1, -1))
y = stats.daily_totals
ax.plot(x, y)#, align='center', width=20, color='g')
- ax.set_xlabel('Day')
+ ax.set_xlabel('Days ago')
ax.set_ylabel('Income ($)')
ax.hlines([stats.daily_average], 0, days-1)
ax.set_xlim([0, days-1])