Merge branch '15.06'

* 15.06:
  Do not cause "dictionary changed size during iteration" errors when changing view
  Adds an idle-state for the layerview slider
  Adds an idle-state for the safebutton
  Sets the platform activity on true when a model is loaded
  Sets the platform activity on true when a model is loaded
  Create functions that get & set platform activity
  Send M104 to set the temperature to 0
  Do not store files that fail to load in recent files
This commit is contained in:
Arjen Hiemstra 2015-07-13 13:52:33 +02:00
commit 89b175bc5c
7 changed files with 52 additions and 16 deletions

View file

@ -33,6 +33,7 @@ class BuildVolume(SceneNode):
self.setCalculateBoundingBox(False) self.setCalculateBoundingBox(False)
def setWidth(self, width): def setWidth(self, width):
self._width = width self._width = width

View file

@ -74,6 +74,7 @@ class CuraApplication(QtApplication):
self._print_information = None self._print_information = None
self._i18n_catalog = None self._i18n_catalog = None
self._previous_active_tool = None self._previous_active_tool = None
self._platform_activity = False
self.activeMachineChanged.connect(self._onActiveMachineChanged) self.activeMachineChanged.connect(self._onActiveMachineChanged)
@ -216,6 +217,31 @@ class CuraApplication(QtApplication):
self._previous_active_tool = None self._previous_active_tool = None
requestAddPrinter = pyqtSignal() requestAddPrinter = pyqtSignal()
activityChanged = pyqtSignal()
@pyqtProperty(bool, notify = activityChanged)
def getPlatformActivity(self):
return self._platform_activity
@pyqtSlot(bool)
def setPlatformActivity(self, activity):
##Sets the _platform_activity variable on true or false depending on whether there is a mesh on the platform
if activity == True:
self._platform_activity = activity
elif activity == False:
nodes = []
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
if type(node) is not SceneNode or not node.getMeshData():
continue
nodes.append(node)
i = 0
for node in nodes:
if not node.getMeshData():
continue
i += 1
if i <= 1: ## i == 0 when the meshes are removed using the deleteAll function; i == 1 when the last remaining mesh is removed using the deleteObject function
self._platform_activity = activity
self.activityChanged.emit()
## Remove an object from the scene ## Remove an object from the scene
@pyqtSlot("quint64") @pyqtSlot("quint64")
@ -228,6 +254,7 @@ class CuraApplication(QtApplication):
if object: if object:
op = RemoveSceneNodeOperation(object) op = RemoveSceneNodeOperation(object)
op.push() op.push()
self.setPlatformActivity(False)
## Create a number of copies of existing object. ## Create a number of copies of existing object.
@pyqtSlot("quint64", int) @pyqtSlot("quint64", int)
@ -268,7 +295,6 @@ class CuraApplication(QtApplication):
if type(node) is not SceneNode or not node.getMeshData(): if type(node) is not SceneNode or not node.getMeshData():
continue continue
nodes.append(node) nodes.append(node)
if nodes: if nodes:
op = GroupedOperation() op = GroupedOperation()
@ -276,6 +302,7 @@ class CuraApplication(QtApplication):
op.addOperation(RemoveSceneNodeOperation(node)) op.addOperation(RemoveSceneNodeOperation(node))
op.push() op.push()
self.setPlatformActivity(False)
## Reset all translation on nodes with mesh data. ## Reset all translation on nodes with mesh data.
@pyqtSlot() @pyqtSlot()
@ -523,7 +550,7 @@ class CuraApplication(QtApplication):
op.push() op.push()
def _onJobFinished(self, job): def _onJobFinished(self, job):
if type(job) is not ReadMeshJob: if type(job) is not ReadMeshJob or not job.getResult():
return return
f = QUrl.fromLocalFile(job.getFileName()) f = QUrl.fromLocalFile(job.getFileName())

View file

