gui: improve selection handling
This commit is contained in:
parent
957e5a19c0
commit
1b43f4f701
|
@ -418,8 +418,8 @@ class ConstraintCommand:
|
||||||
else:
|
else:
|
||||||
self._active = False
|
self._active = False
|
||||||
|
|
||||||
def onClearSelection(self):
|
def onSelectionChange(self,hasSelection):
|
||||||
self._active = False
|
self._active = None if hasSelection else False
|
||||||
|
|
||||||
class Constraint(ProxyType):
|
class Constraint(ProxyType):
|
||||||
'constraint meta class'
|
'constraint meta class'
|
||||||
|
|
49
gui.py
49
gui.py
|
@ -4,29 +4,17 @@ from .deps import with_metaclass
|
||||||
from .utils import getElementPos,objName,addIconToFCAD,guilogger as logger
|
from .utils import getElementPos,objName,addIconToFCAD,guilogger as logger
|
||||||
from .proxy import ProxyType
|
from .proxy import ProxyType
|
||||||
from .FCADLogger import FCADLogger
|
from .FCADLogger import FCADLogger
|
||||||
from PySide import QtCore, QtGui
|
|
||||||
|
|
||||||
class SelectionObserver:
|
class SelectionObserver:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._attached = False
|
self._attached = False
|
||||||
self.timer = QtCore.QTimer()
|
|
||||||
self.cmds = []
|
self.cmds = []
|
||||||
self.elements = dict()
|
self.elements = dict()
|
||||||
self.attach()
|
self.attach()
|
||||||
|
|
||||||
def onTimer(self):
|
|
||||||
for cmd in self.cmds:
|
|
||||||
cmd.checkActive()
|
|
||||||
|
|
||||||
def setCommands(self,cmds):
|
def setCommands(self,cmds):
|
||||||
self.cmds = cmds
|
self.cmds = cmds
|
||||||
|
|
||||||
def onChanged(self):
|
|
||||||
if not self.timer.isSingleShot():
|
|
||||||
self.timer.setSingleShot(True)
|
|
||||||
self.timer.timeout.connect(self.onTimer)
|
|
||||||
self.timer.start(50)
|
|
||||||
|
|
||||||
def _setElementVisible(self,obj,subname,vis):
|
def _setElementVisible(self,obj,subname,vis):
|
||||||
sobj = obj.getSubObject(subname,1)
|
sobj = obj.getSubObject(subname,1)
|
||||||
from .assembly import isTypeOf,AsmConstraint,\
|
from .assembly import isTypeOf,AsmConstraint,\
|
||||||
|
@ -84,12 +72,16 @@ class SelectionObserver:
|
||||||
continue
|
continue
|
||||||
logger.catchWarn('',self._setElementVisible,obj,subname,False)
|
logger.catchWarn('',self._setElementVisible,obj,subname,False)
|
||||||
|
|
||||||
|
def onChange(self,hasSelection=True):
|
||||||
|
for cmd in self.cmds:
|
||||||
|
cmd.onSelectionChange(hasSelection)
|
||||||
|
|
||||||
def addSelection(self,docname,objname,subname,_pos):
|
def addSelection(self,docname,objname,subname,_pos):
|
||||||
self.onChanged()
|
self.onChange()
|
||||||
self.setElementVisible(docname,objname,subname,True)
|
self.setElementVisible(docname,objname,subname,True)
|
||||||
|
|
||||||
def removeSelection(self,docname,objname,subname):
|
def removeSelection(self,docname,objname,subname):
|
||||||
self.onChanged()
|
self.onChange(FreeCADGui.Selection.hasSelection())
|
||||||
self.setElementVisible(docname,objname,subname,False)
|
self.setElementVisible(docname,objname,subname,False)
|
||||||
|
|
||||||
def setPreselection(self,docname,objname,subname):
|
def setPreselection(self,docname,objname,subname):
|
||||||
|
@ -99,8 +91,7 @@ class SelectionObserver:
|
||||||
self.setElementVisible(docname,objname,subname,False,True)
|
self.setElementVisible(docname,objname,subname,False,True)
|
||||||
|
|
||||||
def setSelection(self,*_args):
|
def setSelection(self,*_args):
|
||||||
self.timer.stop()
|
self.onChange()
|
||||||
self.onTimer()
|
|
||||||
if AsmCmdManager.AutoElementVis:
|
if AsmCmdManager.AutoElementVis:
|
||||||
self.resetElementVisible()
|
self.resetElementVisible()
|
||||||
for sel in FreeCADGui.Selection.getSelectionEx('*',False):
|
for sel in FreeCADGui.Selection.getSelectionEx('*',False):
|
||||||
|
@ -109,9 +100,7 @@ class SelectionObserver:
|
||||||
sel.Object.Name,sub,True)
|
sel.Object.Name,sub,True)
|
||||||
|
|
||||||
def clearSelection(self,*_args):
|
def clearSelection(self,*_args):
|
||||||
self.timer.stop()
|
self.onChange(False)
|
||||||
for cmd in self.cmds:
|
|
||||||
cmd.onClearSelection()
|
|
||||||
self.resetElementVisible()
|
self.resetElementVisible()
|
||||||
|
|
||||||
def attach(self):
|
def attach(self):
|
||||||
|
@ -119,7 +108,6 @@ class SelectionObserver:
|
||||||
if not self._attached:
|
if not self._attached:
|
||||||
FreeCADGui.Selection.addObserver(self,False)
|
FreeCADGui.Selection.addObserver(self,False)
|
||||||
self._attached = True
|
self._attached = True
|
||||||
self.onTimer()
|
|
||||||
|
|
||||||
def detach(self):
|
def detach(self):
|
||||||
logger.trace('detach selection aboserver {}'.format(self._attached))
|
logger.trace('detach selection aboserver {}'.format(self._attached))
|
||||||
|
@ -184,8 +172,8 @@ class AsmCmdManager(ProxyType):
|
||||||
cls.checkActive()
|
cls.checkActive()
|
||||||
return cls._active
|
return cls._active
|
||||||
|
|
||||||
def onClearSelection(cls):
|
def onSelectionChange(cls, hasSelection):
|
||||||
pass
|
_ = hasSelection
|
||||||
|
|
||||||
class AsmCmdBase(with_metaclass(AsmCmdManager, object)):
|
class AsmCmdBase(with_metaclass(AsmCmdManager, object)):
|
||||||
_id = -1
|
_id = -1
|
||||||
|
@ -261,8 +249,11 @@ class AsmCmdMove(AsmCmdBase):
|
||||||
cls._active = True if logger.catchTrace('',cls.canMove) else False
|
cls._active = True if logger.catchTrace('',cls.canMove) else False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def onClearSelection(cls):
|
def onSelectionChange(cls,hasSelection):
|
||||||
|
if not hasSelection:
|
||||||
cls._active = False
|
cls._active = False
|
||||||
|
else:
|
||||||
|
cls._active = None
|
||||||
cls._moveInfo = None
|
cls._moveInfo = None
|
||||||
|
|
||||||
class AsmCmdAxialMove(AsmCmdBase):
|
class AsmCmdAxialMove(AsmCmdBase):
|
||||||
|
@ -475,8 +466,8 @@ class AsmCmdAddWorkplane(AsmCmdBase):
|
||||||
cls._active = False
|
cls._active = False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def onClearSelection(cls):
|
def onSelectionChange(cls,hasSelection):
|
||||||
cls._active = False
|
cls._active = None if hasSelection else False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def Activated(cls,idx=0):
|
def Activated(cls,idx=0):
|
||||||
|
@ -612,8 +603,8 @@ class AsmCmdUp(AsmCmdBase):
|
||||||
FreeCADGui.Selection.addSelection(topParent,subname)
|
FreeCADGui.Selection.addSelection(topParent,subname)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def onClearSelection(cls):
|
def onSelectionChange(cls,hasSelection):
|
||||||
cls._active = False
|
cls._active = None if hasSelection else False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def Activated(cls):
|
def Activated(cls):
|
||||||
|
@ -656,5 +647,5 @@ class ASmCmdMultiply(AsmCmdBase):
|
||||||
AsmConstraint.makeMultiply()
|
AsmConstraint.makeMultiply()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def onClearSelection(cls):
|
def onSelectionChange(cls,hasSelection):
|
||||||
cls._active = False
|
cls._active = None if hasSelection else False
|
||||||
|
|
Loading…
Reference in New Issue
Block a user