123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- # Copyright (c) 2015 Ultimaker B.V.
- # Uranium is released under the terms of the AGPLv3 or higher.
- from PyQt5.QtCore import Qt, pyqtSlot, QUrl
- from UM.Application import Application
- from UM.Qt.ListModel import ListModel
- #from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
- class SettingOverrideModel(ListModel):
- KeyRole = Qt.UserRole + 1
- LabelRole = Qt.UserRole + 2
- DescriptionRole = Qt.UserRole + 3
- ValueRole = Qt.UserRole + 4
- TypeRole = Qt.UserRole + 5
- UnitRole = Qt.UserRole + 6
- ValidRole = Qt.UserRole + 7
- OptionsRole = Qt.UserRole + 8
- WarningDescriptionRole = Qt.UserRole + 9
- ErrorDescriptionRole = Qt.UserRole + 10
- GlobalOnlyRole = Qt.UserRole + 11
- def __init__(self, node, parent = None):
- super().__init__(parent)
- self._ignore_setting_change = None
- self._node = node
- self._node.decoratorsChanged.connect(self._onDecoratorsChanged)
- self._onDecoratorsChanged(None)
- #self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes.
- #self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged)
- #Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged)
- self.addRoleName(self.KeyRole, "key")
- self.addRoleName(self.LabelRole, "label")
- self.addRoleName(self.DescriptionRole, "description")
- self.addRoleName(self.ValueRole,"value")
- self.addRoleName(self.TypeRole, "type")
- self.addRoleName(self.UnitRole, "unit")
- self.addRoleName(self.ValidRole, "valid")
- self.addRoleName(self.OptionsRole, "options")
- self.addRoleName(self.WarningDescriptionRole, "warning_description")
- self.addRoleName(self.ErrorDescriptionRole, "error_description")
- self.addRoleName(self.GlobalOnlyRole, "global_only")
- @pyqtSlot(str, "QVariant")
- def setSettingValue(self, key, value):
- if not self._decorator:
- return
- self._decorator.setSettingValue(key, value)
- def _onDecoratorsChanged(self, node):
- return
- '''if not self._node.getDecorator(SettingOverrideDecorator):
- self.clear()
- return
- self._decorator = self._node.getDecorator(SettingOverrideDecorator)
- self._decorator.settingAdded.connect(self._onSettingsChanged)
- self._decorator.settingRemoved.connect(self._onSettingsChanged)
- self._decorator.settingValueChanged.connect(self._onSettingValueChanged)
- self._onSettingsChanged()'''
- def _createOptionsModel(self, options):
- if not options:
- return None
- model = ListModel()
- model.addRoleName(Qt.UserRole + 1, "value")
- model.addRoleName(Qt.UserRole + 2, "name")
- for value, name in options.items():
- model.appendItem({"value": str(value), "name": str(name)})
- return model
- ## Updates the active profile in this model if the active profile is
- # changed.
- #
- # This links the settingValueChanged of the new profile to this model's
- # _onSettingValueChanged function, so that it properly listens to those
- # events again.
- def _onProfileChanged(self):
- if self._activeProfile: #Unlink from the old profile.
- self._activeProfile.settingValueChanged.disconnect(self._onProfileSettingValueChanged)
- old_profile = self._activeProfile
- self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile()
- self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged) #Re-link to the new profile.
- for setting_name in old_profile.getChangedSettings().keys(): #Update all changed settings in the old and new profiles.
- self._onProfileSettingValueChanged(setting_name)
- for setting_name in self._activeProfile.getChangedSettings().keys():
- self._onProfileSettingValueChanged(setting_name)
- ## Updates the global_only property of a setting once a setting value
- # changes.
- #
- # This method should only get called on settings that are dependent on the
- # changed setting.
- #
- # \param setting_name The setting that needs to be updated.
- def _onProfileSettingValueChanged(self, setting_name):
- index = self.find("key", setting_name)
- if index != -1:
- self.setProperty(index, "global_only", Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getSetting(setting_name).getGlobalOnly())
- def _onSettingsChanged(self):
- self.clear()
- items = []
- for key, setting in self._decorator.getAllSettings().items():
- value = self._decorator.getSettingValue(key)
- items.append({
- "key": key,
- "label": setting.getLabel(),
- "description": setting.getDescription(),
- "value": str(value),
- "type": setting.getType(),
- "unit": setting.getUnit(),
- "valid": setting.validate(value),
- "options": self._createOptionsModel(setting.getOptions()),
- "warning_description": setting.getWarningDescription(),
- "error_description": setting.getErrorDescription(),
- "global_only": setting.getGlobalOnly()
- })
- items.sort(key = lambda i: i["key"])
- for item in items:
- self.appendItem(item)
- def _onSettingValueChanged(self, setting):
- index = self.find("key", setting.getKey())
- value = self._decorator.getSettingValue(setting.getKey())
- if index != -1:
- self.setProperty(index, "value", str(value))
- self.setProperty(index, "valid", setting.validate(value))
- self.setProperty(index, "global_only", setting.getGlobalOnly())
|