GUI: added message if session state is vacant or other

This commit is contained in:
2025-10-30 11:10:34 +01:00
parent 4c8414cee9
commit 6d3c11fbd5
+55 -14
View File
@@ -68,6 +68,7 @@ class SampleCameraImageLabel(QGraphicsView):
self.__raster_mgr = raster
self.__state = SampleCameraImageState.IDLE
self.__session_state: SessionsStateEnum | None = None
self.__sam_cam = SampleCameraSettings(exposure=0.1, gain=100.0)
self.__is_daq_busy = False
@@ -81,6 +82,7 @@ class SampleCameraImageLabel(QGraphicsView):
self.__bounding_box = None
self.__show_detections = True
self.start_point = None # Starting point of the rectangle
self.end_point = None # Ending point of the rectangle
@@ -129,38 +131,31 @@ class SampleCameraImageLabel(QGraphicsView):
self.__detections = []
self.update()
def __draw_busy_overlay(self, painter: QPainter, rect):
"""Draw 'BEAMLINE BUSY' text overlay when DAQ is in busy state."""
def __draw_busy_overlay(self, painter: QPainter):
if not self.__is_daq_busy:
return
# Save the current painter state
painter.save()
# Reset the painter to work in device coordinates (viewport coordinates)
painter.resetTransform()
# Set up the text properties with fixed font size
font = QFont()
font.setPointSize(24) # Fixed size in points
font.setBold(True)
painter.setFont(font)
# Create a semi-transparent background
painter.setPen(QPen(QColor(255, 255, 255, 200), 2, Qt.PenStyle.SolidLine))
painter.setBrush(QColor(255, 0, 0, 150)) # Semi-transparent red background
painter.setBrush(QColor(255, 0, 0, 150))
text = "BEAMLINE BUSY"
# Calculate text dimensions using the fixed font
font_metrics = QFontMetrics(font)
text_rect = font_metrics.boundingRect(text)
# Fixed position in viewport coordinates (50, 50 from top-left corner)
position_x = 50 # 50 pixels from left edge
position_y = 50 # 50 pixels from top edge
# Create a rectangle for the background in viewport coordinates
padding = 20
bg_rect = QRect(
position_x - padding,
@@ -169,10 +164,8 @@ class SampleCameraImageLabel(QGraphicsView):
text_rect.height() + 2 * padding
)
# Draw the background rectangle
painter.drawRoundedRect(bg_rect, 10, 10)
# Draw the text at fixed viewport position
painter.setPen(QPen(QColor(255, 255, 255), 2, Qt.PenStyle.SolidLine))
text_pos = QPoint(
position_x,
@@ -180,7 +173,48 @@ class SampleCameraImageLabel(QGraphicsView):
)
painter.drawText(text_pos, text)
# Restore the painter state
painter.restore()
def __draw_session_overlay(self, painter: QPainter):
if self.__session_state not in (SessionsStateEnum.Vacant, SessionsStateEnum.OwnedByElse):
return
painter.save()
painter.resetTransform()
font = QFont()
font.setPointSize(24)
font.setBold(True)
painter.setFont(font)
if self.__session_state == SessionsStateEnum.Vacant:
bg_color = QColor(255, 215, 0, 180)
text = "Session Vacant"
else:
bg_color = QColor(255, 0, 0, 150)
text = "Session Other"
fm = QFontMetrics(font)
text_rect = fm.boundingRect(text)
padding = 16
vw = self.viewport().width()
vh = self.viewport().height()
bg_w = text_rect.width() + 2 * padding
bg_h = text_rect.height() + 2 * padding
position_x = int((vw - bg_w) / 2)
position_y = int((vh - bg_h) / 2)
bg_rect = QRect(position_x, position_y, bg_w, bg_h)
painter.setPen(QPen(QColor(255, 255, 255, 220)))
painter.setBrush(bg_color)
painter.drawRoundedRect(bg_rect, 10, 10)
painter.setPen(QPen(QColor(255, 255, 255)))
painter.drawText(QPoint(position_x + padding, position_y + padding + fm.ascent()), text)
painter.restore()
def drawForeground(self, painter, rect):
@@ -188,7 +222,8 @@ class SampleCameraImageLabel(QGraphicsView):
self.__draw_beam_center(painter)
self.__raster_mgr.draw_grid(painter, self.__raster_alpha)
self.__draw_helical(painter)
self.__draw_busy_overlay(painter, rect)
self.__draw_busy_overlay(painter)
self.__draw_session_overlay(painter)
self.__draw_detections(painter, rect)
def resizeEvent(self, event):
@@ -395,6 +430,11 @@ class SampleCameraImageLabel(QGraphicsView):
self.__sam_cam = s.bl.sample_camera
self.__bounding_box = s.box
new_session_state = s.session.session if hasattr(s, 'session') else None
if new_session_state != self.__session_state:
self.__session_state = new_session_state
self.update()
if s.busy != self.__is_daq_busy:
self.__is_daq_busy = s.busy
self.update()
@@ -405,6 +445,7 @@ class SampleCameraImageLabel(QGraphicsView):
self.__state = SampleCameraImageState.IDLE
def __left_single_click(self, event):
match self.__state:
case SampleCameraImageState.BEAM_MARKING: