def __init__(self): self.q_ptr = None self.m_indexToItem = QMap() self.m_itemToIndex = QMap() self.m_widgetToItem = QMap() self.m_mainLayout = 0 self.m_children = QList() self.m_recreateQueue = QList()
def __init__(self): self.widget = 0# can be null self.label = 0 self.widgetLabel = 0 self.groupBox = 0 self.layout = 0 self.line = 0 self.parent = None self.children = QList()
def __init__(self): self.m_cursorNames = QList() self.m_cursorIcons = QMap() self.m_valueToCursorShape = QMap() self.m_cursorShapeToValue = QMap() self.appendCursor(Qt.ArrowCursor, QCoreApplication.translate("QtCursorDatabase", "Arrow"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-arrow.png")) self.appendCursor(Qt.UpArrowCursor, QCoreApplication.translate("QtCursorDatabase", "Up Arrow"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-uparrow.png")) self.appendCursor(Qt.CrossCursor, QCoreApplication.translate("QtCursorDatabase", "Cross"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-cross.png")) self.appendCursor(Qt.WaitCursor, QCoreApplication.translate("QtCursorDatabase", "Wait"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-wait.png")) self.appendCursor(Qt.IBeamCursor, QCoreApplication.translate("QtCursorDatabase", "IBeam"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-ibeam.png")) self.appendCursor(Qt.SizeVerCursor, QCoreApplication.translate("QtCursorDatabase", "Size Vertical"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizev.png")) self.appendCursor(Qt.SizeHorCursor, QCoreApplication.translate("QtCursorDatabase", "Size Horizontal"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeh.png")) self.appendCursor(Qt.SizeFDiagCursor, QCoreApplication.translate("QtCursorDatabase", "Size Backslash"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizef.png")) self.appendCursor(Qt.SizeBDiagCursor, QCoreApplication.translate("QtCursorDatabase", "Size Slash"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeb.png")) self.appendCursor(Qt.SizeAllCursor, QCoreApplication.translate("QtCursorDatabase", "Size All"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeall.png")) self.appendCursor(Qt.BlankCursor, QCoreApplication.translate("QtCursorDatabase", "Blank"), QIcon()) self.appendCursor(Qt.SplitVCursor, QCoreApplication.translate("QtCursorDatabase", "Split Vertical"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-vsplit.png")) self.appendCursor(Qt.SplitHCursor, QCoreApplication.translate("QtCursorDatabase", "Split Horizontal"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-hsplit.png")) self.appendCursor(Qt.PointingHandCursor, QCoreApplication.translate("QtCursorDatabase", "Pointing Hand"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-hand.png")) self.appendCursor(Qt.ForbiddenCursor, QCoreApplication.translate("QtCursorDatabase", "Forbidden"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-forbidden.png")) self.appendCursor(Qt.OpenHandCursor, QCoreApplication.translate("QtCursorDatabase", "Open Hand"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-openhand.png")) self.appendCursor(Qt.ClosedHandCursor, QCoreApplication.translate("QtCursorDatabase", "Closed Hand"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-closedhand.png")) self.appendCursor(Qt.WhatsThisCursor, QCoreApplication.translate("QtCursorDatabase", "What's This"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-whatsthis.png")) self.appendCursor(Qt.BusyCursor, QCoreApplication.translate("QtCursorDatabase", "Busy"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-busy.png"))
def __init__(self): self.label = 0 self.widgetLabel = 0 self.button = 0 self.container = 0 self.layout = 0 self.parent = None self.children = QList() self.expanded = False self.widget = 0 # can be null
def init(self, parent): layout = QHBoxLayout(parent) layout.setContentsMargins(0, 0, 0, 0) self.m_treeWidget = QtPropertyEditorView(parent) self.m_treeWidget.setEditorPrivate(self) self.m_treeWidget.setIconSize(QSize(18, 18)) layout.addWidget(self.m_treeWidget) parent.setFocusProxy(self.m_treeWidget) self.m_treeWidget.setColumnCount(2) labels = QList() labels.append( QCoreApplication.translate("QtTreePropertyBrowser", "Property")) labels.append( QCoreApplication.translate("QtTreePropertyBrowser", "Value")) self.m_treeWidget.setHeaderLabels(labels) self.m_treeWidget.setAlternatingRowColors(True) self.m_treeWidget.setEditTriggers(QAbstractItemView.EditKeyPressed) self.m_delegate = QtPropertyEditorDelegate(parent) self.m_delegate.setEditorPrivate(self) self.m_treeWidget.setItemDelegate(self.m_delegate) self.m_treeWidget.header().setSectionsMovable(False) self.m_treeWidget.header().setSectionResizeMode(QHeaderView.Stretch) self.m_expandIcon = drawIndicatorIcon(self.q_ptr.palette(), self.q_ptr.style()) self.m_treeWidget.collapsed.connect(self.slotCollapsed) self.m_treeWidget.expanded.connect(self.slotExpanded) self.m_treeWidget.currentItemChanged.connect( self.slotCurrentTreeItemChanged)
def gridRow(self, item): siblings = QList() if (item.parent): siblings = item.parent.children else: siblings = self.m_children row = 0 for sibling in siblings: if (sibling == item): return row row += self.gridSpan(sibling) return -1
class QtButtonPropertyBrowserPrivate(): def __init__(self): self.q_ptr = None self.WidgetItem = WidgetItem() self.m_indexToItem = QMap() self.m_itemToIndex = QMap() self.m_widgetToItem = QMap() self.m_buttonToItem = QMap() self.m_mainLayout = None self.m_children = QList() self.m_recreateQueue = QList() def createEditor(self, property, parent): return self.q_ptr.createEditor(property, parent) def createButton(self, parent=None): button = QToolButton(parent) button.setCheckable(True) button.setSizePolicy( QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)) button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) button.setArrowType(Qt.DownArrow) button.setIconSize(QSize(3, 16)) ### #QIcon icon #icon.addPixmap(self.style().standardPixmap(QStyle.SP_ArrowDown), QIcon.Normal, QIcon.Off) #icon.addPixmap(self.style().standardPixmap(QStyle.SP_ArrowUp), QIcon.Normal, QIcon.On) #button.setIcon(icon) ### return button def gridRow(self, item): siblings = QList() if (item.parent): siblings = item.parent.children else: siblings = self.m_children row = 0 for sibling in siblings: if (sibling == item): return row row += self.gridSpan(sibling) return -1 def gridSpan(self, item): if (item.container and item.expanded): return 2 return 1 def init(self, parent): self.m_mainLayout = QGridLayout() parent.setLayout(self.m_mainLayout) item = QSpacerItem(0, 0, QSizePolicy.Fixed, QSizePolicy.Expanding) self.m_mainLayout.addItem(item, 0, 0) def slotEditorDestroyed(self): editor = self.q_ptr.sender() if (not editor): return if not self.m_widgetToItem.get(editor): return self.m_widgetToItem[editor].widget = 0 self.m_widgetToItem.remove(editor) def slotUpdate(self): for item in self.m_recreateQueue: parent = item.parent w = 0 l = 0 oldRow = self.gridRow(item) if (parent): w = parent.container l = parent.layout else: w = self.q_ptr l = self.m_mainLayout span = 1 if (not item.widget and not item.widgetLabel): span = 2 item.label = QLabel(w) item.label.setSizePolicy( QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) l.addWidget(item.label, oldRow, 0, 1, span) self.updateItem(item) self.m_recreateQueue.clear() def setExpanded(self, item, expanded): if (item.expanded == expanded): return if (not item.container): return item.expanded = expanded row = self.gridRow(item) parent = item.parent l = 0 if (parent): l = parent.layout else: l = self.m_mainLayout if (expanded): self.insertRow(l, row + 1) l.addWidget(item.container, row + 1, 0, 1, 2) item.container.show() else: l.removeWidget(item.container) item.container.hide() self.removeRow(l, row + 1) item.button.setChecked(expanded) if expanded: item.button.setArrowType(Qt.UpArrow) else: item.button.setArrowType(Qt.DownArrow) def slotToggled(self, checked): item = self.m_buttonToItem[self.q_ptr.sender()] if (not item): return self.setExpanded(item, checked) if (checked): self.q_ptr.expandedSignal.emit(self.m_itemToIndex[item]) else: self.q_ptr.collapsedSignal.emit(self.m_itemToIndex[item]) def updateLater(self): QTimer.singleShot(0, self.slotUpdate) def propertyInserted(self, index, afterIndex): afterItem = self.m_indexToItem[afterIndex] parentItem = self.m_indexToItem.value(index.parent()) newItem = WidgetItem() newItem.parent = parentItem layout = 0 parentWidget = 0 row = -1 if (not afterItem): row = 0 if (parentItem): parentItem.children.insert(0, newItem) else: self.m_children.insert(0, newItem) else: row = self.gridRow(afterItem) + self.gridSpan(afterItem) if (parentItem): parentItem.children.insert( parentItem.children.indexOf(afterItem) + 1, newItem) else: self.m_children.insert( self.m_children.indexOf(afterItem) + 1, newItem) if (not parentItem): layout = self.m_mainLayout parentWidget = self.q_ptr else: if (not parentItem.container): self.m_recreateQueue.removeAll(parentItem) grandParent = parentItem.parent l = 0 oldRow = self.gridRow(parentItem) if (grandParent): l = grandParent.layout else: l = self.m_mainLayout container = QFrame() container.setFrameShape(QFrame.Panel) container.setFrameShadow(QFrame.Raised) parentItem.container = container parentItem.button = self.createButton() self.m_buttonToItem[parentItem.button] = parentItem parentItem.button.toggled.connect(self.slotToggled) parentItem.layout = QGridLayout() container.setLayout(parentItem.layout) if (parentItem.label): l.removeWidget(parentItem.label) parentItem.label.close() parentItem.label = 0 span = 1 if (not parentItem.widget and not parentItem.widgetLabel): span = 2 l.addWidget(parentItem.button, oldRow, 0, 1, span) self.updateItem(parentItem) layout = parentItem.layout parentWidget = parentItem.container newItem.label = QLabel(parentWidget) newItem.label.setSizePolicy( QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) newItem.widget = self.createEditor(index.property(), parentWidget) if (newItem.widget): newItem.widget.destroyed.connect(self.slotEditorDestroyed) self.m_widgetToItem[newItem.widget] = newItem elif (index.property().hasValue()): newItem.widgetLabel = QLabel(parentWidget) newItem.widgetLabel.setSizePolicy( QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)) self.insertRow(layout, row) span = 1 if (newItem.widget): layout.addWidget(newItem.widget, row, 1) elif (newItem.widgetLabel): layout.addWidget(newItem.widgetLabel, row, 1) else: span = 2 layout.addWidget(newItem.label, row, 0, span, 1) self.m_itemToIndex[newItem] = index self.m_indexToItem[index] = newItem self.updateItem(newItem) def propertyRemoved(self, index): item = self.m_indexToItem[index] self.m_indexToItem.remove(index) self.m_itemToIndex.remove(item) parentItem = item.parent row = self.gridRow(item) if (parentItem): parentItem.children.removeAt(parentItem.children.indexOf(item)) else: self.m_children.removeAt(self.m_children.indexOf(item)) colSpan = self.gridSpan(item) self.m_buttonToItem.remove(item.button) if (item.widget): item.widget.close() del item.widget if (item.label): item.label.close() del item.label if (item.widgetLabel): item.widgetLabel.close() del item.widgetLabel if (item.button): item.button.close() del item.button if (item.container): item.container.close() del item.container if (not parentItem): self.removeRow(self.m_mainLayout, row) if (colSpan > 1): self.removeRow(self.m_mainLayout, row) elif (len(parentItem.children) != 0): self.removeRow(parentItem.layout, row) if (colSpan > 1): self.removeRow(parentItem.layout, row) else: grandParent = parentItem.parent l = 0 if (grandParent): l = grandParent.layout else: l = self.m_mainLayout parentRow = self.gridRow(parentItem) parentSpan = self.gridSpan(parentItem) l.removeWidget(parentItem.button) l.removeWidget(parentItem.container) parentItem.button.close() del parentItem.button parentItem.container.close() del parentItem.container parentItem.button = 0 parentItem.container = 0 parentItem.layout = 0 if (not parentItem in self.m_recreateQueue): self.m_recreateQueue.append(parentItem) if (parentSpan > 1): self.removeRow(l, parentRow + 1) self.updateLater() self.m_recreateQueue.removeAll(item) del item def insertRow(self, layout, row): itemToPos = QMap() idx = 0 while (idx < len(layout)): r, c, rs, cs = layout.getItemPosition(idx) if (r >= row): itemToPos[layout.takeAt(idx)] = QRect(r + 1, c, rs, cs) else: idx += 1 for k in itemToPos.keys(): r = itemToPos[k] layout.addItem(k, r.x(), r.y(), r.width(), r.height()) def removeRow(self, layout, row): itemToPos = QMap() idx = 0 while (idx < len(layout)): r, c, rs, cs = layout.getItemPosition(idx) if (r > row): itemToPos[layout.takeAt(idx)] = QRect(r - 1, c, rs, cs) else: idx += 1 for k in itemToPos.keys(): r = itemToPos[k] layout.addItem(k, r.x(), r.y(), r.width(), r.height()) def propertyChanged(self, index): item = self.m_indexToItem[index] self.updateItem(item) def updateItem(self, item): property = self.m_itemToIndex[item].property() if (item.button): font = item.button.font() font.setUnderline(property.isModified()) item.button.setFont(font) item.button.setText(property.propertyName()) item.button.setToolTip(property.toolTip()) item.button.setStatusTip(property.statusTip()) item.button.setWhatsThis(property.whatsThis()) item.button.setEnabled(property.isEnabled()) if (item.label): font = item.label.font() font.setUnderline(property.isModified()) item.label.setFont(font) item.label.setText(property.propertyName()) item.label.setToolTip(property.toolTip()) item.label.setStatusTip(property.statusTip()) item.label.setWhatsThis(property.whatsThis()) item.label.setEnabled(property.isEnabled()) if (item.widgetLabel): font = item.widgetLabel.font() font.setUnderline(False) item.widgetLabel.setFont(font) item.widgetLabel.setText(property.valueText()) item.widgetLabel.setToolTip(property.valueText()) item.widgetLabel.setEnabled(property.isEnabled()) if (item.widget): font = item.widget.font() font.setUnderline(False) item.widget.setFont(font) item.widget.setEnabled(property.isEnabled()) item.widget.setToolTip(property.valueText())
class QtCursorDatabase(): def __init__(self): self.m_cursorNames = QList() self.m_cursorIcons = QMap() self.m_valueToCursorShape = QMap() self.m_cursorShapeToValue = QMap() self.appendCursor(Qt.ArrowCursor, QCoreApplication.translate("QtCursorDatabase", "Arrow"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-arrow.png")) self.appendCursor(Qt.UpArrowCursor, QCoreApplication.translate("QtCursorDatabase", "Up Arrow"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-uparrow.png")) self.appendCursor(Qt.CrossCursor, QCoreApplication.translate("QtCursorDatabase", "Cross"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-cross.png")) self.appendCursor(Qt.WaitCursor, QCoreApplication.translate("QtCursorDatabase", "Wait"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-wait.png")) self.appendCursor(Qt.IBeamCursor, QCoreApplication.translate("QtCursorDatabase", "IBeam"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-ibeam.png")) self.appendCursor(Qt.SizeVerCursor, QCoreApplication.translate("QtCursorDatabase", "Size Vertical"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizev.png")) self.appendCursor(Qt.SizeHorCursor, QCoreApplication.translate("QtCursorDatabase", "Size Horizontal"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeh.png")) self.appendCursor(Qt.SizeFDiagCursor, QCoreApplication.translate("QtCursorDatabase", "Size Backslash"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizef.png")) self.appendCursor(Qt.SizeBDiagCursor, QCoreApplication.translate("QtCursorDatabase", "Size Slash"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeb.png")) self.appendCursor(Qt.SizeAllCursor, QCoreApplication.translate("QtCursorDatabase", "Size All"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeall.png")) self.appendCursor(Qt.BlankCursor, QCoreApplication.translate("QtCursorDatabase", "Blank"), QIcon()) self.appendCursor(Qt.SplitVCursor, QCoreApplication.translate("QtCursorDatabase", "Split Vertical"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-vsplit.png")) self.appendCursor(Qt.SplitHCursor, QCoreApplication.translate("QtCursorDatabase", "Split Horizontal"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-hsplit.png")) self.appendCursor(Qt.PointingHandCursor, QCoreApplication.translate("QtCursorDatabase", "Pointing Hand"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-hand.png")) self.appendCursor(Qt.ForbiddenCursor, QCoreApplication.translate("QtCursorDatabase", "Forbidden"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-forbidden.png")) self.appendCursor(Qt.OpenHandCursor, QCoreApplication.translate("QtCursorDatabase", "Open Hand"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-openhand.png")) self.appendCursor(Qt.ClosedHandCursor, QCoreApplication.translate("QtCursorDatabase", "Closed Hand"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-closedhand.png")) self.appendCursor(Qt.WhatsThisCursor, QCoreApplication.translate("QtCursorDatabase", "What's This"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-whatsthis.png")) self.appendCursor(Qt.BusyCursor, QCoreApplication.translate("QtCursorDatabase", "Busy"), QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-busy.png")) def clear(self): self.m_cursorNames.clear() self.m_cursorIcons.clear() self.m_valueToCursorShape.clear() self.m_cursorShapeToValue.clear() def appendCursor(self,shape, name, icon): if self.m_cursorShapeToValue.get(shape): return value = len(self.m_cursorNames) self.m_cursorNames.append(name) self.m_cursorIcons[value] = icon self.m_valueToCursorShape[value] = shape self.m_cursorShapeToValue[shape] = value def cursorShapeNames(self): return self.m_cursorNames def cursorShapeIcons(self): return self.m_cursorIcons def cursorToShapeName(self,cursor): val = self.cursorToValue(cursor) if val >= 0: return self.m_cursorNames[val] return '' def cursorToShapeIcon(self,cursor): val = self.cursorToValue(cursor) return self.m_cursorIcons[val] def cursorToValue(self,cursor): shape = cursor.shape() return self.m_cursorShapeToValue.get(shape, -1) def valueToCursor(self,value): if value in self.m_valueToCursorShape: return QCursor(self.m_valueToCursorShape[value]) return QCursor()
class QtGroupBoxPropertyBrowserPrivate(): def __init__(self): self.q_ptr = None self.m_indexToItem = QMap() self.m_itemToIndex = QMap() self.m_widgetToItem = QMap() self.m_mainLayout = 0 self.m_children = QList() self.m_recreateQueue = QList() def createEditor(self, property, parent): return self.q_ptr.createEditor(property, parent) def init(self, parent): self.m_mainLayout = QGridLayout() parent.setLayout(self.m_mainLayout) item = QSpacerItem(0, 0, QSizePolicy.Fixed, QSizePolicy.Expanding) self.m_mainLayout.addItem(item, 0, 0) def slotEditorDestroyed(self): editor = self.q_ptr.sender() if (not editor): return if (not editor in self.m_widgetToItem.keys()): return self.m_widgetToItem[editor].widget = 0 self.m_widgetToItem.remove(editor) def slotUpdate(self): for item in self.m_recreateQueue: par = item.parent w = 0 l = 0 oldRow = -1 if (not par): w = self.q_ptr l = self.m_mainLayout oldRow = self.m_children.indexOf(item) else: w = par.groupBox l = par.layout oldRow = par.children.indexOf(item) if (self.hasHeader(par)): oldRow += 2 if (item.widget): item.widget.setParent(w) elif (item.widgetLabel): item.widgetLabel.setParent(w) else: item.widgetLabel = QLabel(w) item.widgetLabel.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)) item.widgetLabel.setTextFormat(Qt.PlainText) span = 1 if (item.widget): l.addWidget(item.widget, oldRow, 1, 1, 1) elif (item.widgetLabel): l.addWidget(item.widgetLabel, oldRow, 1, 1, 1) else: span = 2 item.label = QLabel(w) item.label.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) l.addWidget(item.label, oldRow, 0, 1, span) self.updateItem(item) self.m_recreateQueue.clear() def updateLater(self): QTimer.singleShot(0, self.q_ptr, self.slotUpdate()) def propertyInserted(self, index, afterIndex): afterItem = self.m_indexToItem[afterIndex] parentItem = self.m_indexToItem.value(index.parent()) newItem = WidgetItem() newItem.parent = parentItem layout = 0 parentWidget = 0 row = -1 if (not afterItem): row = 0 if (parentItem): parentItem.children.insert(0, newItem) else: self.m_children.insert(0, newItem) else: if (parentItem): row = parentItem.children.indexOf(afterItem) + 1 parentItem.children.insert(row, newItem) else: row = self.m_children.indexOf(afterItem) + 1 self.m_children.insert(row, newItem) if (parentItem and self.hasHeader(parentItem)): row += 2 if (not parentItem): layout = self.m_mainLayout parentWidget = self.q_ptr else: if not parentItem.groupBox: self.m_recreateQueue.removeAll(parentItem) par = parentItem.parent w = 0 l = 0 oldRow = -1 if (not par): w = self.q_ptr l = self.m_mainLayout oldRow = self.m_children.indexOf(parentItem) else: w = par.groupBox l = par.layout oldRow = par.children.indexOf(parentItem) if (self.hasHeader(par)): oldRow += 2 parentItem.groupBox = QGroupBox(w) parentItem.layout = QGridLayout() parentItem.groupBox.setLayout(parentItem.layout) if (parentItem.label): l.removeWidget(parentItem.label) parentItem.label.close() parentItem.label = 0 if (parentItem.widget): l.removeWidget(parentItem.widget) parentItem.widget.setParent(parentItem.groupBox) parentItem.layout.addWidget(parentItem.widget, 0, 0, 1, 2) parentItem.line = QFrame(parentItem.groupBox) elif (parentItem.widgetLabel): l.removeWidget(parentItem.widgetLabel) parentItem.widgetLabel.close() parentItem.widgetLabel = 0 if (parentItem.line): parentItem.line.setFrameShape(QFrame.HLine) parentItem.line.setFrameShadow(QFrame.Sunken) parentItem.layout.addWidget(parentItem.line, 1, 0, 1, 2) l.addWidget(parentItem.groupBox, oldRow, 0, 1, 2) self.updateItem(parentItem) layout = parentItem.layout parentWidget = parentItem.groupBox newItem.label = QLabel(parentWidget) newItem.label.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) newItem.widget = self.createEditor(index.property(), parentWidget) if (not newItem.widget): newItem.widgetLabel = QLabel(parentWidget) newItem.widgetLabel.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)) newItem.widgetLabel.setTextFormat(Qt.PlainText) else: newItem.widget.destroyed.connect(self.slotEditorDestroyed) self.m_widgetToItem[newItem.widget] = newItem self.insertRow(layout, row) span = 1 if (newItem.widget): layout.addWidget(newItem.widget, row, 1) elif (newItem.widgetLabel): layout.addWidget(newItem.widgetLabel, row, 1) else: span = 2 layout.addWidget(newItem.label, row, 0, 1, span) self.m_itemToIndex[newItem] = index self.m_indexToItem[index] = newItem self.updateItem(newItem) def propertyRemoved(self, index): item = self.m_indexToItem[index] self.m_indexToItem.remove(index) self.m_itemToIndex.remove(item) parentItem = item.parent row = -1 if (parentItem): row = parentItem.children.indexOf(item) parentItem.children.removeAt(row) if (self.hasHeader(parentItem)): row += 2 else: row = self.m_children.indexOf(item) self.m_children.removeAt(row) if (item.widget): item.widget.close() del item.widget if (item.label): item.label.close() del item.label if (item.widgetLabel): item.widgetLabel.close() del item.widgetLabel if (item.groupBox): item.groupBox.close() del item.groupBox if (not parentItem): self.removeRow(self.m_mainLayout, row) elif len(parentItem.children) > 0: self.removeRow(parentItem.layout, row) else: par = parentItem.parent l = 0 oldRow = -1 if (not par): l = self.m_mainLayout oldRow = self.m_children.indexOf(parentItem) else: l = par.layout oldRow = par.children.indexOf(parentItem) if (self.hasHeader(par)): oldRow += 2 if (parentItem.widget): parentItem.widget.hide() parentItem.widget.setParent(0) elif (parentItem.widgetLabel): parentItem.widgetLabel.hide() parentItem.widgetLabel.setParent(0) else: #parentItem.widgetLabel = QLabel(w) pass l.removeWidget(parentItem.groupBox) parentItem.groupBox.close() parentItem.groupBox = 0 parentItem.line = 0 parentItem.layout = 0 if (not parentItem in self.m_recreateQueue): self.m_recreateQueue.append(parentItem) self.updateLater() self.m_recreateQueue.removeAll(item) del item def insertRow(self, layout, row): itemToPos = QMap() idx = 0 while (idx < layout.count()): r, c, rs, cs = layout.getItemPosition(idx) if (r >= row): itemToPos[layout.takeAt(idx)] = QRect(r + 1, c, rs, cs) else: idx += 1 for it in itemToPos.keys(): r = itemToPos[it] layout.addItem(it, r.x(), r.y(), r.width(), r.height()) def removeRow(self, layout, row): itemToPos = QMap() idx = 0 while (idx < layout.count()): r, c, rs, cs = layout.getItemPosition(idx) if (r > row): itemToPos[layout.takeAt(idx)] = QRect(r - 1, c, rs, cs) else: idx += 1 for it in itemToPos.keys(): r = itemToPos[it] layout.addItem(it, r.x(), r.y(), r.width(), r.height()) def hasHeader(self, item): if (item.widget): return True return False def propertyChanged(self, index): item = self.m_indexToItem[index] self.updateItem(item) def updateItem(self, item): property = self.m_itemToIndex[item].property() if (item.groupBox): font = item.groupBox.font() font.setUnderline(property.isModified()) item.groupBox.setFont(font) item.groupBox.setTitle(property.propertyName()) item.groupBox.setToolTip(property.toolTip()) item.groupBox.setStatusTip(property.statusTip()) item.groupBox.setWhatsThis(property.whatsThis()) item.groupBox.setEnabled(property.isEnabled()) if (item.label): font = item.label.font() font.setUnderline(property.isModified()) item.label.setFont(font) item.label.setText(property.propertyName()) item.label.setToolTip(property.toolTip()) item.label.setStatusTip(property.statusTip()) item.label.setWhatsThis(property.whatsThis()) item.label.setEnabled(property.isEnabled()) if (item.widgetLabel): font = item.widgetLabel.font() font.setUnderline(False) item.widgetLabel.setFont(font) item.widgetLabel.setText(property.valueText()) item.widgetLabel.setToolTip(property.valueText()) item.widgetLabel.setEnabled(property.isEnabled()) if (item.widget): font = item.widget.font() font.setUnderline(False) item.widget.setFont(font) item.widget.setEnabled(property.isEnabled()) item.widget.setToolTip(property.valueText())