from datetime import datetime import getpass import inspect import os from qtpy.QtCore import Qt from qtpy.QtWidgets import (QComboBox, QDialog, QFileDialog, QFrame, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QVBoxLayout) _version = "1.0.0" _pymodule = os.path.basename(__file__) _appname, _appext = _pymodule.split(".") def _line(): """Macro to return the current line number. The current line number within the file is used when reporting messages to the message logging window. Returns: int: Current line number. """ return inspect.currentframe().f_back.f_lineno class QSaveHDF(QDialog): def __init__(self, parent, input_options={'Comment': None}, from_dialog=False): super(QSaveHDF, self).__init__() self.from_dialog = from_dialog self.filesText = '' self.fflag = False widget_width = 220 self.parent = parent self.user_dict = {} self.user_dict['Comment'] = None #self.file_name = None #self.excluded_input = ['Year', 'Month', 'Date'] if 'Time in seconds' in input_options.keys(): time_in_seconds = input_options['Time in seconds'] now = datetime.fromtimestamp(time_in_seconds) else: now = datetime.now() _date = now.strftime("%Y-%m-%d_%H:%M:%S") _year = now.strftime("%Y") _month = now.strftime("%m") _day = now.strftime("%d") if 'Destination' in input_options.keys(): self.destination = input_options['Destination'] else: self.destination = (parent.hdf_dest + _year + "/" + _month + "/" + _day + "/" + parent.appname + "_" + _date + ".h5") self.appName = parent.appname + " / " + _appname self.setWindowTitle(self.appName) self.files = [] self.attributes = {} self.applicationBox = QHBoxLayout() self.applicationBox.addWidget(QLabel('Application:')) self.applicationLabel = QLabel(parent.pymodule) self.applicationLabel.setObjectName("hdf") self.applicationLabel.setFixedWidth(widget_width) self.user_dict['Application'] = self.applicationLabel.text() self.applicationBox.addWidget(self.applicationLabel) self.applicationBox.setStretch(1, 1) self.layout = QVBoxLayout(self) self.layout.addLayout(self.applicationBox) authorBox = QHBoxLayout() authorBox.addWidget(QLabel('User: ')) self.author = QLabel() self.author.setObjectName('hdf') self.author.setFixedWidth(widget_width) self.author.setAlignment(Qt.AlignCenter) self.author.setText(getpass.getuser()) self.user_dict['Author'] = self.author.text() authorBox.addWidget(self.author) self.layout.addLayout(authorBox) dateBox = QHBoxLayout() dateBox.addWidget(QLabel('Date: ')) self.date = QLabel() self.date.setObjectName('hdf') self.date.setFixedWidth(widget_width) self.date.setAlignment(Qt.AlignCenter) self.date.setText(_date) self.user_dict['Date'] = self.date.text() dateBox.addWidget(self.date) self.layout.addLayout(dateBox) qframe = QFrame() qframe.setFrameShape(QFrame.HLine) qframe.setFrameShadow(QFrame.Sunken) self.layout.addWidget(qframe) i = 0 self.wgt_dict = {} self.wgt_list = [None] * len(input_options) for key, value in input_options.items(): if key == 'Comment': self.user_dict['Comment'] = value continue if key in ['Destination', 'Time in seconds']: continue #if key in self.excluded_input: # continue hbox = QHBoxLayout() hbox.addWidget(QLabel(str(key)+":")) if isinstance(value, list): self.wgt_list[i] = QComboBox() self.wgt_list[i].setObjectName('hdf') self.wgt_list[i].addItems(value) self.wgt_list[i].setCurrentIndex(0) self.user_dict[key] = self.wgt_list[i].currentText() else: self.wgt_list[i] = QLineEdit() self.wgt_list[i].setObjectName('hdf') self.wgt_list[i].setFixedWidth(widget_width) self.wgt_list[i].setAlignment(Qt.AlignCenter) if value is not None: self.wgt_list[i].setText(str(value)) self.user_dict[key] = self.wgt_list[i].text() self.wgt_dict[self.wgt_list[i]] = key hbox.addWidget(self.wgt_list[i]) i += 1 self.layout.addLayout(hbox) lbl = QLabel('Comment: ') self.layout.addWidget(lbl) self.comment = QTextEdit(self.user_dict['Comment']) self.comment.setFixedHeight(70) self.comment.setObjectName('hdf') self.layout.addWidget(self.comment) fileBox = QHBoxLayout() qlFile = QLabel('File destination:') qlFile.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) fileBox.addWidget(qlFile) self.filesE = QTextEdit() self.filesE.setAlignment(Qt.AlignTop) self.filesE.setFixedHeight(84) self.filesE.setMinimumWidth(270) self.filesE.setReadOnly(False) self.filesE.setObjectName('hdf') self.filesE.setText(self.destination) self.attachFile = None if self.attachFile is not None: _attachFile = [] if isinstance(self.attachFile, str): _attachFile.append(self.attachFile) elif isinstance(self.attachFile, list): _attachFile = self.attachFile for i in range(0, len(_attachFile)): _attach_base = os.path.basename(self.attachFile[i]) if i > 0: self.filesText += "\n" self.filesText += str(_attach_base) self.filesE.setText(self.filesText) self.fflag = True openCloseVBox = QHBoxLayout() openBtn = QPushButton('Select') openBtn.setObjectName('hdflight') openBtn.setAutoDefault(False) openBtn.clicked.connect(self.openFiles) # openBtn.clearFocus() openCloseVBox.addWidget(openBtn) closeBtn = QPushButton('Clear') closeBtn.setObjectName('hdflight') closeBtn.setAutoDefault(False) closeBtn.clicked.connect(self.clearFiles) openCloseVBox.addWidget(closeBtn) fileBox.addLayout(openCloseVBox) self.layout.addLayout(fileBox) self.layout.addWidget(self.filesE) btnLayout = QHBoxLayout() okBtn = QPushButton('Save to HDF') okBtn.setAutoDefault(False) okBtn.clicked.connect(self.save) okBtn.setObjectName('WriteData') okBtn.setFixedHeight(45) cancelBtn = QPushButton('Cancel') cancelBtn.setAutoDefault(False) cancelBtn.clicked.connect(self.cancel) cancelBtn.setObjectName('Cancel') cancelBtn.setFixedHeight(45) btnLayout.addWidget(okBtn) btnLayout.addWidget(cancelBtn) self.messagelbl = QLabel('') self.messagelbl.setStyleSheet("QLabel { color : red; }") self.layout.addWidget(self.messagelbl) self.layout.addLayout(btnLayout) self.exec() def get_data(self): self.user_dict['Application'] = self.applicationLabel.text() self.user_dict['User'] = self.author.text() self.user_dict['Comment'] = self.comment.document().toPlainText() #if self.file_name: # self.user_dict['Destination'] = self.file_name #else: self.user_dict['Destination'] = self.filesE.document().toPlainText() self.destination = self.user_dict['Destination'] for key in self.wgt_dict: if 'QLineEdit' in str(key): self.user_dict[self.wgt_dict[key]] = key.text() elif 'QComboBox' in str(key): self.user_dict[self.wgt_dict[key]] = key.currentText() return self.user_dict def cancel(self): self.clearFiles() self.close() def save(self): self.get_data() self.parent.hdf_user_dict = self.user_dict self.parent.hdf_filename = self.user_dict['Destination'] self.parent.save_to_hdf(from_dialog=self.from_dialog) self.close() def clearFiles(self): self.attachFile = [] self.filesE.clear() self.files = [] self.filesText = '' #self.file_name ='' self.fflag = False def openFiles(self): # Notethat openFiles also gets called when qDialog cancel is clicked! qFileDialog = QFileDialog() # Returns a QStringList which maps onto a tuple in Python!! # type (fileLocal) returns a tuple(! filesLocal = qFileDialog.getSaveFileName( self, 'Save As', self.destination, "HDF5 files (*.hdf *.h5 *.hdf5 *.he5)")[0] if filesLocal: self.clearFiles() self.filesE.setText(filesLocal)