Files
bdbase/hdf5filemenu.py
2022-06-28 10:04:37 +02:00

553 lines
20 KiB
Python

import inspect
import os
from qtpy.QtCore import QFile, QFileInfo, QIODevice, QSettings, Qt
from qtpy.QtGui import QFont, QIcon
from qtpy.QtWidgets import (QAction, QFileDialog, QGroupBox, QHBoxLayout,
QLabel, QLineEdit, QMenuBar, QPushButton,
QVBoxLayout)
from pyqtacc.bdbase.enumkind import MsgSeverity
_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 HDF5File(QGroupBox):
def __init__(self, parent):
super(HDF5File, self).__init__(parent)
self.parent = parent
self.show_message = self.parent.show_log_message
self.updateStatus = self.parent.updateStatus
self.createAction = self.parent.create_action
self.filename = None
self.save_filename = None
self.common_path = None
self.recent_files = []
self.max_no_files = 9
self.show_common_path_flag = False
self.file_dir = "."
self.qsettings = QSettings()
self.loadInitialFile()
def show_common_path_only(self, yes=False):
self.show_common_path_flag = yes
def saveToFileProcedure(self):
f = QFile(self.save_filename)
if f.open(QIODevice.WriteOnly):
f.write(self.fByteArray)
f.close()
return True
else:
return False
def fileSave(self):
if self.save_filename:
if self.saveToFileProcedure():
self.updateStatus("Saved file {0}".format(self.save_filename))
self.show_message(MsgSeverity.INFO, _pymodule, _line(),
"Saved file='{0}'".format(self.save_filename))
else:
return False
else:
self.updateStatus(
"Unable to save as no filename was given")
self.show_message(MsgSeverity.WARN, _pymodule, _line(),
"Unable to save as no filename was given")
return False
if self.save_filename:
self.showSaveFile()
def fileSaveAs(self):
_dir = (os.path.dirname(self.save_filename)
if self.save_filename is not None else self.file_dir)
_fname = QFileDialog.getSaveFileName(
self, "Save File", _dir, "HDF5 files (*.hdf *.h5 *.hdf5 *.he5)")
if _fname == "('', '')":
return False
else:
fname = _fname[0]
if fname:
if "." not in os.path.basename(fname):
fname += ".h5"
#self.addRecentSaveFile(fname)
self.save_filename = fname
self.fileSave()
return True
return False
def showSaveFile(self):
self.loaded_file_widget.setObjectName("hdf")
self.style().unpolish(self.loaded_file_widget)
self.style().polish(self.loaded_file_widget)
self.loaded_file_widget.setText(self.save_filename)
def fileOpen(self):
_dir = os.path.dirname(
self.filename) if self.filename is not None else self.file_dir
fname = QFileDialog.getOpenFileName(
self, "Select/Open File", str(_dir), (
"HDF5 files (*.hdf *.h5 *.hdf5 *.he5)"))[0]
if fname:
self.loadFile(fname)
def loadInitialFile(self):
self.recent_files = []
if self.qsettings.value("H5RecentFiles"):
mylist = self.qsettings.value("H5RecentFiles")
self.recent_files = str(mylist).split(',')
if self.qsettings.value("H5LastLoadedFile"):
fname = str(self.qsettings.value("H5LastLoadedFile"))
if fname and QFile.exists(fname):
#print ("loadInitialFile==============>", fname)
self.filename = fname
def loadFile(self, fname):
if not fname:
action = self.sender()
if isinstance(action, QAction):
fname = str(action.data())
if fname:
self.filename = None
if fname is None:
message = "Failed to read file='{0}'".format(fname)
self.show_message(
MsgSeverity.WARN, _pymodule, _line(), message)
self.updateStatus(message)
return
else:
self.addRecentFile(fname)
self.filename = fname
self.parent.hdf_filename_loaded = fname
_filename_wgt_str = fname #os.path.basename(fname)
if self.show_common_path_flag:
_start = str(fname).rfind(str(self.common_path))
#print("common path in loadFile ========>", self.common_path)
if _start == 0:
_filename_wgt_str = str(fname).replace(self.common_path, "")
if _filename_wgt_str:
if _filename_wgt_str.count("/") > 1:
_filename_wgt_str = ".../" + _filename_wgt_str
else:
_filename_wgt_str = fname
if self.loadFromFileProcedure():
message = "Loaded {0}".format(os.path.basename(fname))
message2 = "Loaded file='{0}'".format((fname))
self.show_message(
MsgSeverity.INFO, _pymodule, _line(), message2)
#self.loadFileProc()
self.updateStatus(message)
self.loaded_file_widget.setObjectName("load")
self.style().unpolish(self.loaded_file_widget)
self.style().polish(self.loaded_file_widget)
self.loaded_file_widget.setText(_filename_wgt_str)
else:
message = "No input file given!"
self.show_message(
MsgSeverity.WARN, _pymodule, _line(), message)
self.qsettings.setValue("H5LastLoadedFile", self.filename)
recentFiles = ', '.join(self.recent_files)
#recentFiles = (self.recentFiles) if self.recentFiles else None
self.qsettings.setValue("H5RecentFiles", (recentFiles))
#print("loaded to qsettings", self.filename)
def resetFileWidget(self, obj_name):
self.loaded_file_widget.clear()
self.loaded_file_widget.setObjectName(obj_name)
self.style().unpolish(self.loaded_file_widget)
self.style().polish(self.loaded_file_widget)
def addRecentFile(self, fname):
if fname is None:
return
if self.recent_files is None:
self.recent_files.insert(0, fname)
if fname not in self.recent_files:
self.recent_files.insert(0, fname)
while len(self.recent_files) > self.max_no_files:
self.recent_files.pop((len(self.recent_files)-1))
#print(self.recent_files)
def loadFromFileProcedure(self):
f = QFile(self.filename)
if f.open(QIODevice.ReadOnly):
self.fByteArray = f.readAll()
f.close()
else:
message = "Failed to load file='{0}'".format(self.filename)
self.show_message(
MsgSeverity.WARN, _pymodule, _line(), message)
def updateFileMenu(self):
self.file_menu.clear()
self.file_menu.addAction(self.file_open_action)
#self.parent.addActions(self._file_menu, self.fileMenuActions[:-1])
_current = str(
self.filename) if self.filename is not None else None
_recent_files = [_current] if _current is not None else []
if _current is not None:
if self.recent_files:
for fname in self.recent_files:
if fname != _current and QFile.exists(fname):
_recent_files.append(fname.strip())
if _recent_files:
self.common_path = os.path.commonpath(_recent_files) + "/"
else:
self.common_path = None
#print("_common_path=====>", self.common_path)
if _recent_files:
self.file_menu.addSeparator()
for i, fname in enumerate(_recent_files):
_label_icon = QFileInfo(fname).fileName()
if self.common_path is not None:
print(self.common_path)
print(str(os.path.dirname(fname)))
_start = str(os.path.dirname(fname)).rfind(
str(self.common_path))
if _start == 0:
_addon_str = str(os.path.dirname(fname)).replace(
self.common_path, "")
if _addon_str:
_label_icon += " [..." + _addon_str + "/]"
action = QAction(QIcon(":/icon.png"),
"&{0} {1}".format(i + 1, _label_icon), self)
action.setData(str(fname))
action.triggered.connect(self.loadFile)
self.file_menu.addAction(action)
self.recent_files = _recent_files
class HDF5SaveLoad(HDF5File):
def __init__(self, parent, title="HDF5", file_dir=".",
obj_name="INNER"):
super(HDF5SaveLoad, self).__init__(parent)
self.parent = parent
self.file_dir = file_dir
self.setTitle(title)
self.setObjectName(obj_name)
_font16 = QFont("sans-serif")
_font16.setPixelSize(16)
self.loaded_file_widget = QLineEdit()
self.loaded_file_widget.setObjectName("blank")
self.loaded_file_widget.setProperty("readOnly", True)
self.loaded_file_widget.setFixedHeight(35)
self.loaded_file_widget.setAlignment(Qt.AlignRight)
_menu_bar = QMenuBar()
_menu_bar.setFont(_font16)
_menu_bar.setFixedWidth(120)
_menu_bar.setFixedHeight(38)
_menu_bar.setObjectName("load")
self.file_menu = _menu_bar.addMenu('Load Matrix')
self.file_menu.setFont(_font16)
self.file_open_action = self.createAction(
"O&pen...", self.fileOpen, "Ctrl+Shift+P", "fileopen",
"Load file")
self.separator = QAction(self)
self.separator.setSeparator(True)
self.file_menu.addAction(self.file_open_action)
_menu_save_bar = QMenuBar()
_menu_save_bar.setFont(_font16)
_menu_save_bar.setFixedWidth(120)
_menu_save_bar.setFixedHeight(38)
_menu_save_bar.setObjectName("hdf")
self.save_menu = _menu_save_bar.addMenu('Save Matrix')
self.save_menu.setFont(_font16)
self.file_save_action = self.createAction(
"O&pen...", self.fileSaveAs, "Ctrl+Shift+S", "filesaveas",
"Save file")
self.save_menu.addAction(self.file_save_action)
_hb3 = QHBoxLayout()
_hb3.setContentsMargins(5, 0, 5, 0)
_hb3.setAlignment(Qt.AlignTop)
_hb3.addWidget(self.loaded_file_widget)
_hb = QHBoxLayout()
_hb.addWidget(_menu_bar)
_hb.addWidget(_menu_save_bar)
_hb.setAlignment(Qt.AlignTop | Qt.AlignHCenter)
_hb.setSpacing(15)
_vb2 = QVBoxLayout()
_vb2.setContentsMargins(5, 0, 0, 0)
_vb2.setAlignment(Qt.AlignTop)
_vb2.addLayout(_hb3)
_vb2.addLayout(_hb)
self.setLayout(_vb2)
self.setFixedWidth(400)
self.setFixedHeight(100) #or 156/120
self.setAlignment(Qt.AlignTop | Qt.AlignLeft)
self.file_menu.aboutToShow.connect(self.updateFileMenu)
self.updateFileMenu()
class HDF5GroupBox(QGroupBox):
def __init__(self, parent, title="HDF5", layout="Box"):
super(HDF5GroupBox, self).__init__(parent)
self.parent = parent
self.show_message = self.parent.gui_frame.show_log_message
self.updateStatus = self.parent.statusbar.showMessage
self.createAction = self.parent.create_action
self.filename = None
self.common_path = None
self.recent_files = []
self.max_no_files = 9
self.setTitle(title)
self.qsettings = QSettings()
_font16 = QFont("sans-serif")
_font16.setPixelSize(16)
_menu_bar = QMenuBar()
_menu_bar.setFont(_font16)
_menu_bar.setFixedWidth(50)
_menu_bar.setFixedHeight(24)
_loaded_file_label = QLabel(" Loaded:")
_loaded_file_label.setFixedHeight(13)
_loaded_file_label.setAlignment(Qt.AlignLeft | Qt.AlignTop)
_loaded_file_label.setContentsMargins(0, 8, 0, 0)
self.loaded_file_widget = QLineEdit()
self.loaded_file_widget.setObjectName("hdf")
self.loaded_file_widget.setProperty("readOnly", True)
self.loaded_file_widget.setFixedHeight(35)
self.analyze_h5_widget = QPushButton("Analyze")
self.analyze_h5_widget.setObjectName("WriteData")
self.analyze_h5_widget.setFixedWidth(100)
self.analyze_h5_widget.setFixedHeight(34)
self.analyze_h5_widget.setToolTip("Analyze pre-loaded hdf data")
self.file_menu = _menu_bar.addMenu('File')
self.file_menu.setFont(_font16)
self.file_open_action = self.createAction(
"O&pen...", self.fileOpen, "Ctrl+Shift+P", "fileopen",
"Load file")
self.separator = QAction(self)
self.separator.setSeparator(True)
self.file_menu.addAction(self.file_open_action)
if layout == "Hor":
self.setObjectName("OUTER")
_hb = QHBoxLayout()
_hb.setContentsMargins(10, 8, 10, 8)
_hb.setAlignment(Qt.AlignTop)
_hb.addWidget(_menu_bar)
_hb.addWidget(self.loaded_file_widget)
_hb.addWidget(self.analyze_h5_widget)
_hb.setAlignment(Qt.AlignCenter)
_hb.setSpacing(15)
self.setAlignment(Qt.AlignCenter)
self.setLayout(_hb)
self.setFixedWidth(600)
self.setFixedHeight(64) #or 156/120
else:
self.setObjectName("OUTER")
_vb3 = QVBoxLayout()
_vb3.setContentsMargins(5, 0, 5, 0)
_vb3.setAlignment(Qt.AlignTop)
_loaded_file_label.setFixedHeight(30)
_loaded_file_label.setContentsMargins(0, 18, 0, 0)
_vb3.addWidget(_loaded_file_label)
_vb3.addWidget(self.loaded_file_widget)
_hb = QHBoxLayout()
_hb.addWidget(_menu_bar)
_hb.addWidget(self.analyze_h5_widget)
_hb.setAlignment(Qt.AlignTop | Qt.AlignHCenter)
_hb.setSpacing(15)
_vb2 = QVBoxLayout()
_vb2.setContentsMargins(5, 0, 0, 0)
_vb2.setAlignment(Qt.AlignTop)
_vb2.addLayout(_vb3)
_vb2.addLayout(_hb)
self.setLayout(_vb2)
self.setFixedWidth(200)
self.setFixedHeight(136) #or 156/120
self.setAlignment(Qt.AlignTop | Qt.AlignLeft)
#self.recent_files_dict[fileOpenAction] = []
self.file_menu.aboutToShow.connect(self.updateFileMenu)
self.loadInitialFile()
self.updateFileMenu()
def fileOpen(self):
dir_name = os.path.dirname(
self.filename) if self.filename is not None else "."
fname = QFileDialog.getOpenFileName(
self, "Select File", dir_name, (
"HDF5 files (*.hdf *.h5 *.hdf5 *.he5)"))[0]
if fname:
self.loadFile(fname)
def loadInitialFile(self):
if self.qsettings.value("H5GroupLastFile"):
fname = str(self.qsettings.value("H5GroupLastFile"))
if fname and QFile.exists(fname):
#print ("loadInitialFile=============>", fname)
self.loadFile(fname)
def loadFile(self, fname):
if not fname:
action = self.sender()
if isinstance(action, QAction):
fname = str(action.data())
print("from self.sender:")
print(fname)
if fname:
self.filename = None
if fname is None:
message = "Failed to read file='{0}'".format(fname)
self.show_message(
MsgSeverity.WARN, _pymodule, _line(), message)
else:
self.addRecentFile(fname)
self.filename = fname
message = "Loaded {0}".format(os.path.basename(fname))
message2 = "Loaded hdf file '{0}'".format((fname))
self.show_message(
MsgSeverity.INFO, _pymodule, _line(), message2)
#self.loadFileProc()
#self.updateStatus(message)
self.parent.hdf_filename_loaded = fname
_filename_wgt_str = fname #os.path.basename(fname)
_start = str(fname).rfind(str(self.common_path))
#print("common path in loadFile ============>", self.common_path)
if _start == 0:
_filename_wgt_str = str(fname).replace(self.common_path, "")
if _filename_wgt_str:
if _filename_wgt_str.count("/") > 1:
_filename_wgt_str = ".../" + _filename_wgt_str
else:
_filename_wgt_str = fname
self.loaded_file_widget.setText(_filename_wgt_str)
else:
message = "No input file given!"
self.show_message(
MsgSeverity.WARN, _pymodule, _line(), message)
self.qsettings.setValue("H5GroupLastFile", self.filename)
recentFiles = ', '.join(self.recent_files)
#recentFiles = (self.recentFiles) if self.recentFiles else None
self.qsettings.setValue("H5GroupRecentFiles", (recentFiles))
def addRecentFile(self, fname):
if fname is None:
return
if self.recent_files is None:
self.recent_files.insert(0, fname)
if fname not in self.recent_files:
self.recent_files.insert(0, fname)
while len(self.recent_files) > self.max_no_files:
self.recent_files.pop((len(self.recent_files)-1))
def loadFileProc(self):
f = QFile(self.filename)
if f.open(QIODevice.ReadOnly):
self.fByteArray = f.readAll()
f.close()
else:
message = "Failed to load file='{0}'".format(self.filename)
self.show_message(
MsgSeverity.WARN, _pymodule, _line(), message)
def updateFileMenu(self):
self.file_menu.clear()
self.file_menu.addAction(self.file_open_action)
#self.parent.addActions(self.file_menu, self.fileMenuActions[:-1])
_current = str(self.filename) if self.filename is not None else None
_recent_files = [_current] if _current is not None else []
if _current is not None:
if self.recent_files:
for fname in self.recent_files:
if fname != _current and QFile.exists(fname):
_recent_files.append(fname)
if _recent_files:
self.common_path = os.path.commonpath(_recent_files) + "/"
else:
self.common_path = None
if _recent_files:
self.file_menu.addSeparator()
for i, fname in enumerate(_recent_files):
_label_icon = QFileInfo(fname).fileName()
if self.common_path is not None:
#print(self.common_path)
#print(str(os.path.dirname(fname)))
_start = str(os.path.dirname(fname)).rfind(
str(self.common_path))
if _start == 0:
_addon_str = str(os.path.dirname(fname)).replace(
self.common_path, "")
if _addon_str:
_label_icon += " [..." + _addon_str + "/]"
action = QAction(QIcon(":/icon.png"),
"&{0} {1}".format(i + 1, _label_icon), self)
action.setData(str(fname))
action.triggered.connect(self.loadFile)
self.file_menu.addAction(action)
self.recent_files = _recent_files