Source code for lys_instr.gui.DataStorage

import qtawesome as qta
import json

from lys.Qt import QtCore, QtWidgets
from .widgets import FolderButton


[docs] class DataStorageGUI(QtWidgets.QWidget): def __init__(self, obj): super().__init__() self._obj = obj self._settingPath = False self._initLayout() self._obj.base = self._base.text() self._obj.folder = self._folder.text() self._obj.name = self._name.text() self._obj.savingStateChanged.connect(self._savingStateChanged) def _initLayout(self): # Widgets for data saving browse = FolderButton(clicked=self._browse) browse.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) self._base = QtWidgets.QLineEdit(objectName="DataStorage_base") self._base.setText(".") self._folder = QtWidgets.QLineEdit(objectName="DataStorage_folder") self._name = QtWidgets.QLineEdit(objectName="DataStorage_name") self._savedIndicator = QtWidgets.QLabel() self._savedIndicator.setPixmap(qta.icon("ri.check-line", color="green").pixmap(24, 24)) self._savedIndicator.setAlignment(QtCore.Qt.AlignCenter) self._savingState = QtWidgets.QLabel("[Status] Waiting") # self._dataShapeText = QtWidgets.QLabel("Data Shape: (None)") self._numberedCheck = QtWidgets.QCheckBox("Numbered", checked=True, objectName="DataStorage_numbered") self._enabledCheck = QtWidgets.QCheckBox("Enabled", checked=True, objectName="DataStorage_enabled") self._number = QtWidgets.QSpinBox() self._number.setEnabled(True) # Connect signals self._base.textChanged.connect(self._pathChanged) self._folder.textChanged.connect(self._pathChanged) self._name.textChanged.connect(self._pathChanged) self._numberedCheck.toggled.connect(self._pathChanged) self._enabledCheck.toggled.connect(self._pathChanged) # Layout setup pathLayout = QtWidgets.QGridLayout() pathLayout.setAlignment(QtCore.Qt.AlignTop) pathLayout.addWidget(browse, 1, 0) pathLayout.addWidget(QtWidgets.QLabel("Base Folder"), 0, 1) pathLayout.addWidget(QtWidgets.QLabel("Data Folder"), 0, 2) pathLayout.addWidget(QtWidgets.QLabel("File Name"), 0, 3) pathLayout.addWidget(self._numberedCheck, 0, 4) pathLayout.addWidget(self._base, 1, 1) pathLayout.addWidget(self._folder, 1, 2) pathLayout.addWidget(self._name, 1, 3) pathLayout.addWidget(self._number, 1, 4) pathLayout.addWidget(self._savedIndicator, 2, 0) pathLayout.addWidget(self._savingState, 2, 1, 1, 3) pathLayout.addWidget(self._enabledCheck, 2, 4) mainLayout = QtWidgets.QVBoxLayout() mainLayout.addLayout(pathLayout) self.setLayout(mainLayout) def _pathChanged(self): if self._settingPath: return self._settingPath = True # Update storage object properties from GUI fields self._obj.base = self._base.text() self._obj.folder = self._folder.text() self._obj.name = self._name.text() self._obj.numbered = self._numberedCheck.isChecked() self._obj.enabled = self._enabledCheck.isChecked() # Update number spinbox only if numbering is enabled number = self._obj.getNumber() self._number.setValue(number) if number is not None else self._number.clear() # Save last path info lastPath = {"base": self._base.text(), "folder": self._folder.text(), "name": self._name.text()} with open(".lastPath.json", "w") as f: json.dump(lastPath, f) self._settingPath = False def _browse(self): baseStr = QtWidgets.QFileDialog.getExistingDirectory(self, "Select base folder", self._base.text()) if baseStr: self._base.setText(baseStr) def _savingStateChanged(self, saving): if saving: text = f"[Status] {len(self._obj._paths)} files reserved, {len(self._obj._threads)} files being saved." self._savingState.setText(text) else: self._savingState.setText("[Status] Waiting") icon = qta.icon("ri.loader-2-line", color="orange") if saving else qta.icon("ri.check-line", color="green") self._savedIndicator.setPixmap(icon.pixmap(24, 24))
# To Test the GUI run in the src\python: python -m fstem.lys_instr.GUI.DataStorageGUI if __name__ == "__main__": import sys from fstem.lys_instr.DataStorage import DataStorage from lys.Qt import QtWidgets import numpy as np app = QtWidgets.QApplication(sys.argv) storage = DataStorage() gui = DataStorageGUI(storage) gui.show() sys.exit(app.exec_())