Greatly simplify the SimulationViewProxy

This commit is contained in:
Jaime van Kessel 2019-08-27 13:03:23 +02:00
parent ced14c7daf
commit 9c2f8a94d5
2 changed files with 60 additions and 124 deletions

View file

@ -84,7 +84,7 @@ class SimulationView(CuraView):
self._old_composite_shader = None # type: Optional["ShaderProgram"] self._old_composite_shader = None # type: Optional["ShaderProgram"]
self._global_container_stack = None # type: Optional[ContainerStack] self._global_container_stack = None # type: Optional[ContainerStack]
self._proxy = SimulationViewProxy() self._proxy = None
self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged)
self._resetSettings() self._resetSettings()
@ -441,6 +441,8 @@ class SimulationView(CuraView):
## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created ## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created
# as this caused some issues. # as this caused some issues.
def getProxy(self, engine, script_engine): def getProxy(self, engine, script_engine):
if self._proxy is None:
self._proxy = SimulationViewProxy(self)
return self._proxy return self._proxy
def endRendering(self) -> None: def endRendering(self) -> None:

View file

@ -1,21 +1,24 @@
# Copyright (c) 2018 Ultimaker B.V. # Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from typing import TYPE_CHECKING
from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty
from UM.FlameProfiler import pyqtSlot from UM.FlameProfiler import pyqtSlot
from UM.Application import Application from UM.Application import Application
import SimulationView if TYPE_CHECKING:
from .SimulationView import SimulationView
class SimulationViewProxy(QObject): class SimulationViewProxy(QObject):
def __init__(self, parent=None): def __init__(self, simulation_view: "SimulationView", parent=None):
super().__init__(parent) super().__init__(parent)
self._simulation_view = simulation_view
self._current_layer = 0 self._current_layer = 0
self._controller = Application.getInstance().getController() self._controller = Application.getInstance().getController()
self._controller.activeViewChanged.connect(self._onActiveViewChanged) self._controller.activeViewChanged.connect(self._onActiveViewChanged)
self._onActiveViewChanged()
self.is_simulationView_selected = False self.is_simulationView_selected = False
self._onActiveViewChanged()
currentLayerChanged = pyqtSignal() currentLayerChanged = pyqtSignal()
currentPathChanged = pyqtSignal() currentPathChanged = pyqtSignal()
@ -28,182 +31,112 @@ class SimulationViewProxy(QObject):
@pyqtProperty(bool, notify=activityChanged) @pyqtProperty(bool, notify=activityChanged)
def layerActivity(self): def layerActivity(self):
active_view = self._controller.getActiveView() return self._simulation_view.getActivity()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getActivity()
return False
@pyqtProperty(int, notify=maxLayersChanged) @pyqtProperty(int, notify=maxLayersChanged)
def numLayers(self): def numLayers(self):
active_view = self._controller.getActiveView() return self._simulation_view.getMaxLayers()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getMaxLayers()
return 0
@pyqtProperty(int, notify=currentLayerChanged) @pyqtProperty(int, notify=currentLayerChanged)
def currentLayer(self): def currentLayer(self):
active_view = self._controller.getActiveView() return self._simulation_view.getCurrentLayer()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getCurrentLayer()
return 0
@pyqtProperty(int, notify=currentLayerChanged) @pyqtProperty(int, notify=currentLayerChanged)
def minimumLayer(self): def minimumLayer(self):
active_view = self._controller.getActiveView() return self._simulation_view.getMinimumLayer()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getMinimumLayer()
return 0
@pyqtProperty(int, notify=maxPathsChanged) @pyqtProperty(int, notify=maxPathsChanged)
def numPaths(self): def numPaths(self):
active_view = self._controller.getActiveView() return self._simulation_view.getMaxPaths()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getMaxPaths()
return 0
@pyqtProperty(int, notify=currentPathChanged) @pyqtProperty(int, notify=currentPathChanged)
def currentPath(self): def currentPath(self):
active_view = self._controller.getActiveView() return self._simulation_view.getCurrentPath()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getCurrentPath()
return 0
@pyqtProperty(int, notify=currentPathChanged) @pyqtProperty(int, notify=currentPathChanged)
def minimumPath(self): def minimumPath(self):
active_view = self._controller.getActiveView() return self._simulation_view.getMinimumPath()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getMinimumPath()
return 0
@pyqtProperty(bool, notify=busyChanged) @pyqtProperty(bool, notify=busyChanged)
def busy(self): def busy(self):
active_view = self._controller.getActiveView() return self._simulation_view.isBusy()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.isBusy()
return False
@pyqtProperty(bool, notify=preferencesChanged) @pyqtProperty(bool, notify=preferencesChanged)
def compatibilityMode(self): def compatibilityMode(self):
active_view = self._controller.getActiveView() return self._simulation_view.getCompatibilityMode()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getCompatibilityMode() @pyqtProperty(int, notify=globalStackChanged)
return False def extruderCount(self):
return self._simulation_view.getExtruderCount()
@pyqtSlot(int) @pyqtSlot(int)
def setCurrentLayer(self, layer_num): def setCurrentLayer(self, layer_num):
active_view = self._controller.getActiveView() self._simulation_view.setLayer(layer_num)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setLayer(layer_num)
@pyqtSlot(int) @pyqtSlot(int)
def setMinimumLayer(self, layer_num): def setMinimumLayer(self, layer_num):
active_view = self._controller.getActiveView() self._simulation_view.setMinimumLayer(layer_num)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setMinimumLayer(layer_num)
@pyqtSlot(int) @pyqtSlot(int)
def setCurrentPath(self, path_num): def setCurrentPath(self, path_num):
active_view = self._controller.getActiveView() self._simulation_view.setPath(path_num)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setPath(path_num)
@pyqtSlot(int) @pyqtSlot(int)
def setMinimumPath(self, path_num): def setMinimumPath(self, path_num):
active_view = self._controller.getActiveView() self._simulation_view.setMinimumPath(path_num)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setMinimumPath(path_num)
@pyqtSlot(int) @pyqtSlot(int)
def setSimulationViewType(self, layer_view_type): def setSimulationViewType(self, layer_view_type):
active_view = self._controller.getActiveView() self._simulation_view.setSimulationViewType(layer_view_type)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setSimulationViewType(layer_view_type)
@pyqtSlot(result=int) @pyqtSlot(result=int)
def getSimulationViewType(self): def getSimulationViewType(self):
active_view = self._controller.getActiveView() return self._simulation_view.getSimulationViewType()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getSimulationViewType()
return 0
@pyqtSlot(bool) @pyqtSlot(bool)
def setSimulationRunning(self, running): def setSimulationRunning(self, running):
active_view = self._controller.getActiveView() self._simulation_view.setSimulationRunning(running)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setSimulationRunning(running)
@pyqtSlot(result=bool) @pyqtSlot(result=bool)
def getSimulationRunning(self): def getSimulationRunning(self):
active_view = self._controller.getActiveView() return self._simulation_view.isSimulationRunning()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.isSimulationRunning()
return False
@pyqtSlot(result=float) @pyqtSlot(result=float)
def getMinFeedrate(self): def getMinFeedrate(self):
active_view = self._controller.getActiveView() return self._simulation_view.getMinFeedrate()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getMinFeedrate()
return 0
@pyqtSlot(result=float) @pyqtSlot(result=float)
def getMaxFeedrate(self): def getMaxFeedrate(self):
active_view = self._controller.getActiveView() return self._simulation_view.getMaxFeedrate()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getMaxFeedrate()
return 0
@pyqtSlot(result=float) @pyqtSlot(result=float)
def getMinThickness(self): def getMinThickness(self):
active_view = self._controller.getActiveView() return self._simulation_view.getMinThickness()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getMinThickness()
return 0
@pyqtSlot(result=float) @pyqtSlot(result=float)
def getMaxThickness(self): def getMaxThickness(self):
active_view = self._controller.getActiveView() return self._simulation_view.getMaxThickness()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getMaxThickness()
return 0
# Opacity 0..1 # Opacity 0..1
@pyqtSlot(int, float) @pyqtSlot(int, float)
def setExtruderOpacity(self, extruder_nr, opacity): def setExtruderOpacity(self, extruder_nr, opacity):
active_view = self._controller.getActiveView() self._simulation_view.setExtruderOpacity(extruder_nr, opacity)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setExtruderOpacity(extruder_nr, opacity)
@pyqtSlot(int) @pyqtSlot(int)
def setShowTravelMoves(self, show): def setShowTravelMoves(self, show):
active_view = self._controller.getActiveView() self._simulation_view.setShowTravelMoves(show)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setShowTravelMoves(show)
@pyqtSlot(int) @pyqtSlot(int)
def setShowHelpers(self, show): def setShowHelpers(self, show):
active_view = self._controller.getActiveView() self._simulation_view.setShowHelpers(show)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setShowHelpers(show)
@pyqtSlot(int) @pyqtSlot(int)
def setShowSkin(self, show): def setShowSkin(self, show):
active_view = self._controller.getActiveView() self._simulation_view.setShowSkin(show)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setShowSkin(show)
@pyqtSlot(int) @pyqtSlot(int)
def setShowInfill(self, show): def setShowInfill(self, show):
active_view = self._controller.getActiveView() self._simulation_view.setShowInfill(show)
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
active_view.setShowInfill(show)
@pyqtProperty(int, notify=globalStackChanged)
def extruderCount(self):
active_view = self._controller.getActiveView()
if isinstance(active_view, SimulationView.SimulationView.SimulationView):
return active_view.getExtruderCount()
return 0
def _layerActivityChanged(self): def _layerActivityChanged(self):
self.activityChanged.emit() self.activityChanged.emit()
@ -236,24 +169,25 @@ class SimulationViewProxy(QObject):
def _onActiveViewChanged(self): def _onActiveViewChanged(self):
active_view = self._controller.getActiveView() active_view = self._controller.getActiveView()
if isinstance(active_view, SimulationView.SimulationView.SimulationView): if active_view == self._simulation_view:
# remove other connection if once the SimulationView was created. self._simulation_view.currentLayerNumChanged.connect(self._onLayerChanged)
if self.is_simulationView_selected: self._simulation_view.currentPathNumChanged.connect(self._onPathChanged)
active_view.currentLayerNumChanged.disconnect(self._onLayerChanged) self._simulation_view.maxLayersChanged.connect(self._onMaxLayersChanged)
active_view.currentPathNumChanged.disconnect(self._onPathChanged) self._simulation_view.maxPathsChanged.connect(self._onMaxPathsChanged)
active_view.maxLayersChanged.disconnect(self._onMaxLayersChanged) self._simulation_view.busyChanged.connect(self._onBusyChanged)
active_view.maxPathsChanged.disconnect(self._onMaxPathsChanged) self._simulation_view.activityChanged.connect(self._onActivityChanged)
active_view.busyChanged.disconnect(self._onBusyChanged) self._simulation_view.globalStackChanged.connect(self._onGlobalStackChanged)
active_view.activityChanged.disconnect(self._onActivityChanged) self._simulation_view.preferencesChanged.connect(self._onPreferencesChanged)
active_view.globalStackChanged.disconnect(self._onGlobalStackChanged)
active_view.preferencesChanged.disconnect(self._onPreferencesChanged)
self.is_simulationView_selected = True self.is_simulationView_selected = True
active_view.currentLayerNumChanged.connect(self._onLayerChanged) elif self.is_simulationView_selected:
active_view.currentPathNumChanged.connect(self._onPathChanged) # Disconnect all of em again.
active_view.maxLayersChanged.connect(self._onMaxLayersChanged) self.is_simulationView_selected = False
active_view.maxPathsChanged.connect(self._onMaxPathsChanged) self._simulation_view.currentLayerNumChanged.disconnect(self._onLayerChanged)
active_view.busyChanged.connect(self._onBusyChanged) self._simulation_view.currentPathNumChanged.disconnect(self._onPathChanged)
active_view.activityChanged.connect(self._onActivityChanged) self._simulation_view.maxLayersChanged.disconnect(self._onMaxLayersChanged)
active_view.globalStackChanged.connect(self._onGlobalStackChanged) self._simulation_view.maxPathsChanged.disconnect(self._onMaxPathsChanged)
active_view.preferencesChanged.connect(self._onPreferencesChanged) self._simulation_view.busyChanged.disconnect(self._onBusyChanged)
self._simulation_view.activityChanged.disconnect(self._onActivityChanged)
self._simulation_view.globalStackChanged.disconnect(self._onGlobalStackChanged)
self._simulation_view.preferencesChanged.disconnect(self._onPreferencesChanged)