Merge branch 'master' of github.com:Ultimaker/Cura

This commit is contained in:
Ghostkeeper 2016-05-27 14:09:38 +02:00
commit 8bd06ee8ec
10 changed files with 130 additions and 87 deletions

View File

@ -321,6 +321,7 @@ class CuraApplication(QtApplication):
MachineManagerModel.createMachineManagerModel) MachineManagerModel.createMachineManagerModel)
self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles))
self.initializeEngine() self.initializeEngine()
if self._engine.rootObjects: if self._engine.rootObjects:

View File

@ -266,6 +266,11 @@ class MachineManagerModel(QObject):
@pyqtSlot(str) @pyqtSlot(str)
def removeMachine(self, machine_id): def removeMachine(self, machine_id):
# If the machine that is being removed is the currently active machine, set another machine as the active machine
if self._global_container_stack and self._global_container_stack.getId() == machine_id:
containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks()
if containers:
Application.getInstance().setGlobalContainerStack(containers[0])
UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id) UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id)
@pyqtProperty(bool, notify = globalContainerChanged) @pyqtProperty(bool, notify = globalContainerChanged)

View File

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

View File

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

View File

@ -20,73 +20,38 @@ Item {
width: childrenRect.width; width: childrenRect.width;
height: childrenRect.height; height: childrenRect.height;
Column { Column
{
id: items id: items
anchors.top: parent.top; anchors.top: parent.top;
anchors.left: parent.left; anchors.left: parent.left;
spacing: UM.Theme.getSize("default_margin").height; spacing: UM.Theme.getSize("default_margin").height;
height: childrenRect.height;
Column { ListView
id: customisedSettings {
id: contents
spacing: UM.Theme.getSize("default_lining").height; spacing: UM.Theme.getSize("default_lining").height;
width: UM.Theme.getSize("setting").width + UM.Theme.getSize("setting").height/2; height: childrenRect.height;
Repeater { model: UM.SettingDefinitionsModel {
id: settings; id: addedSettingsModel;
containerId: Cura.MachineManager.activeDefinitionId
model: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).settings visibilityHandler: Cura.PerObjectSettingVisibilityHandler {
selectedObjectId: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id
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 delegate:Button
{ {
anchors.left: parent.right; anchors.left: parent.right;
width: UM.Theme.getSize("setting").height; width: 150
height: UM.Theme.getSize("setting").height; height:50
onClicked: UM.ActiveTool.properties.getValue("Model").removeSettingOverride(UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id, model.key) text: model.label
}
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")
}
}
}
}
}
}
} }
Button Button
@ -184,6 +149,7 @@ Item {
{ {
"global_only": false "global_only": false
} }
visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
} }
delegate:Loader delegate:Loader
{ {

View File

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

View File

@ -112,7 +112,7 @@
"unit": "mm", "unit": "mm",
"default_value": 0, "default_value": 0,
"global_only": "True" "global_only": "True"
}, }
} }
} }
} }

View File

@ -22,9 +22,11 @@ UM.ManagementPage
onAddObject: Printer.requestAddPrinter() onAddObject: Printer.requestAddPrinter()
onRemoveObject: confirmDialog.open(); onRemoveObject: confirmDialog.open();
onRenameObject: renameDialog.open(); onRenameObject: renameDialog.open();
onActivateObject: Cura.MachineManager.setActiveMachine(base.currentItem.id)
removeEnabled: numInstances > 1 removeEnabled: base.currentItem != null && numInstances > 1
renameEnabled: numInstances > 0 renameEnabled: base.currentItem != null && numInstances > 0
activateEnabled: base.currentItem != null
Flow Flow
{ {