Skip to content
Snippets Groups Projects
circleEditorWidget.py 3.14 KiB
Newer Older
  • Learn to ignore specific revisions
  • from PyQt5.QtWidgets import (
         QGraphicsScene, QGraphicsPixmapItem, QPushButton,
        QHBoxLayout, QVBoxLayout, QWidget, QSlider, QLabel
    )
    from PyQt5.QtGui import QFont
    from PyQt5.QtCore import Qt, QRectF, QSize
    from circleEditorGraphicsView import CircleEditorGraphicsView
    from draggableCircleItem import DraggableCircleItem
    
    class CircleEditorWidget(QWidget):
        def __init__(self, pixmap, init_radius=20, done_callback=None, parent=None):
            super().__init__(parent)
            self._pixmap = pixmap
            self._done_callback = done_callback
            self._init_radius = init_radius
    
            layout = QVBoxLayout(self)
            self.setLayout(layout)
    
            #
            # 1) ADD A CENTERED LABEL ABOVE THE IMAGE, WITH BIGGER FONT
            #
            label_instructions = QLabel("Scale the dot to be of the size of your ridge")
            label_instructions.setAlignment(Qt.AlignCenter)
            big_font = QFont("Arial", 20)
            big_font.setBold(True)
            label_instructions.setFont(big_font)
            layout.addWidget(label_instructions)
    
            #
            # 2) THE SPECIALIZED GRAPHICS VIEW THAT SHOWS THE IMAGE
            #
            self._graphics_view = CircleEditorGraphicsView(circle_editor_widget=self)
            self._scene = QGraphicsScene(self)
            self._graphics_view.setScene(self._scene)
            layout.addWidget(self._graphics_view)
    
            # Show the image
            self._image_item = QGraphicsPixmapItem(self._pixmap)
            self._scene.addItem(self._image_item)
    
            # Put circle in center
            cx = self._pixmap.width() / 2
            cy = self._pixmap.height() / 2
            self._circle_item = DraggableCircleItem(cx, cy, radius=self._init_radius, color=Qt.red)
            self._scene.addItem(self._circle_item)
    
            # Fit in view
            self._graphics_view.setSceneRect(QRectF(self._pixmap.rect()))
            self._graphics_view.fitInView(self._image_item, Qt.KeepAspectRatio)
    
            #
            # 3) CONTROLS BELOW
            #
            bottom_layout = QHBoxLayout()
            layout.addLayout(bottom_layout)
    
            # label + slider
            self._lbl_size = QLabel(f"size ({self._init_radius})")
            bottom_layout.addWidget(self._lbl_size)
    
            self._slider = QSlider(Qt.Horizontal)
            self._slider.setRange(1, 200)
            self._slider.setValue(self._init_radius)
            bottom_layout.addWidget(self._slider)
    
            # done button
            self._btn_done = QPushButton("Done")
            bottom_layout.addWidget(self._btn_done)
    
            # Connect signals
            self._slider.valueChanged.connect(self._on_slider_changed)
            self._btn_done.clicked.connect(self._on_done_clicked)
    
        def _on_slider_changed(self, value):
            self._circle_item.set_radius(value)
            self._lbl_size.setText(f"size ({value})")
    
        def _on_done_clicked(self):
            final_radius = self._circle_item.radius()
            if self._done_callback is not None:
                self._done_callback(final_radius)
    
        def update_slider_value(self, new_radius):
            self._slider.blockSignals(True)
            self._slider.setValue(new_radius)
            self._slider.blockSignals(False)
            self._lbl_size.setText(f"size ({new_radius})")
    
        def sizeHint(self):
            return QSize(800, 600)