gui: improve selection handling

This commit is contained in:
Zheng, Lei 2018-07-23 17:00:48 +08:00
parent 957e5a19c0
commit 1b43f4f701
2 changed files with 23 additions and 32 deletions

View File

@ -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
View File

@ -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