mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-22 21:59:37 +08:00
212 lines
7.1 KiB
QML
212 lines
7.1 KiB
QML
// 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)
|
|
}
|
|
}
|
|
} |