From b5d594ce59912bafa6ab792147d30c5d132edd3a Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Mon, 16 Jul 2018 18:46:49 +0800 Subject: [PATCH] gui: optimize large selection performance --- gui.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/gui.py b/gui.py index 27d5305..ec61f51 100644 --- a/gui.py +++ b/gui.py @@ -4,21 +4,28 @@ from .deps import with_metaclass from .utils import getElementPos,objName,addIconToFCAD,guilogger as logger from .proxy import ProxyType from .FCADLogger import FCADLogger +from PySide import QtCore, QtGui class SelectionObserver: def __init__(self): self._attached = False + self.timer = QtCore.QTimer() self.cmds = [] self.elements = dict() self.attach() - self.busy = False; + + def onTimer(self): + for cmd in self.cmds: + cmd.checkActive() def setCommands(self,cmds): self.cmds = cmds def onChanged(self): - for cmd in self.cmds: - cmd.checkActive() + 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): sobj = obj.getSubObject(subname,1) @@ -92,7 +99,8 @@ class SelectionObserver: self.setElementVisible(docname,objname,subname,False,True) def setSelection(self,*_args): - self.onChanged() + self.timer.stop() + self.onTimer() if AsmCmdManager.AutoElementVis: self.resetElementVisible() for sel in FreeCADGui.Selection.getSelectionEx('*',False): @@ -101,6 +109,7 @@ class SelectionObserver: sel.Object.Name,sub,True) def clearSelection(self,*_args): + self.timer.stop() for cmd in self.cmds: cmd.onClearSelection() self.resetElementVisible() @@ -110,7 +119,7 @@ class SelectionObserver: if not self._attached: FreeCADGui.Selection.addObserver(self,False) self._attached = True - self.onChanged() + self.onTimer() def detach(self): logger.trace('detach selection aboserver {}'.format(self._attached))