class ElementEditorDock(QDockWidget): def __init__(self, parent, elems=[]): QDockWidget.__init__(self, parent) self.model = None #self.connect(self, SIGNAL('tabCloseRequested(int)'), self.closeTab) #gb = QGroupBox("select") fmbox = QFormLayout() #fmbox.addRow("S-Range", self.lblRange) self.elemBox = QLineEdit() self.elemBox.setToolTip( "list elements within the range of the active plot.<br>" "Examples are '*', 'HCOR', 'BPM', 'QUAD', 'c*c20a', 'q*g2*'") self.elems = elems self.elemCompleter = QCompleter(elems) self.elemBox.setCompleter(self.elemCompleter) #self.elemBox.insertSeparator(len(self.elems)) fmbox.addRow("Filter", self.elemBox) #self.refreshBtn = QPushButton("refresh") #fmbox.addRow(self.elemBox) self.fldGroup = QGroupBox() fmbox2 = QFormLayout() self.lblName = QLabel() self.lblField = QLabel() self.lblStep = QLabel() self.lblRange = QLabel() self.valMeter = Qwt.QwtThermo() self.valMeter.setOrientation(Qt.Horizontal, Qwt.QwtThermo.BottomScale) self.valMeter.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) self.valMeter.setEnabled(False) #fmbox2.addRow("Name", self.lblName) #fmbox2.addRow("Field", self.lblField) fmbox2.addRow("Step", self.lblStep) #fmbox2.addRow("Range", self.valMeter) fmbox2.addRow("Range", self.lblRange) #fmbox2.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow) fmbox2.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) self.fldGroup.setLayout(fmbox2) self.model = None self.delegate = None self.tableview = ElementPropertyView() #self.tableview.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.tableview.setWhatsThis("double click cell to enter editing mode") fmbox.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow) vbox = QVBoxLayout() vbox.addLayout(fmbox) vbox.addWidget(self.tableview) vbox.addWidget(self.fldGroup) cw = QWidget(self) cw.setLayout(vbox) self.setWidget(cw) #self.connect(self.elemBox, SIGNAL("editingFinished()"), # self.refreshTable) self.connect(self.elemBox, SIGNAL("returnPressed()"), self.refreshTable) #self.connect(self.elemBox, SIGNAL("currentIndexChanged(QString)"), # self.refreshTable) self.setWindowTitle("Element Editor") self.noTableUpdate = True def refreshTable(self, txt=None): elemname = str(self.elemBox.text()) if txt is not None: elemname = txt self.elemBox.selectAll() t0 = time.time() #elems = [e for e in self.parent().getVisibleElements(elemname) # if e.family in ['BPM', 'COR', 'HCOR']][:40] elems = self.parent().getVisibleElements(elemname) deadelems = self.parent().getDeadElements() _logger.info("Found elems: {0}".format(len(elems))) QApplication.processEvents() t1 = time.time() if self.model and self.model.rowCount() > 0: del self.model del self.delegate #self.model.clear() self.model = ElementPropertyTableModel(elems) self.connect(self.model, SIGNAL("toggleElementState(PyQt_PyObject, bool)"), self.elementStateChanged) t2 = time.time() self.delegate = ElementPropertyDelegate() self.connect(self.delegate, SIGNAL("editingElement(PyQt_PyObject)"), self.updateCellInfo) #t2 = time.time() self.tableview.reset() self.tableview.setModel(self.model) self.tableview.setItemDelegate(self.delegate) #self.model.load(elems) #print "model size:", self.model.rowCount(), self.model.columnCount() for i in range(self.model.rowCount()): elem, fld, hdl = self.model._elemrec[i] #print i, elem.name, fld, self.model._value[i] if self.model.isHeadIndex(i): self.tableview.setSpan(i, 0, 1, self.model.columnCount()) elif self.tableview.columnSpan(i, 0) > 1: self.tableview.setSpan(i, 0, 1, 1) #idx0 = self.model.index(0, 0) #idx1 = self.model.index(self.model.rowCount() - 1, # self.model.columnCount()-1) #self.model.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"), # idx0, idx1) #for i in range(self.model.columnCount()): #rz = self.tableview.geometry() #fullwidth = sum([self.tableview.columnWidth(i) for i in range(ncol)]) #self.tableview.setMinimumWidth(fullwidth+20) #self.tableview.setMaximumWidth(fullwidth+60) #self.tableview.adjustSize() #self.connect(self.tableview, SIGNAL("clicked(QModelIndex)"), # self.processCell) t3 = time.time() #self._addElements(elems) print "DT:", t1 - t0, t2 - t1, t3 - t2 self.elemBox.deselect() self.tableview.setFocus() self.tableview.resizeColumnToContents(0) for i in range(self.model.columnCount()): w = self.tableview.columnWidth(i) self.tableview.setColumnWidth(i, w + 5) def updateCellInfo(self, elemrec): elem, fld, hdl = elemrec self.lblStep.setText(str(elem.stepSize(fld))) elem.updateBoundary() bd = elem.boundary(fld) if True: self.lblRange.setText(str(bd)) elif bd is None or bd[0] is None or bd[1] is None: self.valMeter.setEnabled(False) else: rg = Qwt.QwtDoubleInterval(bd[0], bd[1]) self.valMeter.setScale(rg, (bd[1] - bd[0]) / 2.01) self.valMeter.setValue(elem.get(fld, unitsys=None)) self.valMeter.setEnabled(True) def elementStateChanged(self, elem, stat): #print "State changed:", elem, stat self.emit(SIGNAL("elementChecked(PyQt_PyObject, bool)"), elem, stat) def processCell(self, index): #print "Process cell", index.row(), index.column() #print " val:", self.model._value[index.row()][index.column()] pass def _addElements(self, elems): #self.setVisible(True) #print "new element:", elemnames #if elems is None: # QMessageBox.warning(self, "Element Not Found", # "element " + str(elemnames) + " not found") # return #print elem.name, elem.sb, elem.fields() #self.tableview.reset() # wid = QWidget() # vbox = QVBoxLayout() # vbox.addWidget(QLabel("Name: %s" % elem.name)) # vbox.addWidget(QLabel("Device: %s" % elem.devname)) # vbox.addWidget(QLabel("Cell: %s" % elem.cell)) # vbox.addWidget(QLabel("Girder: %s" % elem.girder)) # vbox.addWidget(QLabel("sBegin: %.3f" % elem.sb)) # vbox.addWidget(QLabel("Length: %.3f" % elem.length)) # #vbox.addWidget(lb_name) # vbox.addWidget(self.tableview) # wid.setLayout(vbox) # self.addTab(wid, elem.name) #self.adjustSize() pass def closeTab(self, index): self.removeTab(index) if self.count() <= 0: self.setVisible(False) def setEnabled(self, v): self.elemBox.setEnabled(v) #self.refreshBtn.setEnabled(v) def updateModelData(self): pass
class ElementEditorDock(QDockWidget): def __init__(self, parent, elems=[]): QDockWidget.__init__(self, parent) self.model = None #self.connect(self, SIGNAL('tabCloseRequested(int)'), self.closeTab) #gb = QGroupBox("select") fmbox = QFormLayout() #fmbox.addRow("S-Range", self.lblRange) self.elemBox = QLineEdit() self.elemBox.setToolTip( "list elements within the range of the active plot.<br>" "Examples are '*', 'HCOR', 'BPM', 'QUAD', 'c*c20a', 'q*g2*'" ) self.elems = elems self.elemCompleter = QCompleter(elems) self.elemBox.setCompleter(self.elemCompleter) #self.elemBox.insertSeparator(len(self.elems)) fmbox.addRow("Filter", self.elemBox) #self.refreshBtn = QPushButton("refresh") #fmbox.addRow(self.elemBox) self.fldGroup = QGroupBox() fmbox2 = QFormLayout() self.lblName = QLabel() self.lblField = QLabel() self.lblStep = QLabel() self.lblRange = QLabel() self.valMeter = Qwt.QwtThermo() self.valMeter.setOrientation(Qt.Horizontal, Qwt.QwtThermo.BottomScale) self.valMeter.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) self.valMeter.setEnabled(False) #fmbox2.addRow("Name", self.lblName) #fmbox2.addRow("Field", self.lblField) fmbox2.addRow("Step", self.lblStep) #fmbox2.addRow("Range", self.valMeter) fmbox2.addRow("Range", self.lblRange) #fmbox2.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow) fmbox2.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) self.fldGroup.setLayout(fmbox2) self.model = None self.delegate = None self.tableview = ElementPropertyView() #self.tableview.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.tableview.setWhatsThis("double click cell to enter editing mode") fmbox.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow) vbox = QVBoxLayout() vbox.addLayout(fmbox) vbox.addWidget(self.tableview) vbox.addWidget(self.fldGroup) cw = QWidget(self) cw.setLayout(vbox) self.setWidget(cw) #self.connect(self.elemBox, SIGNAL("editingFinished()"), # self.refreshTable) self.connect(self.elemBox, SIGNAL("returnPressed()"), self.refreshTable) #self.connect(self.elemBox, SIGNAL("currentIndexChanged(QString)"), # self.refreshTable) self.setWindowTitle("Element Editor") self.noTableUpdate = True def refreshTable(self, txt = None): elemname = str(self.elemBox.text()) if txt is not None: elemname = txt self.elemBox.selectAll() t0 = time.time() #elems = [e for e in self.parent().getVisibleElements(elemname) # if e.family in ['BPM', 'COR', 'HCOR']][:40] elems = self.parent().getVisibleElements(elemname) deadelems = self.parent().getDeadElements() _logger.info("Found elems: {0}".format(len(elems))) QApplication.processEvents() t1 = time.time() if self.model and self.model.rowCount() > 0: del self.model del self.delegate #self.model.clear() self.model = ElementPropertyTableModel(elems) self.connect(self.model, SIGNAL("toggleElementState(PyQt_PyObject, bool)"), self.elementStateChanged) t2 = time.time() self.delegate = ElementPropertyDelegate() self.connect(self.delegate, SIGNAL("editingElement(PyQt_PyObject)"), self.updateCellInfo) #t2 = time.time() self.tableview.reset() self.tableview.setModel(self.model) self.tableview.setItemDelegate(self.delegate) #self.model.load(elems) #print "model size:", self.model.rowCount(), self.model.columnCount() for i in range(self.model.rowCount()): elem, fld, hdl = self.model._elemrec[i] #print i, elem.name, fld, self.model._value[i] if self.model.isHeadIndex(i): self.tableview.setSpan(i, 0, 1, self.model.columnCount()) elif self.tableview.columnSpan(i, 0) > 1: self.tableview.setSpan(i, 0, 1, 1) #idx0 = self.model.index(0, 0) #idx1 = self.model.index(self.model.rowCount() - 1, # self.model.columnCount()-1) #self.model.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"), # idx0, idx1) #for i in range(self.model.columnCount()): #rz = self.tableview.geometry() #fullwidth = sum([self.tableview.columnWidth(i) for i in range(ncol)]) #self.tableview.setMinimumWidth(fullwidth+20) #self.tableview.setMaximumWidth(fullwidth+60) #self.tableview.adjustSize() #self.connect(self.tableview, SIGNAL("clicked(QModelIndex)"), # self.processCell) t3 = time.time() #self._addElements(elems) print "DT:", t1 - t0, t2 - t1, t3 - t2 self.elemBox.deselect() self.tableview.setFocus() self.tableview.resizeColumnToContents(0) for i in range(self.model.columnCount()): w = self.tableview.columnWidth(i) self.tableview.setColumnWidth(i, w + 5) def updateCellInfo(self, elemrec): elem, fld, hdl = elemrec self.lblStep.setText(str(elem.stepSize(fld))) elem.updateBoundary() bd = elem.boundary(fld) if True: self.lblRange.setText(str(bd)) elif bd is None or bd[0] is None or bd[1] is None: self.valMeter.setEnabled(False) else: rg = Qwt.QwtDoubleInterval(bd[0], bd[1]) self.valMeter.setScale(rg, (bd[1]-bd[0])/2.01) self.valMeter.setValue(elem.get(fld, unitsys = None)) self.valMeter.setEnabled(True) def elementStateChanged(self, elem, stat): #print "State changed:", elem, stat self.emit(SIGNAL("elementChecked(PyQt_PyObject, bool)"), elem, stat) def processCell(self, index): #print "Process cell", index.row(), index.column() #print " val:", self.model._value[index.row()][index.column()] pass def _addElements(self, elems): #self.setVisible(True) #print "new element:", elemnames #if elems is None: # QMessageBox.warning(self, "Element Not Found", # "element " + str(elemnames) + " not found") # return #print elem.name, elem.sb, elem.fields() #self.tableview.reset() # wid = QWidget() # vbox = QVBoxLayout() # vbox.addWidget(QLabel("Name: %s" % elem.name)) # vbox.addWidget(QLabel("Device: %s" % elem.devname)) # vbox.addWidget(QLabel("Cell: %s" % elem.cell)) # vbox.addWidget(QLabel("Girder: %s" % elem.girder)) # vbox.addWidget(QLabel("sBegin: %.3f" % elem.sb)) # vbox.addWidget(QLabel("Length: %.3f" % elem.length)) # #vbox.addWidget(lb_name) # vbox.addWidget(self.tableview) # wid.setLayout(vbox) # self.addTab(wid, elem.name) #self.adjustSize() pass def closeTab(self, index): self.removeTab(index) if self.count() <= 0: self.setVisible(False) def setEnabled(self, v): self.elemBox.setEnabled(v) #self.refreshBtn.setEnabled(v) def updateModelData(self): pass