Skip to content

Commit

Permalink
Merge pull request Ultimaker#7091 from Ultimaker/CURA-7200_package_zi…
Browse files Browse the repository at this point in the history
…p_not_found

Fix LicensePresenter: reset state when presenting licenses
  • Loading branch information
Dimitriovski authored Feb 11, 2020
2 parents 277d730 + 72c1b4d commit b9ff66a
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
24 changes: 22 additions & 2 deletions plugins/Toolbox/src/CloudSync/LicensePresenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from PyQt5.QtCore import QObject, pyqtSlot

from UM.Logger import Logger
from UM.PackageManager import PackageManager
from UM.Signal import Signal
from cura.CuraApplication import CuraApplication
Expand All @@ -12,12 +13,19 @@
from .LicenseModel import LicenseModel


## Call present() to show a licenseDialog for a set of packages
# licenseAnswers emits a list of Dicts containing answers when the user has made a choice for all provided packages
class LicensePresenter(QObject):
"""Presents licenses for a set of packages for the user to accept or reject.
Call present() exactly once to show a licenseDialog for a set of packages
Before presenting another set of licenses, create a new instance using resetCopy().
licenseAnswers emits a list of Dicts containing answers when the user has made a choice for all provided packages.
"""

def __init__(self, app: CuraApplication) -> None:
super().__init__()
self._presented = False
"""Whether present() has been called and state is expected to be initialized"""
self._catalog = i18nCatalog("cura")
self._dialog = None # type: Optional[QObject]
self._package_manager = app.getPackageManager() # type: PackageManager
Expand All @@ -39,6 +47,10 @@ def __init__(self, app: CuraApplication) -> None:
# \param plugin_path: Root directory of the Toolbox plugin
# \param packages: Dict[package id, file path]
def present(self, plugin_path: str, packages: Dict[str, Dict[str, str]]) -> None:
if self._presented:
Logger.error("{clazz} is single-use. Create a new {clazz} instead", clazz=self.__class__.__name__)
return

path = os.path.join(plugin_path, self._compatibility_dialog_path)

self._initState(packages)
Expand All @@ -56,6 +68,14 @@ def present(self, plugin_path: str, packages: Dict[str, Dict[str, str]]) -> None
}
self._dialog = self._app.createQmlComponent(path, context_properties)
self._presentCurrentPackage()
self._presented = True

def resetCopy(self) -> "LicensePresenter":
"""Clean up and return a new copy with the same settings such as app"""
if self._dialog:
self._dialog.close()
self.licenseAnswers.disconnectAll()
return LicensePresenter(self._app)

@pyqtSlot()
def onLicenseAccepted(self) -> None:
Expand Down
2 changes: 2 additions & 0 deletions plugins/Toolbox/src/CloudSync/SyncOrchestrator.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ def _onDownloadFinished(self, success_items: Dict[str, Dict[str, str]], error_it
self._showErrorMessage(message)

plugin_path = cast(str, PluginRegistry.getInstance().getPluginPath(self.getPluginId()))
self._license_presenter = self._license_presenter.resetCopy()
self._license_presenter.licenseAnswers.connect(self._onLicenseAnswers)
self._license_presenter.present(plugin_path, success_items)

# Called when user has accepted / declined all licenses for the downloaded packages
Expand Down

0 comments on commit b9ff66a

Please sign in to comment.