qtab composite widget added
This commit is contained in:
207
guiframe.py
207
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",
|
||||
|
||||
Reference in New Issue
Block a user