class ExportData(Module): """Module to export data in any format.""" def __init__(self): Module.__init__(self) def buildWidget(self): self._widget = QWidget() self._ui = Ui_ExportData() self._ui.setupUi(self._widget) self.setModels() # Connect button signals self._ui.fileNameButton.clicked.connect(self.fileSelector) self._ui.addWaveButton.clicked.connect(self.addWave) self._ui.removeWaveButton.clicked.connect(self.removeWave) self._ui.exportDataButton.clicked.connect(self.exportData) def setModels(self): # Set up model and view self._allWavesListModel = self._app.model('appWaves') self._ui.allWavesListView.setModel(self._allWavesListModel) self._fileWavesListModel = WavesListModel([]) self._ui.fileWavesListView.setModel(self._fileWavesListModel) def fileSelector(self): """Button-lineedit link""" directory = os.path.dirname(Util.getWidgetValue(self._ui.fileName)) if not os.path.isdir(directory): directory = self._app.preferences.getInternal('projectDirectory') fileName = str(QFileDialog.getOpenFileName(self._app.ui.workspace, "Select Data File", directory, "All Files(*)")) if fileName != "": return Util.setWidgetValue(self._ui.fileName, fileName) return False def addWave(self): selectedIndexes = self._ui.allWavesListView.selectedIndexes() for index in selectedIndexes: self._fileWavesListModel.appendRow(self._allWavesListModel.waveNameByRow(index.row())) def removeWave(self): selectedIndexes = self._ui.fileWavesListView.selectedIndexes() selectedRows = map(lambda x:x.row(), selectedIndexes) selectedRows.sort() selectedRows.reverse() for row in selectedRows: self._fileWavesListModel.removeRow(row) def exportData(self): fileName = Util.getWidgetValue(self._ui.fileName) if os.path.exists(fileName): if os.path.isfile(fileName): # Ask about overwriting warningMessage = QMessageBox() warningMessage.setWindowTitle("Warning!") warningMessage.setText("The filename you have chosen - " + str(fileName) + " - already exists.") warningMessage.setInformativeText("Do you want to overwrite the file?") warningMessage.setIcon(QMessageBox.Warning) warningMessage.setStandardButtons(QMessageBox.Yes | QMessageBox.No) warningMessage.setDefaultButton(QMessageBox.No) result = warningMessage.exec_() if result != QMessageBox.Yes: return False else: # Do not try to overwrite a directory or link return False # Get waves waveNames = self._ui.fileWavesListView.model().orderedWaveNames() with open(fileName, 'w') as fileHandle: if Util.getWidgetValue(self._ui.outputType) == 'Delimited': delimiterText = Util.getWidgetValue(self._ui.delimiterButtonGroup) if delimiterText == 'Comma': fileWriter = csv.writer(fileHandle, dialect="excel", delimiter=",") elif delimiterText == 'Tab': fileWriter = csv.writer(fileHandle, dialect="excel-tab") elif delimiterText == 'Other': fileWriter = csv.writer(fileHandle, dialect="excel", delimiter=Util.getWidgetValue(self._ui.delimitedOtherDelimiter)) else: fileWriter = csv.writer(fileHandle, dialect="excel", delimiter=",") dataDirection = Util.getWidgetValue(self._ui.dataDirectionButtonGroup) rows = [] for waveName in waveNames: wave = self._app.waves().wave(waveName) row = wave.data() row.insert(0, wave.name()) rows.append(row) if dataDirection == "Rows": fileWriter.writerows(rows) elif dataDirection == "Columns": # Transpose the rows into columns columns = map(lambda *row: ['' if elem is None else elem for elem in row], *rows) fileWriter.writerows(columns) def load(self): self.window = SubWindow(self._app.ui.workspace) self.menuEntry = QAction(self._app) self.menuEntry.setObjectName("actionExportData") self.menuEntry.setShortcut("Ctrl+E") self.menuEntry.setText("Export Data") self.menuEntry.triggered.connect(self.window.show) # Check if menu already exists if "menuExport" not in vars(self._app.ui).keys(): self._app.ui.menuExport = QMenu(self._app.ui.menuFile) self._app.ui.menuExport.setObjectName("menuExport") self._app.ui.menuExport.setTitle(QApplication.translate("MainWindow", "Export", None, QApplication.UnicodeUTF8)) self._app.ui.menuFile.addAction(self._app.ui.menuExport.menuAction()) self.menu = vars(self._app.ui)["menuExport"] self.menu.addAction(self.menuEntry) self.buildWidget() self.window.setWidget(self._widget) self._widget.setParent(self.window) self.window.hide() def unload(self): self._widget.deleteLater() self.window.deleteLater() self.menu.removeAction(self.menuEntry) def reload(self): self.setModels()
def setModels(self): # Set up model and view self._allWavesListModel = self._app.model('appWaves') self._ui.allWavesListView.setModel(self._allWavesListModel) self._fileWavesListModel = WavesListModel([]) self._ui.fileWavesListView.setModel(self._fileWavesListModel)
class CreateTableDialog(Module): """Module to display the Create Table dialog window.""" def __init__(self): Module.__init__(self) def buildWidget(self): """Create the widget and populate it.""" # Create enclosing widget and UI self._widget = QWidget() self._ui = Ui_CreateTableDialog() self._ui.setupUi(self._widget) self.setModels() # Connect some slots self._ui.createTableButton.clicked.connect(self.createTable) self._ui.closeWindowButton.clicked.connect(self.closeWindow) self._ui.addWaveButton.clicked.connect(self.addWaveToTable) self._ui.removeWaveButton.clicked.connect(self.removeWaveFromTable) def setModels(self): # Set up model and view self._allWavesListModel = self._app.model('appWaves') self._ui.allWavesListView.setModel(self._allWavesListModel) self._tableWavesListModel = WavesListModel([]) self._ui.tableWavesListView.setModel(self._tableWavesListModel) def closeWindow(self): self.resetForm() self._widget.parent().close() def addWaveToTable(self): selectedIndexes = self._ui.allWavesListView.selectedIndexes() for index in selectedIndexes: self._tableWavesListModel.appendRow(self._allWavesListModel.waveNameByRow(index.row())) def removeWaveFromTable(self): selectedIndexes = self._ui.tableWavesListView.selectedIndexes() selectedRows = map(lambda x:x.row(), selectedIndexes) selectedRows.sort() selectedRows.reverse() for row in selectedRows: self._tableWavesListModel.removeRow(row) def createTable(self): """ Create the table. """ tableName = Util.getWidgetValue(self._ui.tableName) waves = self._tableWavesListModel.waves() if len(waves) == 0: warningMessage = QMessageBox() warningMessage.setWindowTitle("Problem!") warningMessage.setText("You must select at least one wave in order to create a table.") warningMessage.setIcon(QMessageBox.Critical) warningMessage.setStandardButtons(QMessageBox.Ok) warningMessage.setDefaultButton(QMessageBox.Ok) result = warningMessage.exec_() return False names = map(Wave.getName, waves) self._app.createTable(waves, tableName) self.closeWindow() return True def resetForm(self): Util.setWidgetValue(self._ui.tableName, "Table") self._allWavesListModel.doReset() self._tableWavesListModel.removeAllWaves() self._tableWavesListModel.doReset() def load(self): self.window = SubWindow(self._app.ui.workspace) self.menuEntry = QAction(self._app) self.menuEntry.setObjectName("actionNewTableDialog") self.menuEntry.setShortcut("Ctrl+T") self.menuEntry.setText("New Table") self.menuEntry.triggered.connect(self.window.show) self.menu = vars(self._app.ui)["menuNew"] 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.menuEntry.triggered.disconnect() self._widget.deleteLater() self.window.deleteLater() self.menu.removeAction(self.menuEntry) def reload(self): self.setModels() self.resetForm()