|
@@ -0,0 +1,212 @@
|
|
|
+// Copyright (c) 2018 Ultimaker B.V.
|
|
|
+// Cura is released under the terms of the LGPLv3 or higher.
|
|
|
+
|
|
|
+import QtQuick 2.4
|
|
|
+import QtQuick.Controls 1.2
|
|
|
+import QtQuick.Layouts 1.1
|
|
|
+import QtQuick.Controls.Styles 1.1
|
|
|
+
|
|
|
+import UM 1.0 as UM
|
|
|
+import Cura 1.0 as Cura
|
|
|
+
|
|
|
+Item
|
|
|
+{
|
|
|
+ property bool is_simulation_playing: false
|
|
|
+ visible: UM.SimulationView.layerActivity && CuraApplication.platformActivity
|
|
|
+
|
|
|
+ PathSlider
|
|
|
+ {
|
|
|
+ id: pathSlider
|
|
|
+ height: UM.Theme.getSize("slider_handle").width
|
|
|
+ width: 250
|
|
|
+
|
|
|
+ anchors.bottom: parent.bottom
|
|
|
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").height
|
|
|
+
|
|
|
+ anchors.horizontalCenter: parent.horizontalCenter
|
|
|
+
|
|
|
+ visible: !UM.SimulationView.compatibilityMode
|
|
|
+
|
|
|
+ // Custom properties
|
|
|
+ handleValue: UM.SimulationView.currentPath
|
|
|
+ maximumValue: UM.SimulationView.numPaths
|
|
|
+ handleSize: UM.Theme.getSize("slider_handle").width
|
|
|
+ trackThickness: UM.Theme.getSize("slider_groove").width
|
|
|
+ trackColor: UM.Theme.getColor("slider_groove")
|
|
|
+ trackBorderColor: UM.Theme.getColor("slider_groove_border")
|
|
|
+ handleColor: UM.Theme.getColor("slider_handle")
|
|
|
+ handleActiveColor: UM.Theme.getColor("slider_handle_active")
|
|
|
+ rangeColor: UM.Theme.getColor("slider_groove_fill")
|
|
|
+
|
|
|
+ // Update values when layer data changes.
|
|
|
+ Connections
|
|
|
+ {
|
|
|
+ target: UM.SimulationView
|
|
|
+ onMaxPathsChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath)
|
|
|
+ onCurrentPathChanged:
|
|
|
+ {
|
|
|
+ // Only pause the simulation when the layer was changed manually, not when the simulation is running
|
|
|
+ if (pathSlider.manuallyChanged)
|
|
|
+ {
|
|
|
+ playButton.pauseSimulation()
|
|
|
+ }
|
|
|
+ pathSlider.setHandleValue(UM.SimulationView.currentPath)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Ensure that the slider handlers show the correct value after switching views.
|
|
|
+ Component.onCompleted:
|
|
|
+ {
|
|
|
+ pathSlider.setHandleValue(UM.SimulationView.currentPath)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ Button
|
|
|
+ {
|
|
|
+ id: playButton
|
|
|
+ iconSource: !is_simulation_playing ? "./resources/simulation_resume.svg": "./resources/simulation_pause.svg"
|
|
|
+ style: UM.Theme.styles.small_tool_button
|
|
|
+ visible: !UM.SimulationView.compatibilityMode
|
|
|
+ anchors
|
|
|
+ {
|
|
|
+ right: pathSlider.left
|
|
|
+ verticalCenter: pathSlider.verticalCenter
|
|
|
+ }
|
|
|
+
|
|
|
+ onClicked:
|
|
|
+ {
|
|
|
+ if(is_simulation_playing)
|
|
|
+ {
|
|
|
+ pauseSimulation()
|
|
|
+ } else
|
|
|
+ {
|
|
|
+ resumeSimulation()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function pauseSimulation()
|
|
|
+ {
|
|
|
+ UM.SimulationView.setSimulationRunning(false)
|
|
|
+ simulationTimer.stop()
|
|
|
+ is_simulation_playing = false
|
|
|
+ layerSlider.manuallyChanged = true
|
|
|
+ pathSlider.manuallyChanged = true
|
|
|
+ }
|
|
|
+
|
|
|
+ function resumeSimulation()
|
|
|
+ {
|
|
|
+ UM.SimulationView.setSimulationRunning(true)
|
|
|
+ simulationTimer.start()
|
|
|
+ layerSlider.manuallyChanged = false
|
|
|
+ pathSlider.manuallyChanged = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Timer
|
|
|
+ {
|
|
|
+ id: simulationTimer
|
|
|
+ interval: 100
|
|
|
+ running: false
|
|
|
+ repeat: true
|
|
|
+ onTriggered:
|
|
|
+ {
|
|
|
+ var currentPath = UM.SimulationView.currentPath
|
|
|
+ var numPaths = UM.SimulationView.numPaths
|
|
|
+ var currentLayer = UM.SimulationView.currentLayer
|
|
|
+ var numLayers = UM.SimulationView.numLayers
|
|
|
+
|
|
|
+ // When the user plays the simulation, if the path slider is at the end of this layer, we start
|
|
|
+ // the simulation at the beginning of the current layer.
|
|
|
+ if (!is_simulation_playing)
|
|
|
+ {
|
|
|
+ if (currentPath >= numPaths)
|
|
|
+ {
|
|
|
+ UM.SimulationView.setCurrentPath(0)
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ UM.SimulationView.setCurrentPath(currentPath + 1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // If the simulation is already playing and we reach the end of a layer, then it automatically
|
|
|
+ // starts at the beginning of the next layer.
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (currentPath >= numPaths)
|
|
|
+ {
|
|
|
+ // At the end of the model, the simulation stops
|
|
|
+ if (currentLayer >= numLayers)
|
|
|
+ {
|
|
|
+ playButton.pauseSimulation()
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ UM.SimulationView.setCurrentLayer(currentLayer+1)
|
|
|
+ UM.SimulationView.setCurrentPath(0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ UM.SimulationView.setCurrentPath(currentPath+1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // The status must be set here instead of in the resumeSimulation function otherwise it won't work
|
|
|
+ // correctly, because part of the logic is in this trigger function.
|
|
|
+ is_simulation_playing = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ LayerSlider
|
|
|
+ {
|
|
|
+ id: layerSlider
|
|
|
+
|
|
|
+ width: UM.Theme.getSize("slider_handle").width
|
|
|
+ height: UM.Theme.getSize("layerview_menu_size").height
|
|
|
+
|
|
|
+ anchors
|
|
|
+ {
|
|
|
+ right: parent.right
|
|
|
+ verticalCenter: parent.verticalCenter
|
|
|
+ rightMargin: UM.Theme.getSize("default_margin").width
|
|
|
+ }
|
|
|
+
|
|
|
+ // Custom properties
|
|
|
+ upperValue: UM.SimulationView.currentLayer
|
|
|
+ lowerValue: UM.SimulationView.minimumLayer
|
|
|
+ maximumValue: UM.SimulationView.numLayers
|
|
|
+ handleSize: UM.Theme.getSize("slider_handle").width
|
|
|
+ trackThickness: UM.Theme.getSize("slider_groove").width
|
|
|
+ trackColor: UM.Theme.getColor("slider_groove")
|
|
|
+ trackBorderColor: UM.Theme.getColor("slider_groove_border")
|
|
|
+ upperHandleColor: UM.Theme.getColor("slider_handle")
|
|
|
+ lowerHandleColor: UM.Theme.getColor("slider_handle")
|
|
|
+ rangeHandleColor: UM.Theme.getColor("slider_groove_fill")
|
|
|
+ handleActiveColor: UM.Theme.getColor("slider_handle_active")
|
|
|
+ handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width
|
|
|
+
|
|
|
+ // Update values when layer data changes
|
|
|
+ Connections
|
|
|
+ {
|
|
|
+ target: UM.SimulationView
|
|
|
+ onMaxLayersChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer)
|
|
|
+ onMinimumLayerChanged: layerSlider.setLowerValue(UM.SimulationView.minimumLayer)
|
|
|
+ onCurrentLayerChanged:
|
|
|
+ {
|
|
|
+ // Only pause the simulation when the layer was changed manually, not when the simulation is running
|
|
|
+ if (layerSlider.manuallyChanged)
|
|
|
+ {
|
|
|
+ playButton.pauseSimulation()
|
|
|
+ }
|
|
|
+ layerSlider.setUpperValue(UM.SimulationView.currentLayer)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Make sure the slider handlers show the correct value after switching views
|
|
|
+ Component.onCompleted:
|
|
|
+ {
|
|
|
+ layerSlider.setLowerValue(UM.SimulationView.minimumLayer)
|
|
|
+ layerSlider.setUpperValue(UM.SimulationView.currentLayer)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|