Introduced a Manager to centralize plugin/package management

Should have done this from the start.
Will move other relevant scattered functions to this type.
For now it checks if the restart banner needs to show.
Taking into account that a user can toggle between enable
and disable without an actual restart. Even with multiple
plugins.

Contributes to: CURA-8587
This commit is contained in:
Jelle Spijker 2021-12-08 08:06:56 +01:00
parent a61c3e9eff
commit 6c976bc9b0
No known key found for this signature in database
GPG key ID: 6662DC033BE6B99A
4 changed files with 38 additions and 4 deletions

View file

@ -0,0 +1,32 @@
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional
from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal
from cura.CuraApplication import CuraApplication
from UM.PluginRegistry import PluginRegistry
class Manager(QObject):
def __init__(self, parent: Optional[QObject] = None):
super().__init__(parent = parent)
self._manager: "CuraPackageManager" = CuraApplication.getInstance().getPackageManager()
self._plugin_registry: PluginRegistry = CuraApplication.getInstance().getPluginRegistry()
self._manager.installedPackagesChanged.connect(self.checkIfRestartNeeded)
self._plugin_registry.hasPluginsEnabledOrDisabledChanged.connect(self.checkIfRestartNeeded)
self._restart_needed = False
def checkIfRestartNeeded(self):
if self._manager.hasPackagesToRemoveOrInstall or len(self._plugin_registry.getCurrentSessionActivationChangedPlugins()) > 0:
self._restart_needed = True
else:
self._restart_needed = False
self.showRestartNotificationChanged.emit()
showRestartNotificationChanged = pyqtSignal()
@pyqtProperty(bool, notify = showRestartNotificationChanged)
def showRestartNotification(self) -> bool:
return self._restart_needed

View file

@ -13,6 +13,7 @@ from UM.PluginRegistry import PluginRegistry # To find out where we are stored
from .RemotePackageList import RemotePackageList # To register this type with QML. from .RemotePackageList import RemotePackageList # To register this type with QML.
from .LocalPackageList import LocalPackageList # To register this type with QML. from .LocalPackageList import LocalPackageList # To register this type with QML.
from .Manager import Manager # To register this type with QML.
if TYPE_CHECKING: if TYPE_CHECKING:
from PyQt5.QtCore import QObject from PyQt5.QtCore import QObject
@ -30,6 +31,7 @@ class Marketplace(Extension):
qmlRegisterType(RemotePackageList, "Marketplace", 1, 0, "RemotePackageList") qmlRegisterType(RemotePackageList, "Marketplace", 1, 0, "RemotePackageList")
qmlRegisterType(LocalPackageList, "Marketplace", 1, 0, "LocalPackageList") qmlRegisterType(LocalPackageList, "Marketplace", 1, 0, "LocalPackageList")
qmlRegisterType(Manager, "Marketplace", 1, 0, "Manager")
@pyqtSlot() @pyqtSlot()
def show(self) -> None: def show(self) -> None:
@ -44,7 +46,7 @@ class Marketplace(Extension):
if plugin_path is None: if plugin_path is None:
plugin_path = os.path.dirname(__file__) plugin_path = os.path.dirname(__file__)
path = os.path.join(plugin_path, "resources", "qml", "Marketplace.qml") path = os.path.join(plugin_path, "resources", "qml", "Marketplace.qml")
self._window = CuraApplication.getInstance().createQmlComponent(path, {"plugin_registry": self.plugin_registry}) self._window = CuraApplication.getInstance().createQmlComponent(path, {})
if self._window is None: # Still None? Failed to load the QML then. if self._window is None: # Still None? Failed to load the QML then.
return return
self._window.show() self._window.show()

View file

@ -300,8 +300,6 @@ class PackageModel(QObject):
"""The state of the manage Enable Button of this package""" """The state of the manage Enable Button of this package"""
if self._is_enabling == ManageState.PROCESSING: if self._is_enabling == ManageState.PROCESSING:
return "busy" return "busy"
if self._is_recently_enabled:
return "confirmed"
if self._package_type == "material" or not self._is_installed: if self._package_type == "material" or not self._is_installed:
return "hidden" return "hidden"
if self._is_installed and self._is_active: if self._is_installed and self._is_active:

View file

@ -8,11 +8,13 @@ import QtQuick.Window 2.2
import UM 1.2 as UM import UM 1.2 as UM
import Cura 1.6 as Cura import Cura 1.6 as Cura
import Marketplace 1.0 as Marketplace
Window Window
{ {
id: marketplaceDialog id: marketplaceDialog
property variant catalog: UM.I18nCatalog { name: "cura" } property variant catalog: UM.I18nCatalog { name: "cura" }
property variant manager: Marketplace.Manager { }
signal searchStringChanged(string new_search) signal searchStringChanged(string new_search)
@ -232,7 +234,7 @@ Window
{ {
height: quitButton.height + 2 * UM.Theme.getSize("default_margin").width height: quitButton.height + 2 * UM.Theme.getSize("default_margin").width
color: UM.Theme.getColor("primary") color: UM.Theme.getColor("primary")
visible: CuraApplication.getPackageManager().hasPackagesToRemoveOrInstall || plugin_registry.hasPluginsEnabledOrDisabled visible: manager.showRestartNotification
anchors anchors
{ {
left: parent.left left: parent.left