Fix AutoSave conflicts with BackupManager

- Move AutoSave out of the plugins. It's a built-in module now.
 - Add enable/disable saving data on CuraApplication.
 - Avoid saving data in backup restore
This commit is contained in:
Lipu Fei 2018-05-23 11:24:33 +02:00
parent 41aa31cb2d
commit cfd1b7b813
5 changed files with 22 additions and 51 deletions

View file

@ -3,17 +3,13 @@
from PyQt5.QtCore import QTimer from PyQt5.QtCore import QTimer
from UM.Extension import Extension
from UM.Preferences import Preferences from UM.Preferences import Preferences
from UM.Application import Application
from UM.Resources import Resources
from UM.Logger import Logger from UM.Logger import Logger
class AutoSave(Extension): class AutoSave:
def __init__(self): def __init__(self, application):
super().__init__() self._application = application
Preferences.getInstance().preferenceChanged.connect(self._triggerTimer) Preferences.getInstance().preferenceChanged.connect(self._triggerTimer)
self._global_stack = None self._global_stack = None
@ -26,29 +22,11 @@ class AutoSave(Extension):
self._saving = False self._saving = False
# At this point, the Application instance has not finished its constructor call yet, so directly using something
# like Application.getInstance() is not correct. The initialisation now will only gets triggered after the
# application finishes its start up successfully.
self._init_timer = QTimer()
self._init_timer.setInterval(1000)
self._init_timer.setSingleShot(True)
self._init_timer.timeout.connect(self.initialize)
self._init_timer.start()
def initialize(self): def initialize(self):
# only initialise if the application is created and has started # only initialise if the application is created and has started
from cura.CuraApplication import CuraApplication
if not CuraApplication.Created:
self._init_timer.start()
return
if not CuraApplication.getInstance().started:
self._init_timer.start()
return
self._change_timer.timeout.connect(self._onTimeout) self._change_timer.timeout.connect(self._onTimeout)
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) self._application.globalContainerStackChanged.connect(self._onGlobalStackChanged)
self._onGlobalStackChanged() self._onGlobalStackChanged()
self._triggerTimer() self._triggerTimer()
def _triggerTimer(self, *args): def _triggerTimer(self, *args):
@ -60,7 +38,7 @@ class AutoSave(Extension):
self._global_stack.propertyChanged.disconnect(self._triggerTimer) self._global_stack.propertyChanged.disconnect(self._triggerTimer)
self._global_stack.containersChanged.disconnect(self._triggerTimer) self._global_stack.containersChanged.disconnect(self._triggerTimer)
self._global_stack = Application.getInstance().getGlobalContainerStack() self._global_stack = self._application.getGlobalContainerStack()
if self._global_stack: if self._global_stack:
self._global_stack.propertyChanged.connect(self._triggerTimer) self._global_stack.propertyChanged.connect(self._triggerTimer)
@ -70,6 +48,6 @@ class AutoSave(Extension):
self._saving = True # To prevent the save process from triggering another autosave. self._saving = True # To prevent the save process from triggering another autosave.
Logger.log("d", "Autosaving preferences, instances and profiles") Logger.log("d", "Autosaving preferences, instances and profiles")
Application.getInstance().saveSettings() self._application.saveSettings()
self._saving = False self._saving = False

View file

@ -48,7 +48,9 @@ class BackupsManager:
def _disableAutoSave(self): def _disableAutoSave(self):
"""Here we try to disable the auto-save plugin as it might interfere with restoring a backup.""" """Here we try to disable the auto-save plugin as it might interfere with restoring a backup."""
# TODO: Disable auto-save if possible. # TODO: Disable auto-save if possible.
CuraApplication.getInstance().setSaveDataEnabled(False)
def _enableAutoSave(self): def _enableAutoSave(self):
"""Re-enable auto-save after we're done.""" """Re-enable auto-save after we're done."""
# TODO: Enable auto-save if possible. # TODO: Enable auto-save if possible.
CuraApplication.getInstance().setSaveDataEnabled(True)

View file

@ -74,6 +74,7 @@ from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager
from cura.Machines.VariantManager import VariantManager from cura.Machines.VariantManager import VariantManager
from .AutoSave import AutoSave
from . import PlatformPhysics from . import PlatformPhysics
from . import BuildVolume from . import BuildVolume
from . import CameraAnimation from . import CameraAnimation
@ -234,6 +235,8 @@ class CuraApplication(QtApplication):
self._simple_mode_settings_manager = None self._simple_mode_settings_manager = None
self._cura_scene_controller = None self._cura_scene_controller = None
self._machine_error_checker = None self._machine_error_checker = None
self._auto_save = None
self._save_data_enabled = True
self._additional_components = {} # Components to add to certain areas in the interface self._additional_components = {} # Components to add to certain areas in the interface
@ -496,11 +499,14 @@ class CuraApplication(QtApplication):
showPrintMonitor = pyqtSignal(bool, arguments = ["show"]) showPrintMonitor = pyqtSignal(bool, arguments = ["show"])
def setSaveDataEnabled(self, enabled: bool) -> None:
self._save_data_enabled = enabled
## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently. ## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently.
# #
# Note that the AutoSave plugin also calls this method. # Note that the AutoSave plugin also calls this method.
def saveSettings(self, safe_data: bool = True): def saveSettings(self):
if not self.started or not safe_data: if not self.started or not self._save_data_enabled:
# Do not do saving during application start or when data should not be safed on quit. # Do not do saving during application start or when data should not be safed on quit.
return return
ContainerRegistry.getInstance().saveDirtyContainers() ContainerRegistry.getInstance().saveDirtyContainers()
@ -728,6 +734,9 @@ class CuraApplication(QtApplication):
self._post_start_timer.timeout.connect(self._onPostStart) self._post_start_timer.timeout.connect(self._onPostStart)
self._post_start_timer.start() self._post_start_timer.start()
self._auto_save = AutoSave(self)
self._auto_save.initialize()
self.exec_() self.exec_()
def _onPostStart(self): def _onPostStart(self):
@ -879,6 +888,9 @@ class CuraApplication(QtApplication):
return super().event(event) return super().event(event)
def getAutoSave(self):
return self._auto_save
## Get print information (duration / material used) ## Get print information (duration / material used)
def getPrintInformation(self): def getPrintInformation(self):
return self._print_information return self._print_information

View file

@ -1,13 +0,0 @@
# Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from . import AutoSave
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
def getMetaData():
return {}
def register(app):
return { "extension": AutoSave.AutoSave() }

View file

@ -1,8 +0,0 @@
{
"name": "Auto Save",
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Automatically saves Preferences, Machines and Profiles after changes.",
"api": 4,
"i18n-catalog": "cura"
}