def buildWidget(self): """Create the widget and populate it.""" self._currentFigure = None # Create enclosing widget and UI self._widget = QWidget() self._ui = Ui_EditFigureDialog() self._ui.setupUi(self._widget) self.setModels() # Connect signals for buttons at top of widget self._ui.addFigureButton.clicked.connect(self.createFigure) self._ui.showFigureButton.clicked.connect(self.showFigure) self._ui.deleteFigureButton.clicked.connect(self.deleteFigure) # Setup figure tab self._figureTab = QFigureOptionsWidget(self._widget) figureOW = Ui_FigureOptionsWidget() figureOW.setupUi(self._figureTab) self._figureTab.setUiObject(figureOW) self._figureTab.setEditFigureDialogModule(self) self._ui.tabWidget.insertTab(0, self._figureTab, "Figure") # Setup plot tab self._plotTab = QPlotOptionsWidget(self._widget) plotOW = Ui_PlotOptionsWidget() plotOW.setupUi(self._plotTab) self._plotTab.setUiObject(plotOW) self._plotTab.setEditFigureDialogModule(self) self._plotTab.initPlotSelector() self._plotTab.initSubWidgets() self._ui.tabWidget.insertTab(1, self._plotTab, "Plot") # If the number of rows or columns is changed, then we need to refresh the plot list # It's simpler to just always check this when the Apply button is pressed figureOW.buttons.button(QDialogButtonBox.Apply).clicked.connect(self._plotTab.refreshPlotSelector) # Make sure that the figure tab is initially displayed self._ui.tabWidget.setCurrentIndex(0)
class EditFigureDialog(Module): """Module to display the Edit Figure dialog window.""" def __init__(self): Module.__init__(self) def buildWidget(self): """Create the widget and populate it.""" self._currentFigure = None # Create enclosing widget and UI self._widget = QWidget() self._ui = Ui_EditFigureDialog() self._ui.setupUi(self._widget) self.setModels() # Connect signals for buttons at top of widget self._ui.addFigureButton.clicked.connect(self.createFigure) self._ui.showFigureButton.clicked.connect(self.showFigure) self._ui.deleteFigureButton.clicked.connect(self.deleteFigure) # Setup figure tab self._figureTab = QFigureOptionsWidget(self._widget) figureOW = Ui_FigureOptionsWidget() figureOW.setupUi(self._figureTab) self._figureTab.setUiObject(figureOW) self._figureTab.setEditFigureDialogModule(self) self._ui.tabWidget.insertTab(0, self._figureTab, "Figure") # Setup plot tab self._plotTab = QPlotOptionsWidget(self._widget) plotOW = Ui_PlotOptionsWidget() plotOW.setupUi(self._plotTab) self._plotTab.setUiObject(plotOW) self._plotTab.setEditFigureDialogModule(self) self._plotTab.initPlotSelector() self._plotTab.initSubWidgets() self._ui.tabWidget.insertTab(1, self._plotTab, "Plot") # If the number of rows or columns is changed, then we need to refresh the plot list # It's simpler to just always check this when the Apply button is pressed figureOW.buttons.button(QDialogButtonBox.Apply).clicked.connect(self._plotTab.refreshPlotSelector) # Make sure that the figure tab is initially displayed self._ui.tabWidget.setCurrentIndex(0) def setModels(self): # Setup figure list self._figureListModel = FigureListModel(self._app.figures()) self._ui.figureSelector.setModel(self._figureListModel) self._ui.figureSelector.currentIndexChanged[int].connect(self.changeCurrentFigure) self._app.figures().figureAdded.connect(self._figureListModel.doReset) self._app.figures().figureRemoved.connect(self._figureListModel.doReset) self._app.figures().figureRenamed.connect(self.updateFigureSelectorBox) # # Handlers for the three buttons at the top of the widget # def createFigure(self): figure = Figure("NewFigure") self._app.figures().addFigure(figure) # Select figure self._ui.figureSelector.setCurrentIndex(self._ui.figureSelector.model().rowCount() - 1) def showFigure(self): """Display the figure, in case it got hidden.""" if self.currentFigure(): self.currentFigure().showFigure() def deleteFigure(self): """ Delete button has been pressed. Make sure the user really wants to delete the figure. """ figure = self.currentFigure() # Make sure we are on a valid figure if not figure: return False # Ask user if they really want to delete the figure questionMessage = QMessageBox() questionMessage.setIcon(QMessageBox.Question) questionMessage.setText("You are about to delete a figure.") questionMessage.setInformativeText("Are you sure this is what you want to do?") questionMessage.setStandardButtons(QMessageBox.Yes | QMessageBox.No) questionMessage.setDefaultButton(QMessageBox.No) answer = questionMessage.exec_() if answer == QMessageBox.Yes: figure.hideFigure() self._app.figures().removeFigure(figure) self.changeCurrentFigure(0) self.updateFigureSelectorIndex(0) # # Get current items # def currentFigure(self): return self._currentFigure def changeCurrentFigure(self, index): if index < 0: return self._currentFigure = self._ui.figureSelector.model().getFigure(index) self._figureTab.resetUi() self._plotTab.setFigure(self._currentFigure) # Update figure selector combo boxes def updateFigureSelectorBox(self): # Figure name may have changed, so we'll reset the figure combo box # But keep the same figure selected figure = self.currentFigure() # We are not actually changing the current figure, so we will disconnect this signal for the moment self._ui.figureSelector.currentIndexChanged[int].disconnect(self.changeCurrentFigure) currentFigureIndex = self._ui.figureSelector.currentIndex() self._ui.figureSelector.model().doReset() self._ui.figureSelector.setCurrentIndex(currentFigureIndex) self._ui.figureSelector.currentIndexChanged[int].connect(self.changeCurrentFigure) def updateFigureSelectorIndex(self, index): """ Programmatically change the selected entry in the figure selector box. This is useful for deleting figures and also for loading a project. """ if index < 0: return self._ui.figureSelector.setCurrentIndex(index) """Module-required methods""" def getMenuNameToAddTo(self): return "menuPlot" def prepareMenuItem(self, menu): menu.setObjectName("actionEditFiguresDialog") menu.setShortcut("Ctrl+E") menu.setText("Edit Figures") return menu def load(self): self.window = SubWindow(self._app.ui.workspace) self.menuEntry = QAction(self._app) self.menuEntry.setObjectName("actionEditFiguresDialog") self.menuEntry.setShortcut("Ctrl+F") self.menuEntry.setText("Edit Figures") self.menuEntry.triggered.connect(self.window.show) self.menu = vars(self._app.ui)["menuPlot"] self.menu.addAction(self.menuEntry) self.buildWidget() self.window.setWidget(self._widget) self._widget.setParent(self.window) self.window.hide() def unload(self): # Disconnect some slots self._app.figures().figureAdded.disconnect(self._figureListModel.doReset) self._app.figures().figureRemoved.disconnect(self._figureListModel.doReset) self.menuEntry.triggered.disconnect() self._widget.deleteLater() self.window.deleteLater() self.menu.removeAction(self.menuEntry) def reload(self): self.setModels() self._plotTab.reload() self._figureTab.reload()