diff --git a/gui/src/aaregui/widgets/camera_image.py b/gui/src/aaregui/widgets/camera_image.py index da29d959..b0538cdc 100644 --- a/gui/src/aaregui/widgets/camera_image.py +++ b/gui/src/aaregui/widgets/camera_image.py @@ -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: