From 43657010bae9de322b1d1b8a28df1714d10a54da Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 11 May 2018 08:42:03 +0200 Subject: [PATCH] CURA-5164 The Preferences is not a singleton class anymore since in some point several instances need to be created. - In the ThreeMFWorkspaceReader we need to create some temporal instances of Preferences that makes it not singleton anymore. - The current preferences are kept in the Application class and so all the calls to the preferences are changed to get the preferences from Application. - The method getInstance in Preferences is kept as deprecated since some external plugins. --- cura/CuraApplication.py | 24 +++++------ .../Models/SettingVisibilityPresetsModel.py | 4 +- cura/ObjectsModel.py | 5 +-- cura/PlatformPhysics.py | 9 ++-- cura/PrintInformation.py | 7 ++- cura/Settings/MachineManager.py | 29 ++++++------- plugins/3MFReader/ThreeMFWorkspaceReader.py | 4 +- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 2 +- plugins/AutoSave/AutoSave.py | 9 ++-- plugins/ChangeLogPlugin/ChangeLog.py | 9 ++-- .../CuraEngineBackend/CuraEngineBackend.py | 11 +++-- .../ProcessSlicedLayersJob.py | 3 +- .../FirmwareUpdateChecker.py | 9 ++-- .../FirmwareUpdateCheckerJob.py | 5 +-- plugins/GCodeReader/FlavorParser.py | 5 +-- plugins/GCodeReader/GCodeReader.py | 4 +- .../PerObjectSettingsTool.py | 5 +-- plugins/SimulationView/SimulationView.py | 43 +++++++++---------- plugins/SliceInfoPlugin/SliceInfo.py | 17 ++++---- plugins/SolidView/SolidView.py | 5 +-- .../UM3OutputDevicePlugin.py | 3 +- plugins/UserAgreement/UserAgreement.py | 9 ++-- 22 files changed, 102 insertions(+), 119 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b8c417d8d3..72f2d0af09 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -459,7 +459,7 @@ class CuraApplication(QtApplication): self._container_registry.loadAllMetadata() # set the setting version for Preferences - preferences = Preferences.getInstance() + preferences = self.getPreferences() preferences.addPreference("metadata/setting_version", 0) preferences.setValue("metadata/setting_version", self.SettingVersion) #Don't make it equal to the default so that the setting version always gets written to the file. @@ -484,7 +484,7 @@ class CuraApplication(QtApplication): preferences.addPreference("view/filter_current_build_plate", False) preferences.addPreference("cura/sidebar_collapsed", False) - self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") + self._need_to_show_user_agreement = not self.getPreferences().getValue("general/accepted_user_agreement") for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin @@ -546,7 +546,7 @@ class CuraApplication(QtApplication): def discardOrKeepProfileChanges(self): has_user_interaction = False - choice = Preferences.getInstance().getValue("cura/choice_on_profile_override") + choice = self.getPreferences().getValue("cura/choice_on_profile_override") if choice == "always_discard": # don't show dialog and DISCARD the profile self.discardOrKeepProfileChangesClosed("discard") @@ -597,12 +597,12 @@ class CuraApplication(QtApplication): @pyqtSlot(str, result = QUrl) def getDefaultPath(self, key): - default_path = Preferences.getInstance().getValue("local_file/%s" % key) + default_path = self.getPreferences().getValue("local_file/%s" % key) return QUrl.fromLocalFile(default_path) @pyqtSlot(str, str) def setDefaultPath(self, key, default_path): - Preferences.getInstance().setValue("local_file/%s" % key, QUrl(default_path).toLocalFile()) + self.getPreferences().setValue("local_file/%s" % key, QUrl(default_path).toLocalFile()) ## Handle loading of all plugin types (and the backend explicitly) # \sa PluginRegistry @@ -672,7 +672,7 @@ class CuraApplication(QtApplication): # Initialize setting visibility presets model self._setting_visibility_presets_model = SettingVisibilityPresetsModel(self) default_visibility_profile = self._setting_visibility_presets_model.getItem(0) - Preferences.getInstance().setDefault("general/visible_settings", ";".join(default_visibility_profile["settings"])) + self.getPreferences().setDefault("general/visible_settings", ";".join(default_visibility_profile["settings"])) # Detect in which mode to run and execute that mode if self._is_headless: @@ -934,7 +934,7 @@ class CuraApplication(QtApplication): # Default self.getController().setActiveTool("TranslateTool") - if Preferences.getInstance().getValue("view/center_on_select"): + if self.getPreferences().getValue("view/center_on_select"): self._center_after_select = True else: if self.getController().getActiveTool(): @@ -1329,15 +1329,15 @@ class CuraApplication(QtApplication): categories = list(set(categories)) categories.sort() joined = ";".join(categories) - if joined != Preferences.getInstance().getValue("cura/categories_expanded"): - Preferences.getInstance().setValue("cura/categories_expanded", joined) + if joined != self.getPreferences().getValue("cura/categories_expanded"): + self.getPreferences().setValue("cura/categories_expanded", joined) self.expandedCategoriesChanged.emit() expandedCategoriesChanged = pyqtSignal() @pyqtProperty("QStringList", notify = expandedCategoriesChanged) def expandedCategories(self): - return Preferences.getInstance().getValue("cura/categories_expanded").split(";") + return self.getPreferences().getValue("cura/categories_expanded").split(";") @pyqtSlot() def mergeSelected(self): @@ -1600,8 +1600,8 @@ class CuraApplication(QtApplication): self.fileLoaded.emit(filename) arrange_objects_on_load = ( - not Preferences.getInstance().getValue("cura/use_multi_build_plate") or - not Preferences.getInstance().getValue("cura/not_arrange_objects_on_load")) + not self.getPreferences().getValue("cura/use_multi_build_plate") or + not self.getPreferences().getValue("cura/not_arrange_objects_on_load")) target_build_plate = self.getMultiBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1 root = self.getController().getScene().getRoot() diff --git a/cura/Machines/Models/SettingVisibilityPresetsModel.py b/cura/Machines/Models/SettingVisibilityPresetsModel.py index 8880ac5ce1..3062e83889 100644 --- a/cura/Machines/Models/SettingVisibilityPresetsModel.py +++ b/cura/Machines/Models/SettingVisibilityPresetsModel.py @@ -8,9 +8,9 @@ from configparser import ConfigParser from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal, pyqtSlot +from UM.Application import Application from UM.Logger import Logger from UM.Qt.ListModel import ListModel -from UM.Preferences import Preferences from UM.Resources import Resources from UM.MimeTypeDatabase import MimeTypeDatabase, MimeTypeNotFoundError @@ -33,7 +33,7 @@ class SettingVisibilityPresetsModel(ListModel): basic_item = self.items[1] basic_visibile_settings = ";".join(basic_item["settings"]) - self._preferences = Preferences.getInstance() + self._preferences = Application.getInstance().getPreferences() # Preference to store which preset is currently selected self._preferences.addPreference("cura/active_setting_visibility_preset", "basic") # Preference that stores the "custom" set so it can always be restored (even after a restart) diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py index cfe4320e28..f3c703d424 100644 --- a/cura/ObjectsModel.py +++ b/cura/ObjectsModel.py @@ -8,7 +8,6 @@ from UM.Qt.ListModel import ListModel from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection -from UM.Preferences import Preferences from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -20,7 +19,7 @@ class ObjectsModel(ListModel): super().__init__() Application.getInstance().getController().getScene().sceneChanged.connect(self._updateDelayed) - Preferences.getInstance().preferenceChanged.connect(self._updateDelayed) + Application.getInstance().getPreferences().preferenceChanged.connect(self._updateDelayed) self._update_timer = QTimer() self._update_timer.setInterval(100) @@ -38,7 +37,7 @@ class ObjectsModel(ListModel): def _update(self, *args): nodes = [] - filter_current_build_plate = Preferences.getInstance().getValue("view/filter_current_build_plate") + filter_current_build_plate = Application.getInstance().getPreferences().getValue("view/filter_current_build_plate") active_build_plate_number = self._build_plate_number group_nr = 1 for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 1a5d6ef837..db28478597 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -8,7 +8,6 @@ from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Math.Vector import Vector from UM.Scene.Selection import Selection -from UM.Preferences import Preferences from cura.Scene.ConvexHullDecorator import ConvexHullDecorator @@ -36,8 +35,8 @@ class PlatformPhysics: self._max_overlap_checks = 10 # How many times should we try to find a new spot per tick? self._minimum_gap = 2 # It is a minimum distance (in mm) between two models, applicable for small models - Preferences.getInstance().addPreference("physics/automatic_push_free", True) - Preferences.getInstance().addPreference("physics/automatic_drop_down", True) + Application.getInstance().getPreferences().addPreference("physics/automatic_push_free", True) + Application.getInstance().getPreferences().addPreference("physics/automatic_drop_down", True) def _onSceneChanged(self, source): if not source.getMeshData(): @@ -71,7 +70,7 @@ class PlatformPhysics: # Move it downwards if bottom is above platform move_vector = Vector() - if Preferences.getInstance().getValue("physics/automatic_drop_down") and not (node.getParent() and node.getParent().callDecoration("isGroup") or node.getParent() != root) and node.isEnabled(): #If an object is grouped, don't move it down + if Application.getInstance().getPreferences().getValue("physics/automatic_drop_down") and not (node.getParent() and node.getParent().callDecoration("isGroup") or node.getParent() != root) and node.isEnabled(): #If an object is grouped, don't move it down z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0 move_vector = move_vector.set(y = -bbox.bottom + z_offset) @@ -80,7 +79,7 @@ class PlatformPhysics: node.addDecorator(ConvexHullDecorator()) # only push away objects if this node is a printing mesh - if not node.callDecoration("isNonPrintingMesh") and Preferences.getInstance().getValue("physics/automatic_push_free"): + if not node.callDecoration("isNonPrintingMesh") and Application.getInstance().getPreferences().getValue("physics/automatic_push_free"): # Check for collisions between convex hulls for other_node in BreadthFirstIterator(root): # Ignore root, ourselves and anything that is not a normal SceneNode. diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 8c897230d5..debc765084 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -12,7 +12,6 @@ from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty, pyqtSlot from UM.i18n import i18nCatalog from UM.Logger import Logger -from UM.Preferences import Preferences from UM.Qt.Duration import Duration from UM.Scene.SceneNode import SceneNode @@ -80,7 +79,7 @@ class PrintInformation(QObject): self._application.workspaceLoaded.connect(self.setProjectName) self._multi_build_plate_model.activeBuildPlateChanged.connect(self._onActiveBuildPlateChanged) - Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) + self._application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferencesChanged) self._application.getMachineManager().rootMaterialChanged.connect(self._onActiveMaterialsChanged) self._onActiveMaterialsChanged() @@ -208,7 +207,7 @@ class PrintInformation(QObject): self._material_costs[build_plate_number] = [] self._material_names[build_plate_number] = [] - material_preference_values = json.loads(Preferences.getInstance().getValue("cura/material_settings")) + material_preference_values = json.loads(self._application.getInstance().getPreferences().getValue("cura/material_settings")) extruder_stacks = global_stack.extruders for position, extruder_stack in extruder_stacks.items(): @@ -299,7 +298,7 @@ class PrintInformation(QObject): self._setAbbreviatedMachineName() if self._pre_sliced: self._job_name = catalog.i18nc("@label", "Pre-sliced file {0}", base_name) - elif Preferences.getInstance().getValue("cura/jobname_prefix"): + elif self._application.getInstance().getPreferences().getValue("cura/jobname_prefix"): # Don't add abbreviation if it already has the exact same abbreviation. if base_name.startswith(self._abbr_machine + "_"): self._job_name = base_name diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 436f9814db..8943734f3e 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -16,7 +16,6 @@ from UM.FlameProfiler import pyqtSlot from UM import Util from UM.Application import Application -from UM.Preferences import Preferences from UM.Logger import Logger from UM.Message import Message @@ -97,12 +96,12 @@ class MachineManager(QObject): ExtruderManager.getInstance().activeExtruderChanged.connect(self.activeStackChanged) self.activeStackChanged.connect(self.activeStackValueChanged) - Preferences.getInstance().addPreference("cura/active_machine", "") + self._application.getPreferences().addPreference("cura/active_machine", "") self._global_event_keys = set() self._printer_output_devices = [] # type: List[PrinterOutputDevice] - Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + self._application.getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) # There might already be some output devices by the time the signal is connected self._onOutputDevicesChanged() @@ -163,7 +162,7 @@ class MachineManager(QObject): rootMaterialChanged = pyqtSignal() def setInitialActiveMachine(self) -> None: - active_machine_id = Preferences.getInstance().getValue("cura/active_machine") + active_machine_id = self._application.getPreferences().getValue("cura/active_machine") if active_machine_id != "" and ContainerRegistry.getInstance().findContainerStacksMetadata(id = active_machine_id): # An active machine was saved, so restore it. self.setActiveMachine(active_machine_id) @@ -172,7 +171,7 @@ class MachineManager(QObject): def _onOutputDevicesChanged(self) -> None: self._printer_output_devices = [] - for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): + for printer_output_device in self._application.getOutputDeviceManager().getOutputDevices(): if isinstance(printer_output_device, PrinterOutputDevice): self._printer_output_devices.append(printer_output_device) @@ -239,7 +238,7 @@ class MachineManager(QObject): extruder_stack.containersChanged.disconnect(self._onContainersChanged) # Update the local global container stack reference - self._global_container_stack = Application.getInstance().getGlobalContainerStack() + self._global_container_stack = self._application.getGlobalContainerStack() if self._global_container_stack: self.updateDefaultExtruder() self.updateNumberExtrudersEnabled() @@ -247,7 +246,7 @@ class MachineManager(QObject): # after switching the global stack we reconnect all the signals and set the variant and material references if self._global_container_stack: - Preferences.getInstance().setValue("cura/active_machine", self._global_container_stack.getId()) + self._application.getPreferences().setValue("cura/active_machine", self._global_container_stack.getId()) self._global_container_stack.nameChanged.connect(self._onMachineNameChanged) self._global_container_stack.containersChanged.connect(self._onContainersChanged) @@ -271,7 +270,7 @@ class MachineManager(QObject): if self._global_container_stack.getId() in self.machine_extruder_material_update_dict: for func in self.machine_extruder_material_update_dict[self._global_container_stack.getId()]: - Application.getInstance().callLater(func) + self._application.callLater(func) del self.machine_extruder_material_update_dict[self._global_container_stack.getId()] self.activeQualityGroupChanged.emit() @@ -361,7 +360,7 @@ class MachineManager(QObject): global_stack = containers[0] ExtruderManager.getInstance().setActiveExtruderIndex(0) # Switch to first extruder self._global_container_stack = global_stack - Application.getInstance().setGlobalContainerStack(global_stack) + self._application.setGlobalContainerStack(global_stack) ExtruderManager.getInstance()._globalContainerStackChanged() self._initMachineState(containers[0]) self._onGlobalContainerChanged() @@ -835,7 +834,7 @@ class MachineManager(QObject): ## Set the amount of extruders on the active machine (global stack) # \param extruder_count int the number of extruders to set def setActiveMachineExtruderCount(self, extruder_count: int) -> None: - extruder_manager = Application.getInstance().getExtruderManager() + extruder_manager = self._application.getExtruderManager() definition_changes_container = self._global_container_stack.definitionChanges if not self._global_container_stack or definition_changes_container == self._empty_definition_changes_container: @@ -852,7 +851,7 @@ class MachineManager(QObject): self.correctExtruderSettings() # Check to see if any objects are set to print with an extruder that will no longer exist - root_node = Application.getInstance().getController().getScene().getRoot() + root_node = self._application.getController().getScene().getRoot() for node in DepthFirstIterator(root_node): if node.getMeshData(): extruder_nr = node.callDecoration("getActiveExtruderPosition") @@ -885,7 +884,7 @@ class MachineManager(QObject): global_user_container.removeInstance(setting_key) # Signal that the global stack has changed - Application.getInstance().globalContainerStackChanged.emit() + self._application.globalContainerStackChanged.emit() self.forceUpdateAllSettings() @pyqtSlot(int, result = QObject) @@ -1117,7 +1116,7 @@ class MachineManager(QObject): def _setGlobalVariant(self, container_node): self._global_container_stack.variant = container_node.getContainer() if not self._global_container_stack.variant: - self._global_container_stack.variant = Application.getInstance().empty_variant_container + self._global_container_stack.variant = self._application.empty_variant_container def _setMaterial(self, position, container_node = None): if container_node and container_node.getContainer(): @@ -1359,7 +1358,7 @@ class MachineManager(QObject): self._setQualityGroup(quality_group) # See if we need to show the Discard or Keep changes screen - if not no_dialog and self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: + if not no_dialog and self.hasUserSettings and self._application.getPreferences().getValue("cura/active_mode") == 1: self._application.discardOrKeepProfileChanges() @pyqtProperty(QObject, fset = setQualityGroup, notify = activeQualityGroupChanged) @@ -1373,7 +1372,7 @@ class MachineManager(QObject): self._setQualityChangesGroup(quality_changes_group) # See if we need to show the Discard or Keep changes screen - if not no_dialog and self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: + if not no_dialog and self.hasUserSettings and self._application.getPreferences().getValue("cura/active_mode") == 1: self._application.discardOrKeepProfileChanges() @pyqtSlot() diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 5cd0ef5ced..8eecc3b5d9 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -456,7 +456,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): num_visible_settings = len(visible_settings_string.split(";")) active_mode = temp_preferences.getValue("cura/active_mode") if not active_mode: - active_mode = Preferences.getInstance().getValue("cura/active_mode") + active_mode = Application.getInstance().getPreferences().getValue("cura/active_mode") except KeyError: # If there is no preferences file, it's not a workspace, so notify user of failure. Logger.log("w", "File %s is not a valid workspace.", file_name) @@ -575,7 +575,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): temp_preferences.deserialize(serialized) # Copy a number of settings from the temp preferences to the global - global_preferences = Preferences.getInstance() + global_preferences = application.getInstance().getPreferences() visible_settings = temp_preferences.getValue("general/visible_settings") if visible_settings is None: diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index e948f62337..33df0bfe90 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -51,7 +51,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): self._writeContainerToArchive(container, archive) # Write preferences to archive - original_preferences = Preferences.getInstance() #Copy only the preferences that we use to the workspace. + original_preferences = Application.getInstance().getPreferences() #Copy only the preferences that we use to the workspace. temp_preferences = Preferences() for preference in {"general/visible_settings", "cura/active_mode", "cura/categories_expanded"}: temp_preferences.addPreference(preference, None) diff --git a/plugins/AutoSave/AutoSave.py b/plugins/AutoSave/AutoSave.py index 5fdac502b5..5025cc563c 100644 --- a/plugins/AutoSave/AutoSave.py +++ b/plugins/AutoSave/AutoSave.py @@ -4,7 +4,6 @@ from PyQt5.QtCore import QTimer from UM.Extension import Extension -from UM.Preferences import Preferences from UM.Application import Application from UM.Resources import Resources from UM.Logger import Logger @@ -14,14 +13,14 @@ class AutoSave(Extension): def __init__(self): super().__init__() - Preferences.getInstance().preferenceChanged.connect(self._triggerTimer) + Application.getInstance().getPreferences().preferenceChanged.connect(self._triggerTimer) self._global_stack = None - Preferences.getInstance().addPreference("cura/autosave_delay", 1000 * 10) + Application.getInstance().getPreferences().addPreference("cura/autosave_delay", 1000 * 10) self._change_timer = QTimer() - self._change_timer.setInterval(Preferences.getInstance().getValue("cura/autosave_delay")) + self._change_timer.setInterval(Application.getInstance().getPreferences().getValue("cura/autosave_delay")) self._change_timer.setSingleShot(True) self._saving = False @@ -72,6 +71,6 @@ class AutoSave(Extension): Application.getInstance().saveSettings() - Preferences.getInstance().writeToFile(Resources.getStoragePath(Resources.Preferences, Application.getInstance().getApplicationName() + ".cfg")) + Application.getInstance().getPreferences().writeToFile(Resources.getStoragePath(Resources.Preferences, Application.getInstance().getApplicationName() + ".cfg")) self._saving = False diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py index 030d854d3f..e93d5c4395 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.py +++ b/plugins/ChangeLogPlugin/ChangeLog.py @@ -3,7 +3,6 @@ from UM.i18n import i18nCatalog from UM.Extension import Extension -from UM.Preferences import Preferences from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Version import Version @@ -29,7 +28,7 @@ class ChangeLog(Extension, QObject,): self._change_logs = None Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) - Preferences.getInstance().addPreference("general/latest_version_changelog_shown", "2.0.0") #First version of CURA with uranium + Application.getInstance().getPreferences().addPreference("general/latest_version_changelog_shown", "2.0.0") #First version of CURA with uranium self.addMenuItem(catalog.i18nc("@item:inmenu", "Show Changelog"), self.showChangelog) def getChangeLogs(self): @@ -79,12 +78,12 @@ class ChangeLog(Extension, QObject,): if not self._current_app_version: return #We're on dev branch. - if Preferences.getInstance().getValue("general/latest_version_changelog_shown") == "master": + if Application.getInstance().getPreferences().getValue("general/latest_version_changelog_shown") == "master": latest_version_shown = Version("0.0.0") else: - latest_version_shown = Version(Preferences.getInstance().getValue("general/latest_version_changelog_shown")) + latest_version_shown = Version(Application.getInstance().getPreferences().getValue("general/latest_version_changelog_shown")) - Preferences.getInstance().setValue("general/latest_version_changelog_shown", Application.getInstance().getVersion()) + Application.getInstance().getPreferences().setValue("general/latest_version_changelog_shown", Application.getInstance().getVersion()) # Do not show the changelog when there is no global container stack # This implies we are running Cura for the first time. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 111b253dd8..d298ff1aca 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -4,7 +4,6 @@ from UM.Backend.Backend import Backend, BackendState from UM.Application import Application from UM.Scene.SceneNode import SceneNode -from UM.Preferences import Preferences from UM.Signal import Signal from UM.Logger import Logger from UM.Message import Message @@ -72,7 +71,7 @@ class CuraEngineBackend(QObject, Backend): Logger.log("i", "Found CuraEngine at: %s", default_engine_location) default_engine_location = os.path.abspath(default_engine_location) - Preferences.getInstance().addPreference("backend/location", default_engine_location) + Application.getInstance().getPreferences().addPreference("backend/location", default_engine_location) # Workaround to disable layer view processing if layer view is not active. self._layer_view_active = False @@ -121,7 +120,7 @@ class CuraEngineBackend(QObject, Backend): self._slice_start_time = None self._is_disabled = False - Preferences.getInstance().addPreference("general/auto_slice", False) + Application.getInstance().getPreferences().addPreference("general/auto_slice", False) self._use_timer = False # When you update a setting and other settings get changed through inheritance, many propertyChanged signals are fired. @@ -131,7 +130,7 @@ class CuraEngineBackend(QObject, Backend): self._change_timer.setSingleShot(True) self._change_timer.setInterval(500) self.determineAutoSlicing() - Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) + Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferencesChanged) self._application.initializationFinished.connect(self.initialize) @@ -170,7 +169,7 @@ class CuraEngineBackend(QObject, Backend): # \return list of commands and args / parameters. def getEngineCommand(self): json_path = Resources.getPath(Resources.DefinitionContainers, "fdmprinter.def.json") - return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, ""] + return [Application.getInstance().getPreferences().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, ""] ## Emitted when we get a message containing print duration and material amount. # This also implies the slicing has finished. @@ -408,7 +407,7 @@ class CuraEngineBackend(QObject, Backend): enable_timer = True self._is_disabled = False - if not Preferences.getInstance().getValue("general/auto_slice"): + if not Application.getInstance().getPreferences().getValue("general/auto_slice"): enable_timer = False for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("isBlockSlicing"): diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index cbc097bb33..3bd6d79198 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -6,7 +6,6 @@ import gc from UM.Job import Job from UM.Application import Application from UM.Mesh.MeshData import MeshData -from UM.Preferences import Preferences from UM.View.GL.OpenGLContext import OpenGLContext from UM.Message import Message @@ -199,7 +198,7 @@ class ProcessSlicedLayersJob(Job): material_color_map[0, :] = color # We have to scale the colors for compatibility mode - if OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")): + if OpenGLContext.isLegacyOpenGL() or bool(Application.getInstance().getPreferences().getValue("view/force_layer_view_compatibility_mode")): line_type_brightness = 0.5 # for compatibility mode else: line_type_brightness = 1.0 diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 23a040f2e2..982f9d0b24 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -5,8 +5,7 @@ from PyQt5.QtCore import QUrl from PyQt5.QtGui import QDesktopServices from UM.Extension import Extension -from UM.Preferences import Preferences -from UM.Logger import Logger +from UM.Application import Application from UM.i18n import i18nCatalog from cura.Settings.GlobalStack import GlobalStack @@ -27,12 +26,12 @@ class FirmwareUpdateChecker(Extension): # Initialize the Preference called `latest_checked_firmware` that stores the last version # checked for the UM3. In the future if we need to check other printers' firmware - Preferences.getInstance().addPreference("info/latest_checked_firmware", "") + Application.getInstance().getPreferences().addPreference("info/latest_checked_firmware", "") # Listen to a Signal that indicates a change in the list of printers, just if the user has enabled the # 'check for updates' option - Preferences.getInstance().addPreference("info/automatic_update_check", True) - if Preferences.getInstance().getValue("info/automatic_update_check"): + Application.getInstance().getPreferences().addPreference("info/automatic_update_check", True) + if Application.getInstance().getPreferences().getValue("info/automatic_update_check"): ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) self._download_url = None diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 66ee43209f..c3b766e7b9 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -1,7 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from UM.Preferences import Preferences from UM.Application import Application from UM.Message import Message from UM.Logger import Logger @@ -51,11 +50,11 @@ class FirmwareUpdateCheckerJob(Job): current_version = reader(current_version_file).readline().rstrip() # If it is the first time the version is checked, the checked_version is '' - checked_version = Preferences.getInstance().getValue("info/latest_checked_firmware") + checked_version = Application.getInstance().getPreferences().getValue("info/latest_checked_firmware") # If the checked_version is '', it's because is the first time we check firmware and in this case # we will not show the notification, but we will store it for the next time - Preferences.getInstance().setValue("info/latest_checked_firmware", current_version) + Application.getInstance().getPreferences().setValue("info/latest_checked_firmware", current_version) Logger.log("i", "Reading firmware version of %s: checked = %s - latest = %s", machine_name, checked_version, current_version) # The first time we want to store the current version, the notification will not be shown, diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index 2679cc23a4..ceb5fbdb5d 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -10,7 +10,6 @@ from UM.Math.Vector import Vector from UM.Message import Message from cura.Scene.CuraSceneNode import CuraSceneNode from UM.i18n import i18nCatalog -from UM.Preferences import Preferences catalog = i18nCatalog("cura") @@ -43,7 +42,7 @@ class FlavorParser: self._current_layer_thickness = 0.2 # default self._filament_diameter = 2.85 # default - Preferences.getInstance().addPreference("gcodereader/show_caution", True) + Application.getInstance().getPreferences().addPreference("gcodereader/show_caution", True) def _clearValues(self): self._extruder_number = 0 @@ -462,7 +461,7 @@ class FlavorParser: Logger.log("d", "GCode loading finished") - if Preferences.getInstance().getValue("gcodereader/show_caution"): + if Application.getInstance().getPreferences().getValue("gcodereader/show_caution"): caution_message = Message(catalog.i18nc( "@info:generic", "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."), diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 6f872bc6f7..b821fa2cb3 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -4,7 +4,7 @@ from UM.FileHandler.FileReader import FileReader from UM.Mesh.MeshReader import MeshReader from UM.i18n import i18nCatalog -from UM.Preferences import Preferences +from UM.Application import Application catalog = i18nCatalog("cura") from . import MarlinFlavorParser, RepRapFlavorParser @@ -22,7 +22,7 @@ class GCodeReader(MeshReader): self._supported_extensions = [".gcode", ".g"] self._flavor_reader = None - Preferences.getInstance().addPreference("gcodereader/show_caution", True) + Application.getInstance().getPreferences().addPreference("gcodereader/show_caution", True) def preReadFromStream(self, stream, *args, **kwargs): for line in stream.split("\n"): diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index d2db5ff420..baa700165c 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -5,7 +5,6 @@ from UM.Tool import Tool from UM.Scene.Selection import Selection from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Application import Application -from UM.Preferences import Preferences from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator from cura.Settings.ExtruderManager import ExtruderManager from UM.Settings.SettingInstance import SettingInstance @@ -27,7 +26,7 @@ class PerObjectSettingsTool(Tool): Selection.selectionChanged.connect(self.propertyChanged) - Preferences.getInstance().preferenceChanged.connect(self._onPreferenceChanged) + Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferenceChanged) self._onPreferenceChanged("cura/active_mode") Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) @@ -106,7 +105,7 @@ class PerObjectSettingsTool(Tool): def _onPreferenceChanged(self, preference): if preference == "cura/active_mode": - self._advanced_mode = Preferences.getInstance().getValue(preference) == 1 + self._advanced_mode = Application.getInstance().getPreferences().getValue(preference) == 1 self._updateEnabled() def _onGlobalContainerChanged(self): diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 85849efb2f..44643dbf1c 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -16,7 +16,6 @@ from UM.Mesh.MeshBuilder import MeshBuilder from UM.Message import Message from UM.Platform import Platform from UM.PluginRegistry import PluginRegistry -from UM.Preferences import Preferences from UM.Resources import Resources from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.Selection import Selection @@ -81,30 +80,30 @@ class SimulationView(View): self._show_travel_moves = False self._nozzle_node = None - Preferences.getInstance().addPreference("view/top_layer_count", 5) - Preferences.getInstance().addPreference("view/only_show_top_layers", False) - Preferences.getInstance().addPreference("view/force_layer_view_compatibility_mode", False) + Application.getInstance().getPreferences().addPreference("view/top_layer_count", 5) + Application.getInstance().getPreferences().addPreference("view/only_show_top_layers", False) + Application.getInstance().getPreferences().addPreference("view/force_layer_view_compatibility_mode", False) - Preferences.getInstance().addPreference("layerview/layer_view_type", 0) - Preferences.getInstance().addPreference("layerview/extruder_opacities", "") + Application.getInstance().getPreferences().addPreference("layerview/layer_view_type", 0) + Application.getInstance().getPreferences().addPreference("layerview/extruder_opacities", "") - Preferences.getInstance().addPreference("layerview/show_travel_moves", False) - Preferences.getInstance().addPreference("layerview/show_helpers", True) - Preferences.getInstance().addPreference("layerview/show_skin", True) - Preferences.getInstance().addPreference("layerview/show_infill", True) + Application.getInstance().getPreferences().addPreference("layerview/show_travel_moves", False) + Application.getInstance().getPreferences().addPreference("layerview/show_helpers", True) + Application.getInstance().getPreferences().addPreference("layerview/show_skin", True) + Application.getInstance().getPreferences().addPreference("layerview/show_infill", True) - Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) + Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferencesChanged) self._updateWithPreferences() - self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) - self._only_show_top_layers = bool(Preferences.getInstance().getValue("view/only_show_top_layers")) + self._solid_layers = int(Application.getInstance().getPreferences().getValue("view/top_layer_count")) + self._only_show_top_layers = bool(Application.getInstance().getPreferences().getValue("view/only_show_top_layers")) self._compatibility_mode = self._evaluateCompatibilityMode() self._wireprint_warning_message = Message(catalog.i18nc("@info:status", "Cura does not accurately display layers when Wire Printing is enabled"), title = catalog.i18nc("@info:title", "Simulation View")) def _evaluateCompatibilityMode(self): - return OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) + return OpenGLContext.isLegacyOpenGL() or bool(Application.getInstance().getPreferences().getValue("view/force_layer_view_compatibility_mode")) def _resetSettings(self): self._layer_view_type = 0 # 0 is material color, 1 is color by linetype, 2 is speed, 3 is layer thickness @@ -543,23 +542,23 @@ class SimulationView(View): self._top_layers_job = None def _updateWithPreferences(self): - self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) - self._only_show_top_layers = bool(Preferences.getInstance().getValue("view/only_show_top_layers")) + self._solid_layers = int(Application.getInstance().getPreferences().getValue("view/top_layer_count")) + self._only_show_top_layers = bool(Application.getInstance().getPreferences().getValue("view/only_show_top_layers")) self._compatibility_mode = self._evaluateCompatibilityMode() - self.setSimulationViewType(int(float(Preferences.getInstance().getValue("layerview/layer_view_type")))); + self.setSimulationViewType(int(float(Application.getInstance().getPreferences().getValue("layerview/layer_view_type")))); - for extruder_nr, extruder_opacity in enumerate(Preferences.getInstance().getValue("layerview/extruder_opacities").split("|")): + for extruder_nr, extruder_opacity in enumerate(Application.getInstance().getPreferences().getValue("layerview/extruder_opacities").split("|")): try: opacity = float(extruder_opacity) except ValueError: opacity = 1.0 self.setExtruderOpacity(extruder_nr, opacity) - self.setShowTravelMoves(bool(Preferences.getInstance().getValue("layerview/show_travel_moves"))) - self.setShowHelpers(bool(Preferences.getInstance().getValue("layerview/show_helpers"))) - self.setShowSkin(bool(Preferences.getInstance().getValue("layerview/show_skin"))) - self.setShowInfill(bool(Preferences.getInstance().getValue("layerview/show_infill"))) + self.setShowTravelMoves(bool(Application.getInstance().getPreferences().getValue("layerview/show_travel_moves"))) + self.setShowHelpers(bool(Application.getInstance().getPreferences().getValue("layerview/show_helpers"))) + self.setShowSkin(bool(Application.getInstance().getPreferences().getValue("layerview/show_skin"))) + self.setShowInfill(bool(Application.getInstance().getPreferences().getValue("layerview/show_infill"))) self._startUpdateTopLayers() self.preferencesChanged.emit() diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 82e07da464..d32e512e4f 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -10,7 +10,6 @@ from PyQt5.QtCore import pyqtSlot, QObject from UM.Extension import Extension from UM.Application import Application -from UM.Preferences import Preferences from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Message import Message from UM.i18n import i18nCatalog @@ -34,13 +33,13 @@ class SliceInfo(QObject, Extension): QObject.__init__(self, parent) Extension.__init__(self) Application.getInstance().getOutputDeviceManager().writeStarted.connect(self._onWriteStarted) - Preferences.getInstance().addPreference("info/send_slice_info", True) - Preferences.getInstance().addPreference("info/asked_send_slice_info", False) + Application.getInstance().getPreferences().addPreference("info/send_slice_info", True) + Application.getInstance().getPreferences().addPreference("info/asked_send_slice_info", False) self._more_info_dialog = None self._example_data_content = None - if not Preferences.getInstance().getValue("info/asked_send_slice_info"): + if not Application.getInstance().getPreferences().getValue("info/asked_send_slice_info"): self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymized usage statistics."), lifetime = 0, dismissable = False, @@ -62,7 +61,7 @@ class SliceInfo(QObject, Extension): ## Perform action based on user input. # Note that clicking "Disable" won't actually disable the data sending, but rather take the user to preferences where they can disable it. def messageActionTriggered(self, message_id, action_id): - Preferences.getInstance().setValue("info/asked_send_slice_info", True) + Application.getInstance().getPreferences().setValue("info/asked_send_slice_info", True) if action_id == "MoreInfo": self.showMoreInfoDialog() self.send_slice_info_message.hide() @@ -88,11 +87,11 @@ class SliceInfo(QObject, Extension): @pyqtSlot(bool) def setSendSliceInfo(self, enabled: bool): - Preferences.getInstance().setValue("info/send_slice_info", enabled) + Application.getInstance().getPreferences().setValue("info/send_slice_info", enabled) def _onWriteStarted(self, output_device): try: - if not Preferences.getInstance().getValue("info/send_slice_info"): + if not Application.getInstance().getPreferences().getValue("info/send_slice_info"): Logger.log("d", "'info/send_slice_info' is turned off.") return # Do nothing, user does not want to send data @@ -107,7 +106,7 @@ class SliceInfo(QObject, Extension): data["schema_version"] = 0 data["cura_version"] = application.getVersion() - active_mode = Preferences.getInstance().getValue("cura/active_mode") + active_mode = Application.getInstance().getPreferences().getValue("cura/active_mode") if active_mode == 0: data["active_mode"] = "recommended" else: @@ -122,7 +121,7 @@ class SliceInfo(QObject, Extension): machine_settings_changed_by_user = True data["machine_settings_changed_by_user"] = machine_settings_changed_by_user - data["language"] = Preferences.getInstance().getValue("general/language") + data["language"] = Application.getInstance().getPreferences().getValue("general/language") data["os"] = {"type": platform.system(), "version": platform.version()} data["active_machine"] = {"definition_id": global_stack.definition.getId(), diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 8892ddb138..b9ad5c8829 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -6,7 +6,6 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.Selection import Selection from UM.Resources import Resources from UM.Application import Application -from UM.Preferences import Preferences from UM.View.RenderBatch import RenderBatch from UM.Settings.Validator import ValidatorState from UM.Math.Color import Color @@ -23,7 +22,7 @@ class SolidView(View): def __init__(self): super().__init__() - Preferences.getInstance().addPreference("view/show_overhang", True) + Application.getInstance().getPreferences().addPreference("view/show_overhang", True) self._enabled_shader = None self._disabled_shader = None @@ -65,7 +64,7 @@ class SolidView(View): support_extruder_nr = global_container_stack.getExtruderPositionValueWithDefault("support_extruder_nr") support_angle_stack = Application.getInstance().getExtruderManager().getExtruderStack(support_extruder_nr) - if support_angle_stack is not None and Preferences.getInstance().getValue("view/show_overhang"): + if support_angle_stack is not None and Application.getInstance().getPreferences().getValue("view/show_overhang"): angle = support_angle_stack.getProperty("support_angle", "value") # Make sure the overhang angle is valid before passing it to the shader # Note: if the overhang angle is set to its default value, it does not need to get validated (validationState = None) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 2add388db6..ac011a5557 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -5,7 +5,6 @@ from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin from UM.Logger import Logger from UM.Application import Application from UM.Signal import Signal, signalemitter -from UM.Preferences import Preferences from UM.Version import Version from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice @@ -54,7 +53,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/" # Get list of manual instances from preferences - self._preferences = Preferences.getInstance() + self._preferences = Application.getInstance().getPreferences() self._preferences.addPreference("um3networkprinting/manual_instances", "") # A comma-separated list of ip adresses or hostnames diff --git a/plugins/UserAgreement/UserAgreement.py b/plugins/UserAgreement/UserAgreement.py index 915c1761fa..30b2c00f08 100644 --- a/plugins/UserAgreement/UserAgreement.py +++ b/plugins/UserAgreement/UserAgreement.py @@ -2,7 +2,6 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.Extension import Extension -from UM.Preferences import Preferences from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Logger import Logger @@ -19,10 +18,10 @@ class UserAgreement(QObject, Extension): self._user_agreement_window = None self._user_agreement_context = None Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) - Preferences.getInstance().addPreference("general/accepted_user_agreement", False) + Application.getInstance().getPreferences().addPreference("general/accepted_user_agreement", False) def _onEngineCreated(self): - if not Preferences.getInstance().getValue("general/accepted_user_agreement"): + if not Application.getInstance().getPreferences().getValue("general/accepted_user_agreement"): self.showUserAgreement() def showUserAgreement(self): @@ -35,11 +34,11 @@ class UserAgreement(QObject, Extension): def didAgree(self, user_choice): if user_choice: Logger.log("i", "User agreed to the user agreement") - Preferences.getInstance().setValue("general/accepted_user_agreement", True) + Application.getInstance().getPreferences().setValue("general/accepted_user_agreement", True) self._user_agreement_window.hide() else: Logger.log("i", "User did NOT agree to the user agreement") - Preferences.getInstance().setValue("general/accepted_user_agreement", False) + Application.getInstance().getPreferences().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() CuraApplication.getInstance().setNeedToShowUserAgreement(False)