feat: group beam mark/center/size under one Beam Config banner

The three small beam panels shared a column with three collapsible
banners; BeamConfigPanel puts them under a single collapsible
'Beam Config.' TitleLabel with section_title() sub-headings.
beam_mark/beam_center/beam_size stay as aliases on BeamlineControls so
main_window signal wiring is untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 10:35:46 +02:00
co-authored by Claude Fable 5
parent 913089b9b6
commit 00e5d116a6
4 changed files with 37 additions and 16 deletions
+2 -4
View File
@@ -3,7 +3,7 @@ from PySide6.QtCore import Signal, Slot
from PySide6.QtWidgets import QGridLayout, QLabel, QWidget
from aare.gui.widgets.number_line_edit import NumberLineEdit
from aare.gui.widgets.title_label import TitleLabel
from aare.gui.widgets.title_label import section_title
class BeamCenterWidget(QWidget):
@@ -14,9 +14,7 @@ class BeamCenterWidget(QWidget):
grid_layout = QGridLayout(self)
grid_layout.addWidget(
TitleLabel("Beam center (detector)", self, collapsible=True), 0, 0, 1, 5
)
grid_layout.addWidget(section_title("Beam center (detector)", self), 0, 0, 1, 5)
self.x = NumberLineEdit(-4000, 4000, 0, parent=self)
self.x.newValue.connect(self.beam_center_edited)
+2 -2
View File
@@ -2,7 +2,7 @@ from aarecommon.models.models import DAQStatusModel
from PySide6.QtCore import Signal, Slot
from PySide6.QtWidgets import QGridLayout, QLabel, QPushButton, QWidget
from aare.gui.widgets.title_label import TitleLabel
from aare.gui.widgets.title_label import section_title
class BeamMarkWidget(QWidget):
@@ -13,7 +13,7 @@ class BeamMarkWidget(QWidget):
grid_layout = QGridLayout(self)
grid_layout.addWidget(TitleLabel("Beam mark (image)", self, collapsible=True), 0, 0, 1, 5)
grid_layout.addWidget(section_title("Beam mark (image)", self), 0, 0, 1, 5)
self.x = QLabel("0")
self.y = QLabel("0")
+2 -2
View File
@@ -3,7 +3,7 @@ from PySide6.QtCore import Signal, Slot
from PySide6.QtWidgets import QGridLayout, QLabel, QWidget
from aare.gui.widgets.number_line_edit import NumberLineEdit
from aare.gui.widgets.title_label import TitleLabel
from aare.gui.widgets.title_label import section_title
class BeamSizeWidget(QWidget):
@@ -14,7 +14,7 @@ class BeamSizeWidget(QWidget):
grid_layout = QGridLayout(self)
grid_layout.addWidget(TitleLabel("Beam size", self, collapsible=True), 0, 0, 1, 5)
grid_layout.addWidget(section_title("Beam size", self), 0, 0, 1, 5)
self.x = NumberLineEdit(1, 400.0, 10, parent=self)
self.x.newValue.connect(self.beam_size_edited)
+31 -8
View File
@@ -1,4 +1,4 @@
from PySide6.QtWidgets import QFrame, QVBoxLayout
from PySide6.QtWidgets import QFrame, QVBoxLayout, QWidget
from aare.gui.panels.abr_tweak_panel import AbrTweakWidget
from aare.gui.panels.beam_center_panel import BeamCenterWidget
@@ -10,7 +10,30 @@ from aare.gui.panels.omega_panel import OmegaPanel
from aare.gui.panels.samcam_panel import SamcamPanel
from aare.gui.panels.smargon_panel import SmargonPanel
from aare.gui.panels.zoom_panel import ZoomPanel
from aare.gui.widgets.title_label import tighten_column
from aare.gui.widgets.title_label import TitleLabel, tighten_column
class BeamConfigPanel(QWidget):
"""Beam mark / center / size grouped under one collapsible banner; the
sub-widgets keep their own signals and small section titles."""
def __init__(self, parent=None):
super().__init__(parent)
# Default layout margins so the banner aligns with the sibling
# panels' banners in the column.
layout = QVBoxLayout(self)
layout.setSpacing(0)
layout.addWidget(TitleLabel("Beam Config.", self, collapsible=True))
self.beam_mark = BeamMarkWidget(self)
self.beam_center = BeamCenterWidget(self)
self.beam_size = BeamSizeWidget(self)
for sub in (self.beam_mark, self.beam_center, self.beam_size):
sub_layout = sub.layout()
assert sub_layout is not None # each sub-widget builds its grid in __init__
# The outer layout already indents; zero the sub-grids' side
# margins so section content isn't double-inset.
sub_layout.setContentsMargins(0, 4, 0, 4)
layout.addWidget(sub)
class BeamlineControls(QFrame):
@@ -42,15 +65,15 @@ class BeamlineControls(QFrame):
if staff:
self.monochromator_panel = MonochromatorPanel(self)
self.abr_tweak = AbrTweakWidget(self)
self.beam_mark = BeamMarkWidget(self)
self.beam_center = BeamCenterWidget(self)
self.beam_size = BeamSizeWidget(self)
self.beam_config = BeamConfigPanel(self)
# Aliases: main_window wires signals via beamline.beam_mark etc.
self.beam_mark = self.beam_config.beam_mark
self.beam_center = self.beam_config.beam_center
self.beam_size = self.beam_config.beam_size
self.v_layout.addWidget(self.monochromator_panel)
self.v_layout.addWidget(self.abr_tweak)
self.v_layout.addWidget(self.beam_mark)
self.v_layout.addWidget(self.beam_center)
self.v_layout.addWidget(self.beam_size)
self.v_layout.addWidget(self.beam_config)
self.v_layout.addStretch()
tighten_column(self.v_layout)