Refactor checkable command, improve command checkActive()

This commit is contained in:
Zheng, Lei 2017-11-08 12:02:18 +08:00
parent d69e5c8f88
commit 333d4f8824
2 changed files with 36 additions and 46 deletions

View File

@ -153,13 +153,13 @@ class ConstraintCommand:
def __init__(self,tp):
self.tp = tp
self._id = 100 + tp._id
self._active = False
self._active = None
def workbenchActivated(self):
pass
def workbenchDeactivated(self):
pass
self._active = None
def getContextMenuName(self):
pass
@ -175,13 +175,19 @@ class ConstraintCommand:
self.tp.getName()), asm3.assembly.AsmConstraint.make,self.tp._id)
def IsActive(self):
return FreeCADGui.ActiveDocument and self._active
if not FreeCAD.ActiveDocument:
return False
if self._active is None:
self.checkActive()
return self._active
def checkActive(self):
from asm3.assembly import AsmConstraint
if guilogger.catchTrace('selection "{}" exception'.format(
self.tp.getName()), AsmConstraint.getSelection, self.tp._id):
self._active = True
else:
self._active = False
def onClearSelection(self):
self._active = False

70
gui.py
View File

@ -85,13 +85,6 @@ class AsmCmdManager(ProxyType):
def getName(cls):
return 'asm3'+cls.__name__[3:]
def GetResources(cls):
return {
'Pixmap':addIconToFCAD(cls._iconName),
'MenuText':cls.getMenuText(),
'ToolTip':cls.getToolTip()
}
def getMenuText(cls):
return cls._menuText
@ -99,22 +92,35 @@ class AsmCmdManager(ProxyType):
return getattr(cls,'_tooltip',cls.getMenuText())
def IsActive(cls):
if cls._active and cls._id>=0 and FreeCAD.ActiveDocument:
return True
def checkActive(cls):
pass
if cls._id<0 or not FreeCAD.ActiveDocument:
return False
if cls._active is None:
cls.checkActive()
return cls._active
def onClearSelection(cls):
pass
class AsmCmdBase(with_metaclass(AsmCmdManager,object)):
_id = -1
_active = True
_active = None
_toolbarName = 'Assembly3'
_menuGroupName = ''
_contextMenuName = 'Assembly'
@classmethod
def checkActive(cls):
cls._active = True
@classmethod
def GetResources(cls):
return {
'Pixmap':addIconToFCAD(cls._iconName),
'MenuText':cls.getMenuText(),
'ToolTip':cls.getToolTip()
}
class AsmCmdNew(AsmCmdBase):
_id = 0
_menuText = 'Create assembly'
@ -161,7 +167,6 @@ class AsmCmdAxialMove(AsmCmdMove):
class AsmCmdCheckable(AsmCmdBase):
_id = -2
_action = None
_saveParam = False
@classmethod
@ -175,7 +180,8 @@ class AsmCmdCheckable(AsmCmdBase):
@classmethod
def setChecked(cls,v):
setattr(cls.__class__,cls.getAttributeName(),v)
cls.setParam('Bool',cls.getAttributeName(),v)
if cls._saveParam:
cls.setParam('Bool',cls.getAttributeName(),v)
@classmethod
def onRegister(cls):
@ -186,36 +192,14 @@ class AsmCmdCheckable(AsmCmdBase):
cls.setChecked(v)
@classmethod
def workbenchActivated(cls):
if cls._action:
return
from PySide import QtGui
mw = FreeCADGui.getMainWindow()
tb = mw.findChild(QtGui.QToolBar,cls._toolbarName)
if not tb:
logger.error('cannot find toolbar "{}"'.format(cls._toolbarName))
return
name = cls.getName()
for action in tb.actions():
if action.objectName() == name:
action.setCheckable(True)
action.setChecked(cls.getChecked())
cls._action = action
break
if not cls._action:
cls._active = False
logger.error('cannot find action "{}"'.format(cls.getName()))
else:
cls._active = True
return
def GetResources(cls):
ret = super(AsmCmdCheckable,cls).GetResources()
ret['Checkable'] = cls.getChecked()
return ret
@classmethod
def Activated(cls):
if not cls._action:
return
checked = not cls.getChecked()
cls.setChecked(checked)
cls._action.setChecked(checked)
def Activated(cls,checked):
cls.setChecked(True if checked else False)
class AsmCmdTrace(AsmCmdCheckable):
_id = 4