gui: support tree view mouse over preselection

This commit is contained in:
Zheng, Lei 2018-03-21 15:44:54 +08:00
parent 8cf3c3f48b
commit 10ca2f7710

73
gui.py
View File

@ -8,8 +8,9 @@ class SelectionObserver:
def __init__(self): def __init__(self):
self._attached = False self._attached = False
self.cmds = [] self.cmds = []
self.elements = set() self.elements = dict()
self.attach() self.attach()
self.busy = False;
def setCommands(self,cmds): def setCommands(self,cmds):
self.cmds = cmds self.cmds = cmds
@ -18,39 +19,52 @@ class SelectionObserver:
for cmd in self.cmds: for cmd in self.cmds:
cmd.checkActive() cmd.checkActive()
def setElementVisible(self,docname,objname,subname,vis): def _setElementVisible(self,docname,objname,subname,vis):
obj = FreeCAD.getDocument(docname).getObject(objname)
sobj = obj.getSubObject(subname,1)
from .assembly import isTypeOf,AsmConstraint,\
AsmElement,AsmElementLink
if isTypeOf(sobj,(AsmElement,AsmElementLink)):
res = sobj.Proxy.parent.Object.isElementVisible(sobj.Name)
if res and vis:
return False
sobj.Proxy.parent.Object.setElementVisible(sobj.Name,vis)
elif isTypeOf(sobj,AsmConstraint):
vis = [vis] * len(sobj.Group)
sobj.setPropertyStatus('VisibilityList','-Immutable')
sobj.VisibilityList = vis
sobj.setPropertyStatus('VisibilityList','Immutable')
else:
return
if vis:
FreeCADGui.Selection.updateSelection(vis,obj,subname)
def setElementVisible(self,docname,objname,subname,vis,presel=False):
if not AsmCmdManager.AutoElementVis: if not AsmCmdManager.AutoElementVis:
self.elements.clear() self.elements.clear()
return return
try: key = (docname,objname,subname)
obj = FreeCAD.getDocument(docname).getObject(objname) val = None
sobj = obj.getSubObject(subname,1) if not vis:
from .assembly import isTypeOf,AsmConstraint,\ val = self.elements.get(key,None)
AsmElement,AsmElementLink if val is None or (presel and val):
if isTypeOf(sobj,(AsmElement,AsmElementLink)):
sobj.Proxy.parent.Object.setElementVisible(sobj.Name,vis)
elif isTypeOf(sobj,AsmConstraint):
vis = [vis] * len(sobj.Group)
sobj.setPropertyStatus('VisibilityList','-Immutable')
sobj.VisibilityList = vis
sobj.setPropertyStatus('VisibilityList','Immutable')
else:
return return
if vis: if logger.catchWarn('',self._setElementVisible,
self.elements.add((docname,objname,subname)) docname,objname,subname,vis) is False and presel:
FreeCADGui.Selection.updateSelection(obj,subname) return
except Exception: if not vis:
pass self.elements.pop(key,None)
finally: elif not presel:
if not vis and self.elements: self.elements[key] = True
logger.catchTrace('',self.elements.remove, else:
(docname,objname,subname)) self.elements.setdefault(key,False)
def resetElementVisible(self): def resetElementVisible(self):
elements = list(self.elements) elements = list(self.elements)
self.elements.clear() self.elements.clear()
for docname,objname,subname in elements: for docname,objname,subname in elements:
self.setElementVisible(docname,objname,subname,False) logger.catchWarn('',self._setElementVisible,
docname,objname,subname,False)
def addSelection(self,docname,objname,subname,_pos): def addSelection(self,docname,objname,subname,_pos):
self.onChanged() self.onChanged()
@ -58,8 +72,13 @@ class SelectionObserver:
def removeSelection(self,docname,objname,subname): def removeSelection(self,docname,objname,subname):
self.onChanged() self.onChanged()
if (docname,objname,subname) in self.elements: self.setElementVisible(docname,objname,subname,False)
self.setElementVisible(docname,objname,subname,False)
def setPreselection(self,docname,objname,subname):
self.setElementVisible(docname,objname,subname,True,True)
def removePreselection(self,docname,objname,subname):
self.setElementVisible(docname,objname,subname,False,True)
def setSelection(self,*_args): def setSelection(self,*_args):
self.onChanged() self.onChanged()