'''Main panel gui interface ''' import os import subprocess from qtpy.QtGui import QColor from qtpy.QtCore import __version__ as QT_VERSION_STR from qtpy.QtCore import Qt from qtpy.QtWidgets import ( QGridLayout, QGroupBox, QLabel, QPushButton, QStackedWidget, QTabBar, QTabWidget, QWidget) from caqtwidgets.pvwidgets import CAQLabel _pymodule = os.path.basename(__file__) class AppGui(QWidget): ''' Main GUI class ''' def __init__(self, parent): super().__init__() self.parent = parent self.cafe = self.parent.cafe self.cyca = self.parent.cyca self.settings = self.parent.settings self.check_status = self.parent.check_status self.check_status_list = self.parent.check_status_list self.elog_enum = self.parent.elog_enum self.accelerator_list = self.parent.accelerator_list self.send_to_log_window = self.parent.send_to_log_window self.show_log_message = self.parent.show_log_message self.statusbar = self.parent.statusbar self.gui_frame = self.parent.gui_frame self.gui_header = self.parent.gui_header self.font_gui = self.parent.gui_frame.font_gui self.input_parameters = self.parent.input_parameters self.input_labels = self.parent.input_labels self.expert_parameters = self.parent.expert_parameters self.gui_frame.expert_parameters_group.setFixedWidth(280) self.gui_frame.expert_parameters_group.setFixedHeight(430) self.gui_frame.operator_parameters_group.setFixedWidth(260) self.gui_frame.operator_parameters_group.setFixedHeight(400) self.gui_frame.measurement_tab_wgt.setFixedWidth(516) self.gui_frame.measurement_tab_wgt.setFixedHeight(580) self.gui_frame.operator_wgt.setFixedHeight(640) # self.gui_frame.expert_wgt.setFixedHeight(240) self.gui_frame.expert_wgt.layout().addWidget( self.low_level_display(), 2, 0, 1, 1) self.gui_frame.expert_wgt.layout().setVerticalSpacing(30) self.gui_frame.measurement_tab_wgt.setCurrentIndex(1) self.gui_frame.measurement_tab_wgt.setTabText(0, 'Accelerator') # DAQ self.daq_wgt = self.daq_group_qtabwidget(widget_type='QStackedWidget') self.gui_frame.measurement_layout.addWidget( self.daq_wgt, 0, 1, 1, 1, alignment=Qt.AlignTop) self.daq_wgt.setCurrentIndex(self.parent.default_idx) self.daq_wgt.currentChanged.emit(self.parent.default_idx) # Accelerator Current self.current_wgt = self.accelerator_current_group_qtabwidget( widget_type='QStackedWidget') self.gui_frame.measurement_layout.addWidget( self.current_wgt, 1, 1, 1, 1, alignment=Qt.AlignTop) self.current_wgt.setCurrentIndex(self.parent.default_idx) self.current_wgt.currentChanged.emit(self.parent.default_idx) choice_wgt = self.gui_frame.line_sender_dict['signalPeakSearch'] choice_wgt.name = 'Expert' self.gui_frame.line_sender_dict['signalSearch'] = choice_wgt choice_wgt = self.gui_frame.line_sender_dict['accelerator'] choice_wgt.name = 'Operator' self.gui_frame.line_sender_dict['accelerator'] = choice_wgt # On change Injector/Cyclotron self.gui_frame.line_sender_dict[ 'accelerator'].currentChanged.connect(self.cb_accelerator) # self.gui_frame.line_sender_dict[ # 'signalPeakSearch'].currentChanged.connect(self.cb_accelerator) def cb_accelerator(self, idx): self.daq_wgt.setCurrentIndex(idx) self.current_wgt.setCurrentIndex(idx) #is_sender = self.sender().name #print(_sender, flush=True) self.gui_frame.line_sender_dict[ 'signalPeakSearch'].setCurrentIndex(idx) ''' if "Expert" in is_sender: self.gui_frame.line_sender_dict[ 'signalPeakSearch'].blockSignals(True) self.gui_frame.line_sender_dict['accelerator'].setCurrentIndex(idx) self.gui_frame.line_sender_dict[ 'signalPeakSearch'].blockSignals(False) else: self.gui_frame.line_sender_dict[ 'accelerator'].blockSignals(True) self.gui_frame.line_sender_dict[ 'signalPeakSearch'].setCurrentIndex(idx) self.gui_frame.line_sender_dict[ 'accelerator'].blockSignals(False) ''' def daq_group_qtabwidget(self, widget_type='QStackedWidget'): accel_wgt_dict = {} if 'QTabWidget' in widget_type: accel_tab_widget = QTabWidget() accel_tab_widget.setFont(self.font_gui) accel_tab_widget.setStyleSheet('QTabBar {font-size: 10pt;}') accel_tab_widget.tabBar().setShape(QTabBar.TriangularNorth) for i, accel in enumerate(self.accelerator_list): accel_wgt_dict[accel] = self.daq_group(accel) accel_tab_widget.addTab(accel_wgt_dict[accel], accel) color = self.settings.data['Parameters']['accelerator']['data'][ 'color'][i] accel_tab_widget.tabBar().setTabTextColor(i, QColor(color)) else: accel_tab_widget = QStackedWidget() for i, accel in enumerate(self.accelerator_list): accel_wgt_dict[accel] = self.daq_group(accel) accel_tab_widget.addWidget(accel_wgt_dict[accel]) accel_tab_widget.setFixedWidth(320) accel_tab_widget.setFixedHeight(160) return accel_tab_widget def daq_group(self, accel): group_box = QGroupBox(f'{accel} DAQ') obj_name = 'CYCLOTRON' if self.parent.ring_cyclotron in accel else \ 'INJECTOR' group_box.setObjectName(obj_name) vbox = QGridLayout() pv_daq = [] pv_daq.append(self.settings.data['PV'][accel]['daqTrigger']) pv_daq.append(self.settings.data['PV'][accel]['daqReady']) pv_daq.append(self.settings.data['PV'][accel]['daqErrorCount']) self.cafe.openPrepare() self.cafe.open(pv_daq) self.cafe.openNowAndWait(1.0) vbox.addWidget(QLabel('DAQ Trigger:'), 0, 0) vbox.addWidget(QLabel('DAQ Count:'), 1, 0) vbox.addWidget(QLabel('Error Count:'), 2, 0) pv_widget = [None] * len(pv_daq) for i, pv in enumerate(pv_daq): pv_widget[i] = CAQLabel(self, pv_name=pv) vbox.addWidget(pv_widget[i], i, 1) fwidth = 40 if 'ERR-CNT' not in pv else 60 pv_widget[i].setFixedWidth(fwidth) vbox.setContentsMargins(9, 19, 9, 9) vbox.setSpacing(5) vbox.setAlignment(Qt.AlignTop | Qt.AlignHCenter) group_box.setFixedWidth(220) group_box.setFixedHeight(140) group_box.setFont(self.font_gui) group_box.setAlignment(int(Qt.AlignTop | Qt.AlignHCenter)) group_box.setLayout(vbox) qw = QWidget() grid = QGridLayout() grid.addWidget(group_box, 0, 0) qw.setLayout(grid) return qw def accelerator_current_group_qtabwidget( self, widget_type='QStackedWidget'): accel_wgt_dict = {} if 'QTabWidget' in widget_type: accel_tab_widget = QTabWidget() accel_tab_widget.setFont(self.font_gui) accel_tab_widget.setStyleSheet('QTabBar {font-size: 10pt;}') accel_tab_widget.tabBar().setShape(QTabBar.TriangularNorth) for i, accel in enumerate(self.accelerator_list): accel_wgt_dict[accel] = self.accelerator_current_group(accel) accel_tab_widget.addTab(accel_wgt_dict[accel], accel) color = self.settings.data['Parameters']['accelerator']['data'][ 'color'][i] accel_tab_widget.tabBar().setTabTextColor(i, QColor(color)) else: accel_tab_widget = QStackedWidget() for i, accel in enumerate(self.accelerator_list): accel_wgt_dict[accel] = self.accelerator_current_group(accel) accel_tab_widget.addWidget(accel_wgt_dict[accel]) accel_tab_widget.setFixedWidth(320) accel_tab_widget.setFixedHeight(180) return accel_tab_widget def accelerator_current_group(self, accel): group_box = QGroupBox(f'{accel} Current') obj_name = 'CYCLOTRON' if self.parent.ring_cyclotron in accel else \ 'INJECTOR' group_box.setObjectName(obj_name) vbox = QGridLayout() pv_name = [] pv_name.append(self.settings.data['PV'][accel]['IEntry']) pv_name.append(self.settings.data['PV'][accel]['IExit']) self.cafe.openPrepare() self.cafe.open(pv_name) self.cafe.openNowAndWait(1.0) vbox.addWidget(QLabel('I at Entry:'), 0, 0) vbox.addWidget(QLabel('I at Exit:'), 1, 0) pv_widget = [None] * len(pv_name) for i, pv in enumerate(pv_name): pv_widget[i] = CAQLabel(self, pv_name=pv, show_units=True) vbox.addWidget(pv_widget[i], i, 1) fwidth = 120 pv_widget[i].setFixedWidth(fwidth) vbox.setContentsMargins(9, 19, 9, 9) vbox.setSpacing(5) vbox.setAlignment(Qt.AlignTop | Qt.AlignHCenter) group_box.setFixedWidth(220) group_box.setFixedHeight(100) group_box.setFont(self.font_gui) group_box.setAlignment(int(Qt.AlignTop | Qt.AlignHCenter)) group_box.setLayout(vbox) qw = QWidget() grid = QGridLayout() grid.addWidget(group_box, 0, 0) qw.setLayout(grid) return qw def low_level_display(self): #command = "caqtdm -macro 'DEVICE=ZWSGA-CECL-TCRING' Z_DI_TURN_COUNT.ui" def low_level_macro(): subprocess.run(["caqtdm", "-macro", "DEVICE=ZWSGA-CECL-TCRING", "Z_DI_TURN_COUNT.ui"]) qpb = QPushButton(" Low-level Display ") #qpb.setStyleSheet("background-color: #B79D5C;") # QColor(183, 157, 92);") qpb.setObjectName("related") qpb.setToolTip("Execute caqtdm Turn Counter Display") qpb.clicked.connect(lambda: low_level_macro()) qpb.setFixedHeight(40) qpb.setFixedWidth(180) return qpb