def __init__(self,parent=None,devices=None): #print '~'*80 #print 'In AttributesPanel()' PARENT_KLASS.__init__(self,parent) self.setSizePolicy(Qt.QSizePolicy(Qt.QSizePolicy.Ignored,Qt.QSizePolicy.Ignored)) self.worker = SingletonWorker(parent=self,cursor=True,sleep=50.,start=True) #self.worker.log.setLogLevel(self.worker.log.Debug) self.filters=('','','') #server/device/attribute self.devices=devices or [] self.setValues(None) self.models = [] self.current_item = None #self.connect(self, Qt.SIGNAL('customContextMenuRequested(const QPoint&)'), self.onContextMenu) self.popMenu = Qt.QMenu(self) self.actions = { 'TestDevice': self.popMenu.addAction(Qt.QIcon(),"Test Device",self.onTestDevice), 'ShowDeviceInfo': self.popMenu.addAction(Qt.QIcon(),"Show Device Info",self.onShowInfo), #'ShowDevicePanel': self.popMenu.addAction(Qt.QIcon(),"Show Info",self.onShowPanel), 'ShowArchivingInfo': self.popMenu.addAction(Qt.QIcon(),"Show Archiving Info",self.onShowArchivingModes), #'Test Device': self.popMenu.addAction(Qt.QIcon(),"Test Device",self.onTestDevice) } #if hasattr(self,'setFrameStyle'): #self.setFrameStyle(self.Box) try: import PyTangoArchiving self.reader = PyTangoArchiving.Reader('*') #self.hreader = self.reader.configs['hdb'] #self.treader = self.reader.configs.get('tdb',self.hreader) except: traceback.print_exc()
def modelsThread(self): modelsThread = self.__modelsThread if modelsThread is None: modelsThread = SingletonWorker(parent=self, name='TaurusGrid', queue=self.modelsQueue, method=modelSetter, cursor=True) self.__modelsThread = modelsThread return modelsThread
def __init__(self,parent=None,devices=None): #print '~'*80 tracer('In AttributesPanel()') PARENT_KLASS.__init__(self,parent) self.setSizePolicy(Qt.QSizePolicy(Qt.QSizePolicy.Ignored,Qt.QSizePolicy.Ignored)) self.worker = SingletonWorker(parent=self,cursor=True,sleep=50.,start=True) #self.worker.log.setLogLevel(self.worker.log.Debug) self.filters=('','','') #server/device/attribute self.devices=devices or [] self.setValues(None) self.models = [] self.current_item = None #self.connect(self, Qt.SIGNAL('customContextMenuRequested(const QPoint&)'), self.onContextMenu) self.popMenu = Qt.QMenu(self) self.actions = { 'TestDevice': self.popMenu.addAction(Qt.QIcon(), "Test Device",self.onTestDevice), 'ShowDeviceInfo': self.popMenu.addAction(Qt.QIcon(), "Show Device Info",self.onShowInfo), #'ShowDevicePanel': self.popMenu.addAction(Qt.QIcon(),"Show Info",self.onShowPanel), 'ShowArchivingInfo': self.popMenu.addAction(Qt.QIcon(), "Show Archiving Info",self.onShowArchivingModes), 'AddToTrend': self.popMenu.addAction(Qt.QIcon(), "Add attribute to Trend", self.addAttributeToTrend), 'AddSelected': self.popMenu.addAction(Qt.QIcon(), "Add selected attributes to Trend", self.addSelectedToTrend), 'CheckAll': self.popMenu.addAction(Qt.QIcon(), "Select all attributes", self.checkAll), 'UncheckAll': self.popMenu.addAction(Qt.QIcon(), "Deselect all attributes", self.uncheckAll), #'Test Device': self.popMenu.addAction(Qt.QIcon(),"Test Device",self.onTestDevice) } #if hasattr(self,'setFrameStyle'): #self.setFrameStyle(self.Box) try: import PyTangoArchiving self.reader = PyTangoArchiving.Reader('*') #self.hreader = self.reader.configs['hdb'] #self.treader = self.reader.configs.get('tdb',self.hreader) except: traceback.print_exc()
class AttributesPanel(PARENT_KLASS): _domains = ['ALL EPS'] + ['LI', 'LT'] + [ 'LT%02d' % i for i in range(1, 3) ] + ['SR%02d' % i for i in range(1, 17)] _fes = [ f for f in get_distinct_domains( fandango.get_database().get_device_exported('fe*')) if fun.matchCl('fe[0-9]', f) ] LABELS = 'Label/Value Device Attribute Alias Archiving Check'.split() SIZES = [500, 150, 90, 90, 120, 40] STRETCH = [8, 4, 4, 4, 2, 1] def __init__(self, parent=None, devices=None): #print '~'*80 tracer('In AttributesPanel()') PARENT_KLASS.__init__(self, parent) self.setSizePolicy( Qt.QSizePolicy(Qt.QSizePolicy.Ignored, Qt.QSizePolicy.Ignored)) self.worker = SingletonWorker(parent=self, cursor=True, sleep=50., start=True) #self.worker.log.setLogLevel(self.worker.log.Debug) self.filters = ('', '', '') #server/device/attribute self.devices = devices or [] self.setValues(None) self.models = [] self.current_item = None #self.connect(self, Qt.SIGNAL('customContextMenuRequested(const QPoint&)'), self.onContextMenu) self.popMenu = Qt.QMenu(self) self.actions = { 'TestDevice': self.popMenu.addAction(Qt.QIcon(), "Test Device", self.onTestDevice), 'ShowDeviceInfo': self.popMenu.addAction(Qt.QIcon(), "Show Device Info", self.onShowInfo), #'ShowDevicePanel': self.popMenu.addAction(Qt.QIcon(),"Show Info",self.onShowPanel), 'ShowArchivingInfo': self.popMenu.addAction(Qt.QIcon(), "Show Archiving Info", self.onShowArchivingModes), 'AddToTrend': self.popMenu.addAction(Qt.QIcon(), "Add attribute to Trend", self.addAttributeToTrend), 'AddSelected': self.popMenu.addAction(Qt.QIcon(), "Add selected attributes to Trend", self.addSelectedToTrend), 'CheckAll': self.popMenu.addAction(Qt.QIcon(), "Select all attributes", self.checkAll), 'UncheckAll': self.popMenu.addAction(Qt.QIcon(), "Deselect all attributes", self.uncheckAll), #'Test Device': self.popMenu.addAction(Qt.QIcon(),"Test Device",self.onTestDevice) } #if hasattr(self,'setFrameStyle'): #self.setFrameStyle(self.Box) try: import PyTangoArchiving self.reader = PyTangoArchiving.Reader('*') #self.hreader = self.reader.configs['hdb'] #self.treader = self.reader.configs.get('tdb',self.hreader) except: traceback.print_exc() def __del__(self): print 'AttributesPanel.__del__' QGridTable.__del__(self) def setItem(self, x, y, item, spanx=1, spany=1, align=None, model=None): align = align or Qt.Qt.AlignLeft try: if model: item._model = model except: pass self.layout().addWidget(item, x, y, spany, spanx, Qt.Qt.AlignCenter) if item not in self._widgets: self._widgets.append(item) def mousePressEvent(self, event): point = event.pos() widget = Qt.QApplication.instance().widgetAt(self.mapToGlobal(point)) if hasattr(widget, '_model'): print('onMouseEvent(%s)' % (getattr(widget, 'text', lambda: widget)())) self.current_item = widget if event.button() == Qt.Qt.RightButton: self.onContextMenu(point) getattr(super(type(self), self), 'mousePressEvent', lambda e: None)(event) def onContextMenu(self, point): print('onContextMenu()') try: self.actions['TestDevice'].setEnabled( '/' in self.current_item._model) self.actions['ShowDeviceInfo'].setEnabled( '/' in self.current_item._model) self.actions['ShowArchivingInfo'].setEnabled( '/' in self.current_item._model) self.actions['AddToTrend'].setEnabled(hasattr(self, 'trend')) self.actions['AddSelected'].setEnabled(hasattr(self, 'trend')) self.popMenu.exec_(self.mapToGlobal(point)) except: traceback.print_exc() def getCurrentModel(self): return '/'.join(str(self.current_item._model).split('/')[-4:]) def getCurrentDevice(self): return str(self.current_item._model.rsplit('/', 1)[0]) def onTestDevice(self, device=None): from PyTangoArchiving.widget.panel import showTestDevice showTestDevice(device or self.getCurrentDevice()) def onShowInfo(self, device=None): from PyTangoArchiving.widget.panel import showDeviceInfo showDeviceInfo(device=device or self.getCurrentDevice(), parent=self) def onShowArchivingModes(self, model=None): try: from PyTangoArchiving.widget.panel import showArchivingModes model = model or self.getCurrentModel() showArchivingModes(model, parent=self) except: Qt.QMessageBox.warning(self, "ups!", traceback.format_exc()) def addAttributeToTrend(self, model=None): try: model = model or self.getCurrentModel() self.trend.addModels([model]) except: Qt.QMessageBox.warning(self, "ups!", traceback.format_exc()) def addSelectedToTrend(self): try: y = self.columnCount() - 1 models = [] for x in range(self.rowCount()): item = self.itemAt(x, y).widget() m = getattr(item, '_model', '') if m and item.isChecked(): models.append(m) if len(models) > 20: Qt.QMessageBox.warning( self, "warning", "To avoid performance issues, dynamic scale will be disabled" ) self.trend.setXDynScale(False) self.trend.addModels(models) except: Qt.QMessageBox.warning(self, "ups!", traceback.format_exc()) def checkAll(self): y = self.columnCount() - 1 for x in range(self.rowCount()): self.itemAt(x, y).widget().setChecked(True) def uncheckAll(self): y = self.columnCount() - 1 for x in range(self.rowCount()): self.itemAt(x, y).widget().setChecked(False) def setValues(self, values, filters=None): """ filters will be a tuple containing several regular expressions to match """ #print('In AttributesPanel.setValues([%s])'%len(values or [])) if values is None: self.generateTable([]) elif True: #filters is None: self.generateTable(values) #print 'In AttributesPanel.setValues(...): done' return def generateTable(self, values): #thermocouples = thermocouples if thermocouples is not None else self.thermocouples self.setRowCount(len(values)) self.setColumnCount(5) #self.vheaders = [] self.offset = 0 self.widgetbuffer = [] for i, tc in enumerate(sorted(values)): #print 'setTableRow(%s,%s)'%(i,tc) model, device, attribute, alias, archived, ok = tc model, device, attribute, alias = map( str.upper, (model, device, attribute, alias)) #self.vheaders.append(model) def ITEM(m, model='', size=0): q = fandango.qt.Draggable(Qt.QLabel)(m) if size is not 0: q.setMinimumWidth(size) #(.7*950/5.) q._model = model q._archived = archived q.setDragEventCallback(lambda s=q: s._model) return q ################################################################### qf = Qt.QFrame() qf.setLayout(Qt.QGridLayout()) qf.setMinimumWidth(self.SIZES[0]) qf.setSizePolicy(Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Fixed) #Order changed, it is not clear if it has to be done before or after adding TaurusValue selfect self.setCellWidget(i + self.offset, 0, qf) #print('Adding item: %s, %s, %s, %s, %s' % (model,device,attribute,alias,archived)) if ok: tv = TaurusValue() #TaurusValueLabel() qf.layout().addWidget(tv, 0, 0) tv.setParent(qf) else: self.setItem(i + self.offset, 0, ITEM(model, model)) devlabel = ITEM(device, model, self.SIZES[1]) self.setItem(i + self.offset, 1, devlabel) self.setItem(i + self.offset, 2, ITEM(attribute, model, self.SIZES[2])) self.setItem(i + self.offset, 3, ITEM(alias, model, self.SIZES[3])) from PyTangoArchiving.widget.panel import showArchivingModes, show_history if archived: active = self.reader.is_attribute_archived(model, active=True) txt = '/'.join(a.upper() if a in active else a for a in archived) else: txt = '...' q = Qt.QPushButton(txt) q.setFixedWidth(self.SIZES[-2]) q.setToolTip("""%s<br><br><pre> 'HDB' : Archived and updated, push to export values 'hdb' : Archiving stopped, push to export values '...' : Not archived </pre>""" % txt) self.connect(q, Qt.SIGNAL("pressed ()"), lambda a=self.reader.get_attribute_alias( model), o=q: setattr(q, 'w', show_history(a)) ) #showArchivingModes(a,parent=self))) self.setItem(i + self.offset, 4, q) qc = Qt.QCheckBox() qc.setFixedWidth(self.SIZES[-1]) self.setItem(i + self.offset, 5, qc, 1, 1, Qt.Qt.AlignCenter, model) if ok: #print('Setting Model %s'%model) #ADDING WIDGETS IN BACKGROUND DIDN'T WORKED, I JUST CAN SET MODELS FROM THE WORKER try: if self.worker: self.worker.put([(lambda w=tv, m=model: w.setModel(m)) ]) #print 'worker,put,%s'%str(model) else: tv.setModel(model) except: print traceback.format_exc() self.models.append(tv) #self.widgetbuffer.extend([qf,self.itemAt(i+self.offset,1),self.itemAt(i+self.offset,2),self.itemAt(i+self.offset,3),self.itemAt(i+self.offset,4)]) fandango.threads.Event().wait(.02) if len(values): def setup(o=self): [o.setRowHeight(i, 20) for i in range(o.rowCount())] #o.setColumnWidth(0,350) o.update() o.repaint() #print o.rowCount() o.show() setup(self) if self.worker: print('%s.next()' % (self.worker)) self.worker.next() #threading.Event().wait(10.) tracer('Out of generateTable()') def clear(self): try: #print('In AttributesPanel.clear()') for m in self.models: m.setModel(None) self.models = [] self.setValues(None) #QGridTable.clear(self) def deleteItems(layout): if layout is not None: while layout.count(): item = layout.takeAt(0) widget = item.widget() if widget is not None: widget.deleteLater() else: deleteItems(item.layout()) deleteItems(self.layout()) #l = self.layout() #l.deleteLater() #self.setLayout(Qt.QGridLayout()) except: traceback.print_exc()
class AttributesPanel(PARENT_KLASS): _domains = ['ALL EPS']+['LI','LT']+['LT%02d'%i for i in range(1,3)]+['SR%02d'%i for i in range(1,17)] _fes = [f for f in get_distinct_domains(fn.get_database().get_device_exported('fe*')) if fn.matchCl('fe[0-9]',f)] LABELS = 'Label/Value Device Attribute Alias Archiving Check'.split() SIZES = [500, 150, 90, 90, 120, 40] STRETCH = [8, 4, 4, 4, 2, 1] def __init__(self,parent=None,devices=None): #print '~'*80 tracer('In AttributesPanel()') PARENT_KLASS.__init__(self,parent) self.setSizePolicy(Qt.QSizePolicy(Qt.QSizePolicy.Ignored,Qt.QSizePolicy.Ignored)) self.worker = SingletonWorker(parent=self,cursor=True,sleep=50.,start=True) #self.worker.log.setLogLevel(self.worker.log.Debug) self.filters=('','','') #server/device/attribute self.devices=devices or [] self.setValues(None) self.models = [] self.current_item = None #self.connect(self, Qt.SIGNAL('customContextMenuRequested(const QPoint&)'), self.onContextMenu) self.popMenu = Qt.QMenu(self) self.actions = { 'TestDevice': self.popMenu.addAction(Qt.QIcon(), "Test Device",self.onTestDevice), 'ShowDeviceInfo': self.popMenu.addAction(Qt.QIcon(), "Show Device Info",self.onShowInfo), #'ShowDevicePanel': self.popMenu.addAction(Qt.QIcon(),"Show Info",self.onShowPanel), 'ShowArchivingInfo': self.popMenu.addAction(Qt.QIcon(), "Show Archiving Info",self.onShowArchivingModes), 'AddToTrend': self.popMenu.addAction(Qt.QIcon(), "Add attribute to Trend", self.addAttributeToTrend), 'AddSelected': self.popMenu.addAction(Qt.QIcon(), "Add selected attributes to Trend", self.addSelectedToTrend), 'CheckAll': self.popMenu.addAction(Qt.QIcon(), "Select all attributes", self.checkAll), 'UncheckAll': self.popMenu.addAction(Qt.QIcon(), "Deselect all attributes", self.uncheckAll), #'Test Device': self.popMenu.addAction(Qt.QIcon(),"Test Device",self.onTestDevice) } #if hasattr(self,'setFrameStyle'): #self.setFrameStyle(self.Box) try: import PyTangoArchiving self.reader = PyTangoArchiving.Reader('*') #self.hreader = self.reader.configs['hdb'] #self.treader = self.reader.configs.get('tdb',self.hreader) except: traceback.print_exc() def __del__(self): print 'AttributesPanel.__del__' QGridTable.__del__(self) def setItem(self,x,y,item,spanx=1,spany=1,align=None,model=None): align = align or Qt.Qt.AlignLeft try: if model: item._model = model except: pass self.layout().addWidget(item,x,y,spany,spanx,Qt.Qt.AlignCenter) if item not in self._widgets: self._widgets.append(item) def mousePressEvent(self, event): point = event.pos() widget = Qt.QApplication.instance().widgetAt(self.mapToGlobal(point)) if hasattr(widget,'_model'): print('onMouseEvent(%s)'%(getattr(widget,'text',lambda:widget)())) self.current_item = widget if event.button()==Qt.Qt.RightButton: self.onContextMenu(point) getattr(super(type(self),self),'mousePressEvent',lambda e:None)(event) def onContextMenu(self, point): print('onContextMenu()') try: self.actions['TestDevice'].setEnabled('/' in self.current_item._model) self.actions['ShowDeviceInfo'].setEnabled('/' in self.current_item._model) self.actions['ShowArchivingInfo'].setEnabled('/' in self.current_item._model) self.actions['AddToTrend'].setEnabled(hasattr(self,'trend')) self.actions['AddSelected'].setEnabled(hasattr(self,'trend')) self.popMenu.exec_(self.mapToGlobal(point)) except: traceback.print_exc() def getCurrentModel(self): return '/'.join(str(self.current_item._model).split('/')[-4:]) def getCurrentDevice(self): return str(self.current_item._model.rsplit('/',1)[0]) def onTestDevice(self,device=None): from PyTangoArchiving.widget.panel import showTestDevice showTestDevice(device or self.getCurrentDevice()) def onShowInfo(self,device=None): from PyTangoArchiving.widget.panel import showDeviceInfo showDeviceInfo(device=device or self.getCurrentDevice(),parent=self) def onShowArchivingModes(self,model=None): try: from PyTangoArchiving.widget.panel import showArchivingModes model = model or self.getCurrentModel() showArchivingModes(model,parent=self) except: Qt.QMessageBox.warning(self,"ups!",traceback.format_exc()) def addAttributeToTrend(self,model=None): try: model = model or self.getCurrentModel() self.trend.addModels([model]) except: Qt.QMessageBox.warning(self,"ups!",traceback.format_exc()) def addSelectedToTrend(self): try: y = self.columnCount()-1 models = [] for x in range(self.rowCount()): item = self.itemAt(x,y).widget() m = getattr(item,'_model','') if m and item.isChecked(): models.append(m) if len(models) > 20: Qt.QMessageBox.warning(self,"warning", "To avoid performance issues, dynamic scale will be disabled") self.trend.setXDynScale(False) self.trend.addModels(models) except: Qt.QMessageBox.warning(self,"ups!",traceback.format_exc()) def checkAll(self): y = self.columnCount()-1 for x in range(self.rowCount()): self.itemAt(x,y).widget().setChecked(True) def uncheckAll(self): y = self.columnCount()-1 for x in range(self.rowCount()): self.itemAt(x,y).widget().setChecked(False) def setValues(self,values,filters=None): """ filters will be a tuple containing several regular expressions to match """ #print('In AttributesPanel.setValues([%s])'%len(values or [])) if values is None: self.generateTable([]) elif True: #filters is None: self.generateTable(values) #print 'In AttributesPanel.setValues(...): done' return def generateTable(self,values): #thermocouples = thermocouples if thermocouples is not None else self.thermocouples self.setRowCount(len(values)) self.setColumnCount(5) #self.vheaders = [] self.offset = 0 self.widgetbuffer = [] for i,tc in enumerate(sorted(values)): #print 'setTableRow(%s,%s)'%(i,tc) model,device,attribute,alias,archived,ok = tc model,device,attribute,alias = map(str.upper,(model,device,attribute,alias)) #self.vheaders.append(model) def ITEM(m,model='',size=0): q = fn.qt.Draggable(Qt.QLabel)(m) if size is not 0: q.setMinimumWidth(size) #(.7*950/5.) q._model = model q._archived = archived q.setDragEventCallback(lambda s=q:s._model) return q ################################################################### qf = Qt.QFrame() qf.setLayout(Qt.QGridLayout()) qf.setMinimumWidth(self.SIZES[0]) qf.setSizePolicy(Qt.QSizePolicy.Expanding,Qt.QSizePolicy.Fixed) #Order changed, it is not clear if it has to be done before or after adding TaurusValue selfect self.setCellWidget(i+self.offset,0,qf) #print('Adding item: %s, %s, %s, %s, %s' % (model,device,attribute,alias,archived)) if ok: tv = TaurusValue() #TaurusValueLabel() qf.layout().addWidget(tv,0,0) tv.setParent(qf) else: self.setItem(i+self.offset,0,ITEM(model,model)) devlabel = ITEM(device,model,self.SIZES[1]) self.setItem(i+self.offset,1,devlabel) self.setItem(i+self.offset,2,ITEM(attribute,model,self.SIZES[2])) self.setItem(i+self.offset,3,ITEM(alias,model,self.SIZES[3])) from PyTangoArchiving.widget.panel import showArchivingModes,show_history if archived: active = self.reader.is_attribute_archived(model,active=True) txt = '/'.join(a.upper() if a in active else a for a in archived) else: txt = '...' q = Qt.QPushButton(txt) q.setFixedWidth(self.SIZES[-2]) q.setToolTip("""%s<br><br><pre> 'HDB' : Archived and updated, push to export values 'hdb' : Archiving stopped, push to export values '...' : Not archived </pre>"""%txt) self.connect(q, Qt.SIGNAL("pressed ()"), lambda a=self.reader.get_attribute_alias(model),o=q: setattr(q,'w',show_history(a))) #showArchivingModes(a,parent=self))) self.setItem(i+self.offset,4,q) qc = Qt.QCheckBox() qc.setFixedWidth(self.SIZES[-1]) self.setItem(i+self.offset,5,qc,1,1,Qt.Qt.AlignCenter,model) if ok: #print('Setting Model %s'%model) #ADDING WIDGETS IN BACKGROUND DIDN'T WORKED, I JUST CAN SET MODELS FROM THE WORKER try: if self.worker: self.worker.put([(lambda w=tv,m=model:w.setModel(m))]) #print 'worker,put,%s'%str(model) else: tv.setModel(model) except: print traceback.format_exc() self.models.append(tv) #self.widgetbuffer.extend([qf,self.itemAt(i+self.offset,1),self.itemAt(i+self.offset,2),self.itemAt(i+self.offset,3),self.itemAt(i+self.offset,4)]) fn.threads.Event().wait(.02) if len(values): def setup(o=self): [o.setRowHeight(i,20) for i in range(o.rowCount())] #o.setColumnWidth(0,350) o.update() o.repaint() #print o.rowCount() o.show() setup(self) if self.worker: print( '%s.next()' % (self.worker) ) self.worker.next() #threading.Event().wait(10.) tracer('Out of generateTable()') def clear(self): try: #print('In AttributesPanel.clear()') for m in self.models: m.setModel(None) self.models = [] self.setValues(None) #QGridTable.clear(self) def deleteItems(layout): if layout is not None: while layout.count(): item = layout.takeAt(0) widget = item.widget() if widget is not None: widget.deleteLater() else: deleteItems(item.layout()) deleteItems(self.layout()) #l = self.layout() #l.deleteLater() #self.setLayout(Qt.QGridLayout()) except: traceback.print_exc()