This commit is contained in:
fieldOfView 2016-05-27 11:54:24 +02:00
commit 545678e18b
6 changed files with 119 additions and 84 deletions

View File

@ -14,8 +14,8 @@ from UM.Application import Application
class SettingOverrideDecorator(SceneNodeDecorator):
def __init__(self):
super().__init__()
self._stack = ContainerStack(id = "SettingOverrideStack")
self._instance = InstanceContainer(id = "SettingOverrideInstanceContainer")
self._stack = ContainerStack(stack_id = "SettingOverrideStack")
self._instance = InstanceContainer(container_id = "SettingOverrideInstanceContainer")
self._stack.addContainer(self._instance)
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged)

View File

@ -16,13 +16,13 @@ UM.TooltipArea
width: childrenRect.width;
height: childrenRect.height;
Button
CheckBox
{
id: check
text: definition.label
//onClicked: delegateItem.settingsModel.setSettingVisible(model.key, checked);
onClicked: addedSettingsModel.setVisible(model.key, checked);
}
}

View File

@ -0,0 +1,76 @@
from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal
from UM.Application import Application
from UM.Settings.SettingInstance import SettingInstance
from UM.Logger import Logger
from cura.SettingOverrideDecorator import SettingOverrideDecorator
class PerObjectSettingVisibilityHandler(QObject):
def __init__(self, parent = None, *args, **kwargs):
super().__init__(parent = parent, *args, **kwargs)
self._selected_object_id = None
visibilityChanged = pyqtSignal()
def setSelectedObjectId(self, id):
self._selected_object_id = id
self.visibilityChanged.emit()
@pyqtProperty("quint64", fset = setSelectedObjectId)
def selectedObjectId(self):
pass
def setVisible(self, visible):
node = Application.getInstance().getController().getScene().findObject(self._selected_object_id)
if not node:
return
stack = node.callDecoration("getStack")
if not stack:
node.addDecorator(SettingOverrideDecorator())
stack = node.callDecoration("getStack")
settings = stack.getTop()
all_instances = settings.findInstances(**{})
visibility_changed = False # Flag to check if at the end the signal needs to be emitted
# Remove all instances that are not in visibility list
for instance in all_instances:
if instance.definition.key not in visible:
settings.removeInstance(instance.definition.key)
visibility_changed = True
# Add all instances that are not added, but are in visiblity list
for item in visible:
if not settings.getInstance(item):
definition_container = Application.getInstance().getGlobalContainerStack().getBottom()
definitions = definition_container.findDefinitions(key = item)
if definitions:
settings.addInstance(SettingInstance(definitions[0], settings))
visibility_changed = True
else:
Logger.log("w", "Unable to add instance (%s) to perobject visibility because we couldn't find the matching definition", item)
if visibility_changed:
self.visibilityChanged.emit()
#settings.addInstance(SettingInstance())
def getVisible(self):
visible_settings = set()
node = Application.getInstance().getController().getScene().findObject(self._selected_object_id)
if not node:
return visible_settings
stack = node.callDecoration("getStack")
if not stack:
return visible_settings
settings = stack.getTop()
if not settings:
return visible_settings
all_instances = settings.findInstances(**{})
for instance in all_instances:
visible_settings.add(instance.definition.key)
return visible_settings

View File