@ -22,15 +22,15 @@ class ProcessSlicedObjectListJob(Job):
super().__init__() super().__init__()
self._message = message self._message = message
self._scene = Application.getInstance().getController().getScene() self._scene = Application.getInstance().getController().getScene()
self._progress = None self._progress = None
Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged)
def run(self): def run(self):
if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView":
self._progress = Message(catalog.i18nc("Layers View mode", "Layers"), 0, False, 0) self._progress = Message(catalog.i18nc("Layers View mode", "Layers"), 0, False, 0)
self._progress.show() self._progress.show()
Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged)
objectIdMap = {} objectIdMap = {}
new_node = SceneNode() new_node = SceneNode()
## Put all nodes in a dict identified by ID ## Put all nodes in a dict identified by ID

View file

@ -469,7 +469,7 @@ class PrinterConnection(SignalEmitter):
# Turn of temperatures # Turn of temperatures
self._sendCommand("M140 S0") self._sendCommand("M140 S0")
self._sendCommand("M109 S0") self._sendCommand("M104 S0")
self._is_printing = False self._is_printing = False
## Check if the process did not encounter an error yet. ## Check if the process did not encounter an error yet.

View file

@ -41,7 +41,10 @@ UM.MainWindow {
var path = modelData.toString() var path = modelData.toString()
return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1); return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1);
} }
onTriggered: UM.MeshFileHandler.readLocalFile(modelData); onTriggered: {
UM.MeshFileHandler.readLocalFile(modelData);
Printer.setPlatformActivity(true)
}
} }
onObjectAdded: fileMenu.insertItem(index, object) onObjectAdded: fileMenu.insertItem(index, object)
onObjectRemoved: fileMenu.removeItem(object) onObjectRemoved: fileMenu.removeItem(object)
@ -318,7 +321,11 @@ UM.MainWindow {
redo.onTriggered: UM.OperationStack.redo(); redo.onTriggered: UM.OperationStack.redo();
redo.enabled: UM.OperationStack.canRedo; redo.enabled: UM.OperationStack.canRedo;
deleteSelection.onTriggered: UM.Controller.removeSelection(); deleteSelection.onTriggered: {
if(objectContextMenu.objectId != 0) {
Printer.deleteObject(objectContextMenu.objectId);
}
}
deleteObject.onTriggered: { deleteObject.onTriggered: {
if(objectContextMenu.objectId != 0) { if(objectContextMenu.objectId != 0) {
@ -408,6 +415,7 @@ UM.MainWindow {
onAccepted: onAccepted:
{ {
UM.MeshFileHandler.readLocalFile(fileUrl) UM.MeshFileHandler.readLocalFile(fileUrl)
Printer.setPlatformActivity(true)
} }
} }

View file

@ -14,6 +14,7 @@ Rectangle {
property Action saveAction; property Action saveAction;
property real progress: UM.Backend.progress; property real progress: UM.Backend.progress;
property bool activity: Printer.getPlatformActivity;
Behavior on progress { NumberAnimation { duration: 250; } } Behavior on progress { NumberAnimation { duration: 250; } }
property string currentDevice: "local_file" property string currentDevice: "local_file"
@ -76,7 +77,7 @@ Rectangle {
color: UM.Theme.colors.save_button_estimated_text; color: UM.Theme.colors.save_button_estimated_text;
font: UM.Theme.fonts.small; font: UM.Theme.fonts.small;
text: text:
if(base.progress < 0) { if(base.activity == false) {
//: Save button label //: Save button label
return qsTr("Please load a 3D model"); return qsTr("Please load a 3D model");
} else if (base.progress < 0.99) { } else if (base.progress < 0.99) {
@ -97,7 +98,7 @@ Rectangle {
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width; anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width;
color: UM.Theme.colors.save_button_printtime_text; color: UM.Theme.colors.save_button_printtime_text;
font: UM.Theme.fonts.small; font: UM.Theme.fonts.small;
visible: base.progress < 0.99 ? false : true visible: base.activity == false || base.progress < 0.99 ? false : true
text: (!base.printDuration || !base.printDuration.valid) ? "" : base.printDuration.getDisplayString(UM.DurationFormat.Long); text: (!base.printDuration || !base.printDuration.valid) ? "" : base.printDuration.getDisplayString(UM.DurationFormat.Long);
} }
Label { Label {
@ -107,11 +108,10 @@ Rectangle {
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width; anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width;
color: base.printDuration.days > 0 ? UM.Theme.colors.save_button_estimated_text : UM.Theme.colors.save_button_printtime_text; color: base.printDuration.days > 0 ? UM.Theme.colors.save_button_estimated_text : UM.Theme.colors.save_button_printtime_text;
font: UM.Theme.fonts.small; font: UM.Theme.fonts.small;
property bool mediumLengthDuration: base.printDuration.hours > 9 && base.printMaterialAmount > 9.99 && base.printDuration.days == 0 property bool mediumLengthDuration: base.printDuration.hours > 9 && base.printMaterialAmount > 9.99 && base.printDuration.days == 0
width: mediumLengthDuration ? 50 : undefined width: mediumLengthDuration ? 50 : undefined
elide: mediumLengthDuration ? Text.ElideRight : Text.ElideNone elide: mediumLengthDuration ? Text.ElideRight : Text.ElideNone
visible: base.progress < 0.99 ? false : true visible: base.activity == false || base.progress < 0.99 ? false : true
//: Print material amount save button label //: Print material amount save button label
text: base.printMaterialAmount < 0 ? "" : qsTr("%1m material").arg(base.printMaterialAmount); text: base.printMaterialAmount < 0 ? "" : qsTr("%1m material").arg(base.printMaterialAmount);
} }
@ -125,7 +125,7 @@ Rectangle {
} }
width: Math.max(infoBox.width * base.progress); width: Math.max(infoBox.width * base.progress);
color: UM.Theme.colors.save_button_active color: UM.Theme.colors.save_button_active
visible: base.progress > 0.99 ? false : true visible: progress > 0.99 ? false : true
} }
Button { Button {
@ -135,7 +135,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width; anchors.leftMargin: UM.Theme.sizes.default_margin.width;
tooltip: '' tooltip: ''
enabled: progress >= 0.99; enabled: progress > 0.99 && base.activity == true
width: infoBox.width/6*4.5 width: infoBox.width/6*4.5
height: UM.Theme.sizes.save_button_save_to_button.height height: UM.Theme.sizes.save_button_save_to_button.height

View file

@ -389,7 +389,7 @@ QtObject {
} }
Label { Label {
id: maxValueLabel id: maxValueLabel
visible: UM.LayerView.getLayerActivity ? true : false visible: UM.LayerView.getLayerActivity && Printer.getPlatformActivity ? true : false
text: control.maximumValue + 1 text: control.maximumValue + 1
font: control.maximumValue > 998 ? UM.Theme.fonts.small : UM.Theme.fonts.default font: control.maximumValue > 998 ? UM.Theme.fonts.small : UM.Theme.fonts.default
transformOrigin: Item.BottomLeft transformOrigin: Item.BottomLeft
@ -399,7 +399,7 @@ QtObject {
} }
Label { Label {
id: minValueLabel id: minValueLabel
visible: UM.LayerView.getLayerActivity ? true : false visible: UM.LayerView.getLayerActivity && Printer.getPlatformActivity ? true : false
text: '1' text: '1'
font: control.maximumValue > 998 ? UM.Theme.fonts.small : UM.Theme.fonts.default font: control.maximumValue > 998 ? UM.Theme.fonts.small : UM.Theme.fonts.default
transformOrigin: Item.BottomLeft transformOrigin: Item.BottomLeft
@ -416,7 +416,7 @@ QtObject {
Behavior on color { ColorAnimation { duration: 50; } } Behavior on color { ColorAnimation { duration: 50; } }
Label { Label {
id: valueLabel id: valueLabel
visible: UM.LayerView.getLayerActivity ? true : false visible: UM.LayerView.getLayerActivity && Printer.getPlatformActivity ? true : false
text: control.value + 1 text: control.value + 1
anchors.bottom: layerSliderControl.bottom anchors.bottom: layerSliderControl.bottom
anchors.right: layerSliderControl.left anchors.right: layerSliderControl.left