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()
Пример #2
0
 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()
Пример #4
0
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()