@ -13,21 +13,14 @@ from UM.Scene.SceneNode import SceneNode
from . import SettingOverrideModel
class PerObjectSettingsModel(ListModel):
IdRole = Qt.UserRole + 1
XRole = Qt.UserRole + 2
YRole = Qt.UserRole + 3
MaterialRole = Qt.UserRole + 4
ProfileRole = Qt.UserRole + 5
SettingsRole = Qt.UserRole + 6
IdRole = Qt.UserRole + 1 # ID of the node
def __init__(self, parent = None):
super().__init__(parent)
self._scene = Application.getInstance().getController().getScene()
self._root = self._scene.getRoot()
self.addRoleName(self.IdRole,"id")
self.addRoleName(self.MaterialRole, "material")
self.addRoleName(self.ProfileRole, "profile")
self.addRoleName(self.SettingsRole, "settings")
self._updateModel()
@pyqtSlot("quint64", str)
@ -48,7 +41,7 @@ class PerObjectSettingsModel(ListModel):
node.removeDecorator(ProfileOverrideDecorator)'''
@pyqtSlot("quint64", str)
def addSettingOverride(self, object_id, key):
def addOverride(self, object_id, key):
machine = Application.getInstance().getMachineManager().getActiveMachineInstance()
if not machine:
return
@ -60,7 +53,7 @@ class PerObjectSettingsModel(ListModel):
node.callDecoration("addSetting", key)
@pyqtSlot("quint64", str)
def removeSettingOverride(self, object_id, key):
def removerOverride(self, object_id, key):
node = self._scene.findObject(object_id)
node.callDecoration("removeSetting", key)
@ -69,18 +62,14 @@ class PerObjectSettingsModel(ListModel):
def _updateModel(self):
self.clear()
for node in BreadthFirstIterator(self._root):
if type(node) is not SceneNode or not node.isSelectable():
continue
node_profile = node.callDecoration("getProfile")
if not node_profile:
node_profile = "global"
else:
node_profile = node_profile.getName()
self.appendItem({
"id": id(node),
"material": "",
"profile": node_profile,
"settings": SettingOverrideModel.SettingOverrideModel(node)
})
node_stack = node.callDecoration("getStack")
if not node_stack:
self.appendItem({
"id": id(node)
})

View File

@ -20,73 +20,38 @@ Item {
width: childrenRect.width;
height: childrenRect.height;
Column {
Column
{
id: items
anchors.top: parent.top;
anchors.left: parent.left;
spacing: UM.Theme.getSize("default_margin").height;
Column {
id: customisedSettings
height: childrenRect.height;
ListView
{
id: contents
spacing: UM.Theme.getSize("default_lining").height;
width: UM.Theme.getSize("setting").width + UM.Theme.getSize("setting").height/2;
height: childrenRect.height;
Repeater {
id: settings;
model: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).settings
UM.SettingItem {
width: UM.Theme.getSize("setting").width;
height: UM.Theme.getSize("setting").height;
name: model.label;
type: model.type;
value: model.value;
description: model.description;
unit: model.unit;
valid: model.valid;
visible: !model.global_only
options: model.options
indent: false
style: UM.Theme.styles.setting_item;
onItemValueChanged: {
settings.model.setSettingValue(model.key, value)
}
Button
{
anchors.left: parent.right;
width: UM.Theme.getSize("setting").height;
height: UM.Theme.getSize("setting").height;
onClicked: UM.ActiveTool.properties.getValue("Model").removeSettingOverride(UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id, model.key)
style: ButtonStyle
{
background: Rectangle
{
color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor;
UM.RecolorImage
{
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width/2
height: parent.height/2
sourceSize.width: width
sourceSize.height: width
color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button")
source: UM.Theme.getIcon("cross1")
}
}
}
}
model: UM.SettingDefinitionsModel {
id: addedSettingsModel;
containerId: Cura.MachineManager.activeDefinitionId
visibilityHandler: Cura.PerObjectSettingVisibilityHandler {
selectedObjectId: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id
}
}
delegate:Button
{
anchors.left: parent.right;
width: 150
height:50
text: model.label
}
}
Button
@ -184,6 +149,7 @@ Item {
{
"global_only": false
}
visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
}
delegate:Loader
{

View File

@ -2,6 +2,8 @@
# Uranium is released under the terms of the AGPLv3 or higher.
from . import PerObjectSettingsTool
from . import PerObjectSettingVisibilityHandler
from PyQt5.QtQml import qmlRegisterType
from UM.i18n import i18nCatalog
i18n_catalog = i18nCatalog("cura")
@ -25,4 +27,6 @@ def getMetaData():
}
def register(app):
qmlRegisterType(PerObjectSettingVisibilityHandler.PerObjectSettingVisibilityHandler, "Cura", 1, 0,
"PerObjectSettingVisibilityHandler")
return { "tool": PerObjectSettingsTool.PerObjectSettingsTool() }