diff --git a/picard/plugin.py b/picard/plugin.py index ae2bdcfa5..84205a750 100644 --- a/picard/plugin.py +++ b/picard/plugin.py @@ -21,6 +21,7 @@ from PyQt4 import QtCore from collections import defaultdict +from functools import partial import imp import json import os.path @@ -366,18 +367,18 @@ class PluginManager(QtCore.QObject): except (OSError, IOError): log.warning("Unable to copy %s to plugin folder %s" % (path, USER_PLUGIN_DIR)) - def query_available_plugins(self): + def query_available_plugins(self, callback=None): self.tagger.xmlws.get( PLUGINS_API['host'], PLUGINS_API['port'], PLUGINS_API['endpoint']['plugins'], - self._plugins_json_loaded, + partial(self._plugins_json_loaded, callback=callback), xml=False, priority=True, important=True ) - def _plugins_json_loaded(self, response, reply, error): + def _plugins_json_loaded(self, response, reply, error, callback=None): if error: self.tagger.window.set_statusbar_message( N_("Error loading plugins list: %(error)s"), @@ -387,6 +388,8 @@ class PluginManager(QtCore.QObject): else: self._available_plugins = [PluginData(data, key) for key, data in json.loads(response)['plugins'].items()] + if callback: + callback() def enabled(self, name): return True diff --git a/picard/ui/options/plugins.py b/picard/ui/options/plugins.py index 2aa2862eb..5f8a39a3f 100644 --- a/picard/ui/options/plugins.py +++ b/picard/ui/options/plugins.py @@ -65,6 +65,7 @@ class PluginsOptionsPage(OptionsPage): self.loader = "file://%s" self.ui.install_plugin.clicked.connect(self.open_plugins) self.ui.folder_open.clicked.connect(self.open_plugin_dir) + self.ui.reload_available_plugins.clicked.connect(self.reload_available_plugins) self.tagger.pluginmanager.plugin_installed.connect(self.plugin_installed) self.ui.plugins.header().setStretchLastSection(False) self.ui.plugins.header().setResizeMode(0, QtGui.QHeaderView.Stretch) @@ -94,6 +95,14 @@ class PluginsOptionsPage(OptionsPage): self.ui.plugins.setCurrentItem(self.ui.plugins.topLevelItem(0)) + def reload_available_plugins(self): + for i, p in self.items.items(): + idx = self.ui.plugins.indexOfTopLevelItem(i) + item = self.ui.plugins.takeTopLevelItem(idx) + del item + self.items = {} + self.tagger.pluginmanager.query_available_plugins(callback=self.load) + def plugin_installed(self, plugin): if not plugin.compatible: msgbox = QtGui.QMessageBox(self) @@ -159,7 +168,10 @@ class PluginsOptionsPage(OptionsPage): config.setting["enabled_plugins"] = enabled_plugins def change_details(self): - plugin = self.items[self.ui.plugins.selectedItems()[0]] + try: + plugin = self.items[self.ui.plugins.selectedItems()[0]] + except IndexError: + return text = [] if plugin.new_version: text.append("" + _("New version available") + ": " + plugin.new_version + "") diff --git a/picard/ui/ui_options_plugins.py b/picard/ui/ui_options_plugins.py index 6c38f9d24..b4f651ad5 100644 --- a/picard/ui/ui_options_plugins.py +++ b/picard/ui/ui_options_plugins.py @@ -8,7 +8,16 @@ from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: - _fromUtf8 = lambda s: s + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) class Ui_PluginsOptionsPage(object): def setupUi(self, PluginsOptionsPage): @@ -54,6 +63,14 @@ class Ui_PluginsOptionsPage(object): self.folder_open.setSizePolicy(sizePolicy) self.folder_open.setObjectName(_fromUtf8("folder_open")) self.horizontalLayout.addWidget(self.folder_open) + self.reload_available_plugins = QtGui.QPushButton(self.groupBox_2) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.reload_available_plugins.sizePolicy().hasHeightForWidth()) + self.reload_available_plugins.setSizePolicy(sizePolicy) + self.reload_available_plugins.setObjectName(_fromUtf8("reload_available_plugins")) + self.horizontalLayout.addWidget(self.reload_available_plugins) self.vboxlayout1.addLayout(self.horizontalLayout) self.groupBox = QtGui.QGroupBox(self.splitter) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) @@ -122,5 +139,6 @@ class Ui_PluginsOptionsPage(object): self.plugins.headerItem().setText(2, _("Status")) self.install_plugin.setText(_("Install plugin...")) self.folder_open.setText(_("Open plugin folder")) + self.reload_available_plugins.setText(_("Reload available plugins")) self.groupBox.setTitle(_("Details")) diff --git a/ui/options_plugins.ui b/ui/options_plugins.ui index 94ab31425..03f9dc336 100644 --- a/ui/options_plugins.ui +++ b/ui/options_plugins.ui @@ -89,6 +89,19 @@ + + + + + 0 + 0 + + + + Reload available plugins + + + @@ -141,7 +154,7 @@ 0 0 - 459 + 469 76