qtab composite widget added

This commit is contained in:
2023-02-23 08:09:14 +01:00
parent 71bcf8c7df
commit 3640082b59

View File

@@ -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",