0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 03:31:50 +02:00

fix: Alignment 1D update, make app window a main window (in .ui file)

This commit is contained in:
2024-10-03 18:11:20 +02:00
parent af9655de0c
commit 0015f0e2d6
2 changed files with 453 additions and 811 deletions

View File

@ -8,45 +8,54 @@ from typing import Optional
from bec_lib.device import Positioner as BECPositioner
from bec_lib.device import Signal as BECSignal
from bec_lib.endpoints import MessageEndpoints
from bec_lib.logger import bec_logger
from qtpy.QtCore import QSize, Signal
from qtpy.QtGui import QIcon
from qtpy.QtWidgets import QCheckBox, QDoubleSpinBox, QMainWindow, QPushButton, QSpinBox
from qtpy.QtWidgets import (
QApplication,
QCheckBox,
QDoubleSpinBox,
QMainWindow,
QPushButton,
QSpinBox,
)
import bec_widgets
from bec_widgets.qt_utils.error_popups import SafeSlot as Slot
from bec_widgets.qt_utils.toolbar import WidgetAction
from bec_widgets.utils import UILoader
from bec_widgets.utils.bec_dispatcher import BECDispatcher
from bec_widgets.utils.bec_widget import BECWidget
from bec_widgets.utils.colors import get_accent_colors
from bec_widgets.widgets.bec_progressbar.bec_progressbar import BECProgressBar
from bec_widgets.widgets.device_line_edit.device_line_edit import DeviceLineEdit
from bec_widgets.widgets.lmfit_dialog.lmfit_dialog import LMFitDialog
from bec_widgets.widgets.positioner_box.positioner_box import PositionerBox
from bec_widgets.widgets.positioner_group.positioner_group import PositionerGroup
from bec_widgets.widgets.stop_button.stop_button import StopButton
from bec_widgets.widgets.toggle.toggle import ToggleSwitch
from bec_widgets.widgets.waveform.waveform_widget import BECWaveformWidget
MODULE_PATH = os.path.dirname(bec_widgets.__file__)
logger = bec_logger.logger
class Alignment1D(BECWidget, QMainWindow):
class Alignment1D:
"""Alignment GUI to perform 1D scans"""
# Emit a signal when a motion is ongoing
motion_is_active = Signal(bool)
def __init__(self, client=None, gui_id: Optional[str] = None) -> None:
"""Initialise the widget
"""Initialization
Args:
parent: Parent widget.
config: Configuration of the widget.
config: Configuration of the application.
client: BEC client object.
gui_id: GUI ID.
"""
super().__init__(client=client, gui_id=gui_id)
QMainWindow.__init__(self)
self.get_bec_shortcuts()
self.bec_dispatcher = BECDispatcher(client=client)
self.client = self.bec_dispatcher.client if client is None else client
QApplication.instance().aboutToQuit.connect(self.close)
self.dev = self.client.device_manager.devices
self._accent_colors = get_accent_colors()
self.ui_file = "alignment_1d.ui"
self.ui = None
@ -57,28 +66,25 @@ class Alignment1D(BECWidget, QMainWindow):
def init_ui(self):
"""Initialise the UI from QT Designer file"""
current_path = os.path.dirname(__file__)
self.ui = UILoader(self).loader(os.path.join(current_path, self.ui_file))
self.setCentralWidget(self.ui)
self.ui = UILoader(None).loader(os.path.join(current_path, self.ui_file))
# Customize the plotting widget
self.waveform = self.ui.findChild(BECWaveformWidget, "bec_waveform_widget")
self._customise_bec_waveform_widget()
# Setup comboboxes for motor and signal selection
# FIXME after changing the filtering in the combobox
self._setup_motor_combobox()
self._setup_signal_combobox()
# Setup motor indicator
self._setup_motor_indicator()
# Connect spinboxes to scan Control
self._setup_scan_control()
# Setup progress bar
self._setup_progress_bar()
# Add actions buttons
self._customise_buttons()
# Customize the positioner box
self._customize_positioner_box()
# Hook scaninfo updates
self.bec_dispatcher.connect_slot(self.scan_status_callback, MessageEndpoints.scan_status())
def show(self):
return self.ui.show()
##############################
############ SLOTS ###########
##############################
@ -87,10 +93,8 @@ class Alignment1D(BECWidget, QMainWindow):
def scan_status_callback(self, content: dict, _) -> None:
"""This slot allows to enable/disable the UI critical components when a scan is running"""
if content["status"] in ["open"]:
self.motion_is_active.emit(True)
self.enable_ui(False)
elif content["status"] in ["aborted", "halted", "closed"]:
self.motion_is_active.emit(False)
self.enable_ui(True)
@Slot(tuple)
@ -133,15 +137,11 @@ class Alignment1D(BECWidget, QMainWindow):
def enable_ui(self, enable: bool) -> None:
"""Enable or disable the UI components"""
# Enable/disable motor and signal selection
self.ui.device_combobox.setEnabled(enable)
self.ui.device_combobox_2.setEnabled(enable)
# Enable/disable DAP selection
self.ui.dap_combo_box.setEnabled(enable)
# Enable/disable Scan Button
self.ui.scan_button.setEnabled(enable)
# Positioner control line
# pylint: disable=protected-access
self.ui.positioner_box._toogle_enable_buttons(enable)
# self.ui.scan_button.setEnabled(enable)
# Disable move to buttons in LMFitDialog
self.ui.findChild(LMFitDialog).set_actions_enabled(enable)
@ -154,49 +154,20 @@ class Alignment1D(BECWidget, QMainWindow):
fit_dialog = self.ui.findChild(LMFitDialog)
fit_dialog.active_action_list = ["center", "center1", "center2"]
fit_dialog.move_action.connect(self.move_to_center)
scan_button = self.ui.findChild(QPushButton, "scan_button")
scan_button.setStyleSheet(
f"""
QPushButton:enabled {{ background-color: {self._accent_colors.success.name()};color: white; }}
QPushButton:disabled {{ background-color: grey;color: white; }}
"""
)
stop_button = self.ui.findChild(StopButton)
stop_button.button.setText("Stop and Clear Queue")
stop_button.button.clicked.connect(self.clear_queue)
def _customise_bec_waveform_widget(self) -> None:
"""Customise the BEC Waveform Widget, i.e. clear the toolbar, add the DAP ROI selection to the toolbar.
We also move the scan_control widget which is fully hidden and solely used for setting up the scan parameters to the toolbar.
"""
"""Customise the BEC Waveform Widget, i.e. clear the toolbar"""
self.waveform.toolbar.clear()
toggle_switch = self.ui.findChild(ToggleSwitch, "toggle_switch")
scan_control = self.ui.scan_control
self.waveform.toolbar.populate_toolbar(
{
"label": WidgetAction(label="ENABLE DAP ROI", widget=toggle_switch),
"scan_control": WidgetAction(widget=scan_control),
},
self.waveform,
)
def _setup_motor_indicator(self) -> None:
"""Setup the arrow item"""
self.waveform.waveform.tick_item.add_to_plot()
positioner_box = self.ui.findChild(PositionerBox)
positioner_box = self.ui.findChild(PositionerGroup)
positioner_box.position_update.connect(self.waveform.waveform.tick_item.set_position)
try:
pos = float(positioner_box.ui.readback.text())
except ValueError:
pos = 0
self.waveform.waveform.tick_item.set_position(pos)
def _setup_motor_combobox(self) -> None:
"""Setup motor selection"""
# FIXME after changing the filtering in the combobox
motors = [name for name in self.dev if isinstance(self.dev.get(name), BECPositioner)]
self.ui.device_combobox.setCurrentText(motors[0])
self.ui.device_combobox.set_device_filter("Positioner")
self.waveform.waveform.tick_item.set_position(0)
def _setup_signal_combobox(self) -> None:
"""Setup signal selection"""
@ -205,31 +176,6 @@ class Alignment1D(BECWidget, QMainWindow):
self.ui.device_combobox_2.setCurrentText(signals[0])
self.ui.device_combobox_2.set_device_filter("Signal")
def _setup_scan_control(self) -> None:
"""Setup scan control, connect spin and check boxes to the scan_control widget"""
# Connect motor
device_line_edit = self.ui.scan_control.arg_box.findChild(DeviceLineEdit)
self.ui.device_combobox.currentTextChanged.connect(device_line_edit.setText)
device_line_edit.setText(self.ui.device_combobox.currentText())
# Connect start, stop, step, exp_time and relative check box
spin_boxes = self.ui.scan_control.arg_box.findChildren(QDoubleSpinBox)
start = self.ui.findChild(QDoubleSpinBox, "linescan_start")
start.valueChanged.connect(spin_boxes[0].setValue)
stop = self.ui.findChild(QDoubleSpinBox, "linescan_stop")
stop.valueChanged.connect(spin_boxes[1].setValue)
step = self.ui.findChild(QSpinBox, "linescan_step")
step.valueChanged.connect(
self.ui.scan_control.kwarg_boxes[0].findChildren(QSpinBox)[0].setValue
)
exp_time = self.ui.findChild(QDoubleSpinBox, "linescan_exp_time")
exp_time.valueChanged.connect(
self.ui.scan_control.kwarg_boxes[1].findChildren(QDoubleSpinBox)[0].setValue
)
relative = self.ui.findChild(QCheckBox, "linescan_relative")
relative.toggled.connect(
self.ui.scan_control.kwarg_boxes[0].findChildren(QCheckBox)[0].setChecked
)
def _setup_progress_bar(self) -> None:
"""Setup progress bar"""
# FIXME once the BECScanProgressBar is implemented
@ -238,18 +184,16 @@ class Alignment1D(BECWidget, QMainWindow):
self.ui.bec_waveform_widget.new_scan.connect(self.reset_progress_bar)
self.bec_dispatcher.connect_slot(self.update_progress_bar, MessageEndpoints.scan_progress())
def _customize_positioner_box(self) -> None:
"""Customize the positioner Box, i.e. remove the stop button"""
box = self.ui.findChild(PositionerBox)
box.ui.stop.setVisible(False)
box.ui.position_indicator.setFixedHeight(20)
def close(self):
logger.info("Disconnecting", repr(self.bec_dispatcher))
self.bec_dispatcher.disconnect_all()
logger.info("Shutting down BEC Client", repr(self.client))
self.client.shutdown()
def main():
import sys
from qtpy.QtWidgets import QApplication # pylint: disable=ungrouped-imports
app = QApplication(sys.argv)
icon = QIcon()
icon.addFile(

View File

@ -1,21 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<class>mainWindow</class>
<widget class="QMainWindow" name="mainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1335</width>
<height>939</height>
<width>1611</width>
<height>1019</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<string>Alignment tool</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<widget class="QWidget" name="widget">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,0,0,0,0,0,0,0,0,0,1">
<widget class="QWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="DarkModeButton" name="dark_mode_button"/>
</item>
@ -43,7 +51,7 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
@ -63,7 +71,7 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
@ -95,7 +103,7 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
@ -127,7 +135,7 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
@ -162,9 +170,24 @@
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0">
<widget class="BECProgressBar" name="bec_progress_bar">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>25</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
@ -180,21 +203,24 @@
<attribute name="title">
<string>Alignment Control</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_6" stretch="0,1,2">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QWidget" name="widget_4" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="ScanControl" name="scan_control">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
@ -205,22 +231,22 @@
<string>line_scan</string>
</property>
<property name="hide_arg_box" stdset="0">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="hide_kwarg_boxes" stdset="0">
<bool>true</bool>
</property>
<property name="hide_scan_remember_toggle" stdset="0">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="hide_scan_control_buttons" stdset="0">
<bool>false</bool>
</property>
<property name="hide_scan_selection_combobox" stdset="0">
<bool>true</bool>
</property>
<property name="hide_bundle_buttons" stdset="0">
<property name="hide_add_remove_buttons" stdset="0">
<bool>true</bool>
</property>
<property name="hide_args_group" stdset="0">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="hide_kwargs_group" stdset="0">
<bool>false</bool>
@ -228,341 +254,7 @@
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="control_layout" stretch="0,0,2">
<item>
<widget class="QGroupBox" name="device_box">
<property name="minimumSize">
<size>
<width>450</width>
<height>95</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>450</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>15</pointsize>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="title">
<string>Devices</string>
</property>
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0" columnstretch="0,0,0">
<property name="leftMargin">
<number>8</number>
</property>
<property name="topMargin">
<number>8</number>
</property>
<property name="rightMargin">
<number>8</number>
</property>
<property name="bottomMargin">
<number>8</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="font">
<font/>
</property>
<property name="text">
<string>Motor</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_2">
<property name="font">
<font/>
</property>
<property name="text">
<string>Monitor</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_3">
<property name="font">
<font/>
</property>
<property name="text">
<string>LMFit Model</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="DeviceComboBox" name="device_combobox"/>
</item>
<item row="1" column="1">
<widget class="DeviceComboBox" name="device_combobox_2"/>
</item>
<item row="1" column="2">
<widget class="DapComboBox" name="dap_combo_box"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTabWidget" name="tabWidget_2">
<property name="minimumSize">
<size>
<width>450</width>
<height>343</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>450</width>
<height>16777215</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="scan_control_tab">
<attribute name="title">
<string>LineScan</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="2" column="0">
<widget class="QLabel" name="label_10">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Relative</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QDoubleSpinBox" name="linescan_start">
<property name="decimals">
<number>3</number>
</property>
<property name="minimum">
<double>-10000000.000000000000000</double>
</property>
<property name="maximum">
<double>10000000.000000000000000</double>
</property>
<property name="value">
<double>0.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_11">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Exposure Time</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Start</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLabel" name="label_12">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Burst at each point</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="linescan_relative">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLabel" name="label_8">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Stop</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QSpinBox" name="linescan_step">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>10000000</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="5" column="0" colspan="4">
<widget class="QPushButton" name="scan_button">
<property name="minimumSize">
<size>
<width>0</width>
<height>40</height>
</size>
</property>
<property name="font">
<font/>
</property>
<property name="text">
<string>Run Scan</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
<property name="default">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QDoubleSpinBox" name="linescan_stop">
<property name="decimals">
<number>3</number>
</property>
<property name="minimum">
<double>-10000000.000000000000000</double>
</property>
<property name="maximum">
<double>10000000.000000000000000</double>
</property>
<property name="value">
<double>0.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QSpinBox" name="linescan_step_2">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10000000</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="label_9">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Steps</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="linescan_exp_time">
<property name="decimals">
<number>3</number>
</property>
<property name="minimum">
<double>-10000000.000000000000000</double>
</property>
<property name="maximum">
<double>10000000.000000000000000</double>
</property>
<property name="value">
<double>0.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tweak_tab">
<attribute name="title">
<string>MotorTweak</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,0,0">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="PositionerBox" name="positioner_box">
<property name="hide_device_selection" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
<widget class="PositionerGroup" name="positioner_group"/>
</item>
<item>
<spacer name="verticalSpacer">
@ -578,19 +270,56 @@
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="plotting_layout" stretch="7,0,2">
<item>
<widget class="BECWaveformWidget" name="bec_waveform_widget">
<property name="minimumSize">
<size>
<width>600</width>
<height>450</height>
</size>
<widget class="QWidget" name="widget_3" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>4</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="clear_curves_on_plot_update" stdset="0">
<bool>true</bool>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="widget_2" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font/>
</property>
<property name="text">
<string>Monitor</string>
</property>
</widget>
</item>
<item>
<widget class="DeviceComboBox" name="device_combobox_2"/>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="font">
<font/>
</property>
<property name="text">
<string>LMFit Model</string>
</property>
</widget>
</item>
<item>
<widget class="DapComboBox" name="dap_combo_box"/>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Enable ROI</string>
</property>
</widget>
</item>
@ -614,11 +343,44 @@
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="fit_dialog_layout" stretch="4">
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="BECWaveformWidget" name="bec_waveform_widget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>600</width>
<height>450</height>
</size>
</property>
<property name="clear_curves_on_plot_update" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="LMFitDialog" name="lm_fit_dialog">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -641,8 +403,7 @@
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
@ -675,24 +436,7 @@
</widget>
</item>
</layout>
</item>
<item>
<widget class="BECProgressBar" name="bec_progress_bar">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>25</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
@ -725,6 +469,11 @@
<extends>QWidget</extends>
<header>lm_fit_dialog</header>
</customwidget>
<customwidget>
<class>PositionerGroup</class>
<extends>QWidget</extends>
<header>positioner_group</header>
</customwidget>
<customwidget>
<class>ScanControl</class>
<extends>QWidget</extends>
@ -755,90 +504,9 @@
<extends>QWidget</extends>
<header>dap_combo_box</header>
</customwidget>
<customwidget>
<class>PositionerBox</class>
<extends>QWidget</extends>
<header>positioner_box</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>device_combobox</tabstop>
<tabstop>device_combobox_2</tabstop>
<tabstop>tabWidget_2</tabstop>
<tabstop>linescan_start</tabstop>
<tabstop>linescan_stop</tabstop>
<tabstop>linescan_step</tabstop>
<tabstop>linescan_relative</tabstop>
<tabstop>linescan_exp_time</tabstop>
<tabstop>linescan_step_2</tabstop>
<tabstop>scan_button</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>device_combobox_2</sender>
<signal>currentTextChanged(QString)</signal>
<receiver>dap_combo_box</receiver>
<slot>select_y_axis(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>297</x>
<y>170</y>
</hint>
<hint type="destinationlabel">
<x>467</x>
<y>170</y>
</hint>
</hints>
</connection>
<connection>
<sender>dap_combo_box</sender>
<signal>new_dap_config(QString,QString,QString)</signal>
<receiver>bec_waveform_widget</receiver>
<slot>add_dap(QString,QString,QString)</slot>
<hints>
<hint type="sourcelabel">
<x>467</x>
<y>170</y>
</hint>
<hint type="destinationlabel">
<x>1099</x>
<y>221</y>
</hint>
</hints>
</connection>
<connection>
<sender>scan_button</sender>
<signal>clicked()</signal>
<receiver>scan_control</receiver>
<slot>run_scan()</slot>
<hints>
<hint type="sourcelabel">
<x>455</x>
<y>511</y>
</hint>
<hint type="destinationlabel">
<x>16</x>
<y>441</y>
</hint>
</hints>
</connection>
<connection>
<sender>device_combobox_2</sender>
<signal>currentTextChanged(QString)</signal>
<receiver>bec_waveform_widget</receiver>
<slot>plot(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>297</x>
<y>170</y>
</hint>
<hint type="destinationlabel">
<x>1099</x>
<y>201</y>
</hint>
</hints>
</connection>
<connection>
<sender>toggle_switch</sender>
<signal>enabled(bool)</signal>
@ -872,27 +540,26 @@
</hints>
</connection>
<connection>
<sender>device_combobox</sender>
<sender>device_combobox_2</sender>
<signal>currentTextChanged(QString)</signal>
<receiver>positioner_box</receiver>
<slot>set_positioner(QString)</slot>
<receiver>bec_waveform_widget</receiver>
<slot>plot(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>109</x>
<y>155</y>
<x>297</x>
<y>170</y>
</hint>
<hint type="destinationlabel">
<x>160</x>
<y>286</y>
<x>1099</x>
<y>201</y>
</hint>
</hints>
</connection>
<!--
<connection>
<sender>device_combobox</sender>
<sender>device_combobox_2</sender>
<signal>currentTextChanged(QString)</signal>
<receiver>bec_waveform_widget</receiver>
<slot>set_x(QString)</slot>
<receiver>dap_combo_box</receiver>
<slot>select_y_axis(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>297</x>
@ -904,7 +571,22 @@
</hint>
</hints>
</connection>
-->
<connection>
<sender>dap_combo_box</sender>
<signal>new_dap_config(QString,QString,QString)</signal>
<receiver>bec_waveform_widget</receiver>
<slot>add_dap(QString,QString,QString)</slot>
<hints>
<hint type="sourcelabel">
<x>467</x>
<y>170</y>
</hint>
<hint type="destinationlabel">
<x>1099</x>
<y>221</y>
</hint>
</hints>
</connection>
<connection>
<sender>scan_control</sender>
<signal>scan_axis(QString,double,double)</signal>
@ -937,5 +619,21 @@
</hint>
</hints>
</connection>
<connection>
<sender>scan_control</sender>
<signal>device_selected(QString)</signal>
<receiver>positioner_group</receiver>
<slot>set_positioners(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>227</x>
<y>337</y>
</hint>
<hint type="destinationlabel">
<x>227</x>
<y>676</y>
</hint>
</hints>
</connection>
</connections>
</ui>