Draft: Fixed leftover scene callbacks in snapping

This commit is contained in:
Yorik van Havre
2018-08-24 15:16:35 -03:00
parent dd19005c95
commit 12df04e4b8

View File

@@ -95,6 +95,8 @@ class Snapper:
self.holdTracker = None
self.holdPoints = []
self.running = False
self.callbackClick = None
self.callbackMove = None
# the snapmarker has "dot","circle" and "square" available styles
if self.snapStyle:
@@ -1135,8 +1137,10 @@ class Snapper:
FreeCADGui.Snapper.getPoint(callback=cb)
If the callback function accepts more than one argument, it will also receive
the last snapped object. Finally, a pyqt dialog can be passed as extra taskbox.
the last snapped object. Finally, a qt widget can be passed as an extra taskbox.
If getPoint() is invoked without any argument, nothing is done but the callbacks
are removed, so it can be used as a cancel function.
"""
import inspect
@@ -1146,6 +1150,14 @@ class Snapper:
self.ui = FreeCADGui.draftToolBar
self.view = Draft.get3DView()
# remove any previous leftover callbacks
if self.callbackClick:
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callbackClick)
if self.callbackMove:
self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove)
self.callbackClick = None
self.callbackMove = None
def move(event_cb):
event = event_cb.getEvent()
mousepos = event.getPosition()
@@ -1171,8 +1183,12 @@ class Snapper:
accept()
def accept():
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callbackClick)
self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove)
if self.callbackClick:
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callbackClick)
if self.callbackMove:
self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove)
self.callbackClick = None
self.callbackMove = None
obj = FreeCADGui.Snapper.lastSnappedObject
FreeCADGui.Snapper.off()
self.ui.offUi()
@@ -1184,8 +1200,12 @@ class Snapper:
self.pt = None
def cancel():
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callbackClick)
self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove)
if self.callbackClick:
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callbackClick)
if self.callbackMove:
self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove)
self.callbackClick = None
self.callbackMove = None
FreeCADGui.Snapper.off()
self.ui.offUi()
if callback:
@@ -1193,11 +1213,12 @@ class Snapper:
callback(None,None)
else:
callback(None)
# adding callback functions
self.ui.pointUi(cancel=cancel,getcoords=getcoords,extra=extradlg,rel=bool(last))
self.callbackClick = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),click)
self.callbackMove = self.view.addEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),move)
if callback:
self.ui.pointUi(cancel=cancel,getcoords=getcoords,extra=extradlg,rel=bool(last))
self.callbackClick = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),click)
self.callbackMove = self.view.addEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),move)
def makeSnapToolBar(self):
"builds the Snap toolbar"