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