diff --git a/guiframe.py b/guiframe.py index d20c75e..3d7fdaf 100644 --- a/guiframe.py +++ b/guiframe.py @@ -11,11 +11,10 @@ from matplotlib.backends.backend_qt5agg import ( from qtpy.QtCore import QSize, Qt, Slot from qtpy.QtGui import QColor, QFont, QFontMetricsF, QIcon, QPainter, QPixmap -from qtpy.QtWidgets import (QCheckBox, QComboBox, QDoubleSpinBox, QFrame, - QGridLayout, QGroupBox, QHBoxLayout, QLabel, - QLineEdit, QPushButton, QRadioButton, QSpinBox, - QStackedWidget, QTabBar, QTabWidget, QToolButton, - QVBoxLayout, QWidget) +from qtpy.QtWidgets import ( + QCheckBox, QComboBox, QDoubleSpinBox, QFrame, QGridLayout, QGroupBox, + QHBoxLayout, QLabel, QLineEdit, QPushButton, QRadioButton, QSpinBox, + QStackedWidget, QTabBar, QTabWidget, QToolButton, QVBoxLayout, QWidget) from caqtwidgets.pvwidgets import (CAQLabel, CAQTableWidget, QMessageWidget, QHLine, QVLine) @@ -468,7 +467,8 @@ class GUIFrame(QWidget): return lab, wgt - def create_label_qcombobox(self, key, label="", values: list = [], start_val: str =""): + def create_label_qcombobox(self, key, label="", values: list = [], + start_val: str =""): """ Generic QCombobox with buddy label """ @@ -513,7 +513,8 @@ class GUIFrame(QWidget): box = QHBoxLayout() box.setSpacing(10) try: - start_val_gr = self.settings.data["Expert"]["pipeline"]["data"]["goodRegion"] + start_val_gr = self.settings.data["Expert"]["pipeline"]["data"][ + "goodRegion"] start_val_gr = Qt.Checked if start_val_gr else Qt.Unchecked except KeyError as ex: start_val_gr = Qt.Unchecked @@ -521,7 +522,8 @@ class GUIFrame(QWidget): top_key="Expert", key="goodRegion", text="Good region", tip="Enables good region in pipeline", default_value=start_val_gr)) try: - start_val_sub = self.settings.data["Expert"]["pipeline"]["data"]["subtractBackground"] + start_val_sub = self.settings.data["Expert"]["pipeline"]["data"][ + "subtractBackground"] start_val_sub = Qt.Checked if start_val_sub else Qt.Unchecked except KeyError as ex: start_val_sub = Qt.Unchecked @@ -538,14 +540,16 @@ class GUIFrame(QWidget): good_region.setObjectName("INNER") try: - start_val_grThreshold = self.settings.data["Expert"]["pipeline"]["data"]["grThreshold"] + start_val_grThreshold = self.settings.data["Expert"]["pipeline"][ + "data"]["grThreshold"] except KeyError as ex: start_val_grThreshold = 21 lab_thresh, thresh = self.create_label_qdoublespinbox( key="grThreshold", label="Threshold:", start_val=start_val_grThreshold) try: - start_val_grScale = self.settings.data["Expert"]["pipeline"]["data"]["grScale"] + start_val_grScale = self.settings.data["Expert"]["pipeline"][ + "data"]["grScale"] except KeyError as ex: start_val_grScale = 6 lab_gfscale, gfscale = self.create_label_qspinbox( @@ -562,21 +566,25 @@ class GUIFrame(QWidget): slicing.setObjectName("INNER") try: - start_val_nslices = self.settings.data["Expert"]["pipeline"]["data"]["slices"] + start_val_nslices = self.settings.data["Expert"]["pipeline"][ + "data"]["slices"] except KeyError as ex: start_val_nslices = 21 lab_slices, slices = self.create_label_qspinbox( key="slices", label="No. Slices:", start_val=start_val_nslices) try: - start_val_slicing_scale = self.settings.data["Expert"]["pipeline"]["data"]["slicingScale"] + start_val_slicing_scale = self.settings.data["Expert"]["pipeline"][ + "data"]["slicingScale"] except KeyError as ex: start_val_slicing_scale = 5 lab_scale, scale = self.create_label_qspinbox( - key="slicingScale", label="Scale:", start_val=start_val_slicing_scale) + key="slicingScale", label="Scale:", + start_val=start_val_slicing_scale) try: - start_val_orientation = self.settings.data["Expert"]["pipeline"]["data"]["orientation"] + start_val_orientation = self.settings.data["Expert"]["pipeline"][ + "data"]["orientation"] except KeyError as ex: start_val_orientation = "vertical" @@ -591,7 +599,8 @@ class GUIFrame(QWidget): layout.addWidget(lab_scale, 1, 0) layout.addWidget(scale, 1, 1) layout.addWidget(lab_orientation, 2, 0, 1, 2, Qt.AlignBottom) - layout.addWidget(self.slice_orientation, 3, 0, 1, 2, Qt.AlignTop | Qt.AlignRight) + layout.addWidget(self.slice_orientation, 3, 0, 1, 2, + Qt.AlignTop | Qt.AlignRight) slicing.setLayout(layout) layout_top = QGridLayout() @@ -1112,8 +1121,150 @@ class GUIFrame(QWidget): self.nav[i] = None - ##### GUI Input Widget + def prepare_qlineedit(self, line, value): + line.setObjectName("Write") + line.setFixedHeight(24) + line.setText(str(value)) + fm = QFontMetricsF(line.font()) + param_width = fm.width(str(value)) + extra_width = 22 if len(str(value)) < 16 else 26 + line.setFixedWidth(param_width + extra_width) + return line + + def prepare_qspinbox(self, line, value, link, title, key): + print(link, title, key) + min_val = self.settings.data[link][title][key]["data"]["min"] + max_val = self.settings.data[link][title][key]["data"]["max"] + step = self.settings.data[link][title][key]["data"]["step"] + + line.setRange(min_val, max_val) + line.setSingleStep(step) + line.setValue(value) + line.setAlignment(Qt.AlignRight) + fm = QFontMetricsF(line.font()) + param_width = fm.maxWidth() * len(str(max_val)) + print("param_width", param_width, flush=True) + line.setMaximumWidth(param_width) + return line + + + def qtab_wgt(self, key, irow, wgt_grid): + + if key in self.settings.data["Expert"].keys(): + top_key = "Expert" + elif key in self.settings.data["Parameters"].keys(): + top_key = "Parameters" + + def emboss(): + line.title = title + line.key = inner_key + line.val = value + + def line_cb(new_value): + sender= self.sender() + self.parent.input_parameters[sender.title][sender.key] = new_value + + def on_tab_change(new_idx): + sender_tab = self.sender().qtab_widget_dict[new_idx].title + meas_line.setText(sender_tab) + try: + _color = self.settings.data[top_key][key]["data"]["color"][new_idx] + except KeyError as ex: + + _color = "black" + meas_line.setStyleSheet("color: {0}".format(_color)) + self.sender().tabBar().setTabTextColor(new_idx, QColor(_color)) + self.parent.input_parameters[key] = sender_tab + + + qtab_widget = QTabWidget() + + qtab_widget_dict = {} + itab = 0 + longest_title = "short" + + link = self.settings.data[top_key][key]["data"]["link"] + + for title, tab in self.settings.data[link].items(): + lo = QGridLayout() + + qw = QWidget() + _irow = 0 + if len(title) > len(longest_title): + longest_title = title + self.parent.input_parameters[title] = {} + for inner_key, param in tab.items(): + wgt_type = param["data"]["widget"] + text = param["data"]["text"] + value = param["data"]["value"] + label = QLabel(text) + label.setFixedHeight(24) + label.setFont(self.font_pts10) + label.setContentsMargins(5, 0, 0, 0) + + if "QSpinBox" in wgt_type: + line = QSpinBox() + emboss() + print("top key", top_key, inner_key, flush=True) + self.prepare_qspinbox(line, value, link, title, inner_key) + line.valueChanged.connect(line_cb) + line.valueChanged.emit(value) + + elif "QLineEdit" in wgt_type: + line = QLineEdit() + emboss() + self.prepare_qlineedit(line, value) + line.textEdited.connect(line_cb) + line.textEdited.emit(str(value)) + + lo.addWidget(label, _irow, 0, 1, 1, Qt.AlignLeft | Qt.AlignVCenter) + lo.addWidget(line, _irow, 1, 1, 4, Qt.AlignLeft | Qt.AlignVCenter) + #print(title, tab) + #print(key, line, icolumn, wgt_type, text, flush=True) + _irow += 1 + + qw.setLayout(lo) + qtab_widget_dict[itab] = qw + qtab_widget_dict[itab].title = title + qtab_widget.addTab(qtab_widget_dict[itab], title) + + itab += 1 + qtab_widget.qtab_widget_dict = qtab_widget_dict + + + + meas_label = QLabel(text) + meas_label.setFixedHeight(24) + meas_label.setFont(self.font_pts10) + meas_label.setContentsMargins(5, 0, 0, 0) + meas_label.setText(self.settings.data[top_key][key]["data"]["text"]) + meas_line = QLineEdit() + meas_line.setObjectName("Read") + + fm = QFontMetricsF(meas_line.font()) + param_width = fm.width(longest_title) + extra_width = 22 if len(str(value)) < 15 else 28 + meas_line.setFixedWidth(param_width + extra_width) + + + qtab_widget.setContentsMargins(0, 40, 0, 0) + qtab_widget.currentChanged.connect(on_tab_change) + _default_idx = self.settings.data[top_key][key]["data"]["value"] + qtab_widget.setCurrentIndex(_default_idx) + qtab_widget.currentChanged.emit(_default_idx) + + wgt_grid.addWidget(meas_label, irow, 0, 1, 2, Qt.AlignLeft | Qt.AlignVCenter) + wgt_grid.addWidget(meas_line, irow, 2, 1, 2, Qt.AlignLeft | Qt.AlignVCenter) + qHLine = QHLine() + qHLine.setFixedHeight(10) + wgt_grid.addWidget(qHLine, irow+1, 0, 1, 4) + wgt_grid.addWidget(qtab_widget, irow+2, 0, 1, 4, Qt.AlignHCenter | Qt.AlignVCenter) + + return qtab_widget + + def pv_stacked_wgt(self, pvlist, title, default_value, key, object_name): + """GUI Input Widget""" stacked_widget = QStackedWidget() self.cafe.openPrepare() self.cafe.open(pvlist) @@ -1551,7 +1702,7 @@ class GUIFrame(QWidget): def line_cb(new_value): self.parent.input_parameters[key] = new_value - suggested = "WW" + line = QLineEdit() line.setObjectName("Write") @@ -1559,10 +1710,11 @@ class GUIFrame(QWidget): line.textEdited.connect(line_cb) line.setText(str(value)) fm = QFontMetricsF(line.font()) - param_width = max(fm.width(str(value)), fm.width(suggested)) + param_width = fm.width(str(value)) extra_width = 22 if len(str(value)) < 16 else 26 line.setFixedWidth(param_width + extra_width) + wgt_grid.addWidget(label, irow, 0, 1, 2, Qt.AlignLeft | Qt.AlignVCenter) wgt_grid.addWidget(line, irow, 2, 1, 2, Qt.AlignLeft | Qt.AlignVCenter) @@ -1579,9 +1731,16 @@ class GUIFrame(QWidget): line.setFixedHeight(24) line.valueChanged.connect(line_cb) line.setValue(value) - min_val = self.settings.data["Expert"][key]["data"]["min"] - max_val = self.settings.data["Expert"][key]["data"]["max"] - step = self.settings.data["Expert"][key]["data"]["step"] + + if key in self.settings.data["Expert"].keys(): + top_key = "Expert" + elif key in self.settings.data["Parameters"].keys(): + top_key = "Parameters" + + min_val = self.settings.data[top_key][key]["data"]["min"] + max_val = self.settings.data[top_key][key]["data"]["max"] + step = self.settings.data[top_key][key]["data"]["step"] + decimal = Decimal(str(step)) line.setDecimals(abs(decimal.as_tuple().exponent)) #precision line.setRange(min_val, max_val) @@ -1670,8 +1829,6 @@ class GUIFrame(QWidget): if "QVLINE" in buddy: print("QVLine", label, key, value) - if "QVLINE" in buddy: - print("QVLine", label, key, value) if wgt_grid is None: wgt_grid = self.input_wgt_grid @@ -1722,7 +1879,9 @@ class GUIFrame(QWidget): self.input_wgt_qframe(irow, wgt_grid) elif buddy == "QTabWidget".upper(): - pass + #print("buddy/label", buddy, label, key, value, flush=True) + line = self.qtab_wgt(key, irow, wgt_grid) + else: wgt_list = ["QCheckBox", "QComboBox", "QDoubleSpinBox", "QFrame", "QHLine", "QLabel", "QLineEdit", "QLineRead",