createLayout = QHBoxLayout() layout.addLayout(createLayout) createButton = QPushButton("Create") createLayout.addWidget(createButton) createLayout.addStretch() layout.addStretch() doneButton = QPushButton("Done") doneButton.setParent(widget) createLayout.insertWidget(0, doneButton) doneButton.hide() createButton.hide() doneButton.show() doneButton.hide() createButton.show() nameToCreate = QLineEdit() nameToCreate.setParent(widget) createLayout.insertWidget(createLayout.count()-2, nameToCreate) doneButton.hide() nameToCreate.hide()
class FormWidget(FormPage): instanceAssigned = Signal(str) instanceDeleted = Signal(str) instanceSaved = Signal(str) exception = Signal(str) def __init__(self, parent = None, buttons = FormButtons.EditButtons): super(FormWidget, self).__init__(parent) self.buildButtonBox(buttons) self.tabs = None self._tabs = {} def buildButtonBox(self, buttons): buttonWidget = QGroupBox() self.buttonbox = QHBoxLayout(buttonWidget) if buttons & FormButtons.DeleteButton: self.deletebutton = QPushButton("Delete", self) self.deletebutton.clicked.connect(self.deleteInstance) self.buttonbox.addWidget(self.deletebutton) self.buttonbox.addStretch(1) if buttons & FormButtons.ResetButton: self.resetbutton = QPushButton("Reset", self) self.resetbutton.clicked.connect(self.setInstance) self.buttonbox.addWidget(self.resetbutton) if buttons & FormButtons.SaveButton: self.savebutton = QPushButton("Save", self) self.savebutton.clicked.connect(self.save) self.buttonbox.addWidget(self.savebutton) self.layout().addWidget(buttonWidget) def addWidgetToButtonBox(self, widget, *args): self.buttonbox.insertWidget(0, widget, *args) def addTab(self, widget, title): if self.tabs is None: self.tabs = QTabWidget(self) self.tabs.currentChanged[int].connect(self.tabChanged) # Remove stretch at the bottom: self._removeStretch() self.vbox.addWidget(self.tabs, 1) if isinstance(widget, FormPage): self.form.addSubLayout(widget.form) self.tabs.addTab(widget, title) self._tabs[title] = widget return widget def count(self): return self.tabs and self.tabs.count() def setTab(self, tab): if self.tabs and tab <= self.tabs.count(): self.tabs.setCurrentIndex(tab) def tabChanged(self, ix): w = self.tabs.currentWidget() if hasattr(w, "selected"): w.selected() def save(self): try: self.form.retrieve(self.instance()) if hasattr(self, "retrieve") and callable(self.retrieve): self.retrieve(self.instance()) self.instanceSaved.emit(str(self.instance.key())) self.statusMessage.emit("Saved") except: self.exception.emit("Save failed...") self.setInstance() def instance(self): return self._instance def setInstance(self, instance = None): if instance: self._instance = instance self.form.apply(self.instance()) if hasattr(self, "assign") and callable(self.assign): self.assign(self.instance()) self.instanceAssigned.emit(str(self.instance().key())) def confirmDelete(self): return QMessageBox.warning(self, "Are you sure?", "Are you sure you want to delete this?", QMessageBox.Cancel | QMessageBox.Ok, QMessageBox.Cancel) == QMessageBox.Ok def onDelete(self): try: with gripe.db.Tx.begin(): key = str(self.instance().key()) if grumble.model.delete(self.instance()): self.instanceDeleted.emit(key) except: traceback.print_exc() self.exception.emit("Delete failed...") def deleteInstance(self): if self.instance() and self.confirmDelete(): self.onDelete()