feat: add More link in sample camera help overlay opening F1 dialog

Underlined 'More… (F1)' line at the bottom of the painted help box emits
open_full_help, wired to the existing Mouse / Keyboard Controls dialog.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 11:00:20 +02:00
co-authored by Claude Fable 5
parent e18c7feded
commit ebe0860ed4
2 changed files with 39 additions and 1 deletions
+1
View File
@@ -913,6 +913,7 @@ class MainWindow(QMainWindow):
self.sample_camera.smargon.connect(self.daq.move_smargon)
self.beamline.smargon_panel.smargon.connect(self.daq.move_smargon)
self.sample_camera.samcam_updated.connect(self.daq.samcam_settings)
self.sample_camera.open_full_help.connect(self.show_controls_help)
self.raster.omega.connect(self.daq.set_omega)
self.raster.smargon.connect(self.daq.move_smargon)
+38 -1
View File
@@ -98,6 +98,8 @@ class SampleCameraImageLabel(QGraphicsView):
samcam_updated = Signal(SampleCameraSettings)
switch_raster_grid = Signal()
# "More…" link in the help overlay; main window opens the full F1 dialog.
open_full_help = Signal()
def __init__(
self,
@@ -147,6 +149,7 @@ class SampleCameraImageLabel(QGraphicsView):
# legend visibility is already handled by the panel checkboxes.
self._help_expanded = False
self._help_hit_rect: QRectF | None = None # viewport coords, set on paint
self._help_more_rect: QRectF | None = None # "More…" link inside the overlay
self._target_point = None
self._target_shape = None
self._target_color_name = "Cyan"
@@ -471,6 +474,19 @@ class SampleCameraImageLabel(QGraphicsView):
self._scaling()
def mousePressEvent(self, event):
# "More…" link before the box toggle: its rect lies inside the help box,
# so the toggle below would swallow the click otherwise.
if (
event.button() == Qt.MouseButton.LeftButton
and self._help_more_rect is not None
and self._help_more_rect.contains(QPointF(self.viewport().mapFrom(self, event.pos())))
):
self._help_expanded = False
self.update()
self.open_full_help.emit()
event.accept()
return
# Help badge first: pure UI affordance, must work even when camera
# interaction is disabled (session overlay etc.).
if (
@@ -1087,6 +1103,7 @@ class SampleCameraImageLabel(QGraphicsView):
def _draw_help_overlay(self, painter: QPainter):
self._help_hit_rect = None
self._help_more_rect = None
if not self._help_expanded:
self._draw_help_badge(painter)
return
@@ -1114,8 +1131,15 @@ class SampleCameraImageLabel(QGraphicsView):
for entry in entries:
max_width = max(max_width, fm.horizontalAdvance(entry))
more_text = "More… (F1)"
max_width = max(max_width, fm.horizontalAdvance(more_text))
width = max_width + padding * 2
height = len(self._HELP_SECTIONS) * header_height + n_lines * line_height + padding * 2
height = (
len(self._HELP_SECTIONS) * header_height
+ (n_lines + 1) * line_height # +1: trailing "More…" link line
+ padding * 2
)
bg_rect = QRectF(18, max(18, self.viewport().height() - height - 18), width, height)
self._help_hit_rect = bg_rect # click anywhere on the box to close
@@ -1135,6 +1159,19 @@ class SampleCameraImageLabel(QGraphicsView):
painter.drawText(QPointF(bg_rect.left() + padding, y + fm.ascent()), entry)
y += line_height
# Trailing link to the full F1 dialog; underlined so it reads as clickable.
link_font = QFont(font)
link_font.setUnderline(True)
painter.setFont(link_font)
painter.setPen(QPen(qcolor(LEGEND_TEXT), 1))
painter.drawText(QPointF(bg_rect.left() + padding, y + fm.ascent()), more_text)
self._help_more_rect = QRectF(
bg_rect.left() + padding,
y,
fm.horizontalAdvance(more_text),
line_height,
)
painter.restore()
def _draw_overlay_legend(self, painter: QPainter):