diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index b8ef535034..cd1c30aaff 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -3,17 +3,19 @@ from UM.Extension import Extension from UM.i18n import i18nCatalog from UM.Logger import Logger +from UM.Qt.ListModel import ListModel +from UM.PluginRegistry import PluginRegistry from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest -from PyQt5.QtCore import QUrl +from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal import json i18n_catalog = i18nCatalog("cura") -class PluginBrowser(Extension): - def __init__(self): +class PluginBrowser(QObject, Extension): + def __init__(self, parent = None): super().__init__() self.addMenuItem(i18n_catalog.i18n("Browse plugins"), self.browsePlugins) self._api_version = 1 @@ -23,6 +25,9 @@ class PluginBrowser(Extension): self._network_manager = None self._plugins_metadata = [] + self._plugins_model = None + + pluginsMetadataChanged = pyqtSignal() def browsePlugins(self): self._createNetworkManager() @@ -34,6 +39,30 @@ class PluginBrowser(Extension): self._plugin_list_request = QNetworkRequest(url) self._network_manager.get(self._plugin_list_request) + @pyqtProperty(QObject, notify=pluginsMetadataChanged) + def pluginsModel(self): + if self._plugins_model is None: + self._plugins_model = ListModel() + self._plugins_model.addRoleName(Qt.UserRole + 1, "name") + self._plugins_model.addRoleName(Qt.UserRole + 2, "version") + self._plugins_model.addRoleName(Qt.UserRole + 3, "short_description") + self._plugins_model.addRoleName(Qt.UserRole + 4, "author") + self._plugins_model.addRoleName(Qt.UserRole + 5, "already_installed") + else: + self._plugins_model.clear() + items = [] + plugin_registry = PluginRegistry.getInstance() + for metadata in self._plugins_metadata: + items.append({ + "name": metadata["label"], + "version": metadata["version"], + "short_description": metadata["short_description"], + "author": metadata["author"], + "already_installed": plugin_registry.getMetaData(metadata["id"]) != {} + }) + self._plugins_model.setItems(items) + return self._plugins_model + def _onRequestFinished(self, reply): reply_url = reply.url().toString() if reply.operation() == QNetworkAccessManager.GetOperation: @@ -41,6 +70,7 @@ class PluginBrowser(Extension): try: json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) self._plugins_metadata = json_data + self.pluginsMetadataChanged.emit() except json.decoder.JSONDecodeError: Logger.log("w", "Received an invalid print job state message: Not valid JSON.") return