diff --git a/GUI_draft_live.py b/GUI_draft_live.py index 0e6eddead0163d2840ded7435da5682b06417ee3..971d3210f87fcf99024e856fa122928bc61922ef 100644 --- a/GUI_draft_live.py +++ b/GUI_draft_live.py @@ -19,6 +19,8 @@ from PyQt5.QtCore import Qt, QRectF, QSize # from skimage.filters import gaussian # def preprocess_image(image, sigma=3, clip_limit=0.01): ... # def compute_cost_image(path, user_radius, sigma=3, clip_limit=0.01): ... +# def find_path(cost_image, points): ... +# ... from live_wire import compute_cost_image, find_path, preprocess_image @@ -165,12 +167,25 @@ class CircleEditorWidget(QWidget): layout = QVBoxLayout(self) self.setLayout(layout) - # Specialized CircleEditorGraphicsView + # + # 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) @@ -184,11 +199,13 @@ class CircleEditorWidget(QWidget): self._graphics_view.setSceneRect(QRectF(self._pixmap.rect())) self._graphics_view.fitInView(self._image_item, Qt.KeepAspectRatio) - # Bottom controls + # + # 3) CONTROLS BELOW + # bottom_layout = QHBoxLayout() layout.addLayout(bottom_layout) - # We'll store the label in an attribute so we can update with the slider value + # label + slider self._lbl_size = QLabel(f"size ({self._init_radius})") bottom_layout.addWidget(self._lbl_size) @@ -197,6 +214,7 @@ class CircleEditorWidget(QWidget): self._slider.setValue(self._init_radius) bottom_layout.addWidget(self._slider) + # done button self._btn_done = QPushButton("Done") bottom_layout.addWidget(self._btn_done) @@ -335,7 +353,6 @@ class ImageGraphicsView(PanZoomGraphicsView): # Smoothing parameters self._savgol_window_length = 7 - self._savgol_polyorder = 1 def set_rainbow_enabled(self, enabled: bool): self._rainbow_enabled = enabled @@ -352,12 +369,6 @@ class ImageGraphicsView(PanZoomGraphicsView): wlen += 1 self._savgol_window_length = wlen - p = round(wlen / 7.0) - p = max(1, p) - if p >= wlen: - p = wlen - 1 - self._savgol_polyorder = p - self._rebuild_full_path() # -------------------------------------------------------------------- @@ -563,7 +574,7 @@ class ImageGraphicsView(PanZoomGraphicsView): smoothed = savgol_filter( arr_xy, window_length=self._savgol_window_length, - polyorder=self._savgol_polyorder, + polyorder=2, axis=0 ) big_xy = smoothed.tolist() @@ -789,16 +800,16 @@ class AdvancedSettingsWidget(QWidget): controls_layout.addWidget(self.btn_toggle_rainbow, 0, 0) # 2) Circle editor - self.btn_circle_editor = QPushButton("Open Circle Editor") + self.btn_circle_editor = QPushButton("Calibrate Kernel Size") self.btn_circle_editor.clicked.connect(self._main_window.open_circle_editor) controls_layout.addWidget(self.btn_circle_editor, 0, 1) # 3) Line smoothing slider + label - self._lab_smoothing = QLabel("Line smoothing (7)") + self._lab_smoothing = QLabel("Line smoothing (3)") controls_layout.addWidget(self._lab_smoothing, 1, 0) self.line_smoothing_slider = QSlider(Qt.Horizontal) self.line_smoothing_slider.setRange(3, 51) - self.line_smoothing_slider.setValue(7) + self.line_smoothing_slider.setValue(3) self.line_smoothing_slider.valueChanged.connect(self._on_line_smoothing_slider) controls_layout.addWidget(self.line_smoothing_slider, 1, 1) @@ -806,8 +817,9 @@ class AdvancedSettingsWidget(QWidget): self._lab_contrast = QLabel("Contrast (0.01)") controls_layout.addWidget(self._lab_contrast, 2, 0) self.contrast_slider = QSlider(Qt.Horizontal) - self.contrast_slider.setRange(0, 100) + self.contrast_slider.setRange(1, 20) self.contrast_slider.setValue(1) # i.e. 0.01 + self.contrast_slider.setSingleStep(1) self.contrast_slider.valueChanged.connect(self._on_contrast_slider) controls_layout.addWidget(self.contrast_slider, 2, 1) @@ -933,11 +945,26 @@ class MainWindow(QMainWindow): # Outer widget + layout self._main_widget = QWidget() self._main_layout = QHBoxLayout(self._main_widget) + + # The "left" part: container for the image area + its controls self._left_panel = QVBoxLayout() - self._main_layout.addLayout(self._left_panel) + + # We'll make a container widget for the left panel, so we can set stretches: + self._left_container = QWidget() + self._left_container.setLayout(self._left_panel) + + # Now we add them to the main layout with 70%:30% ratio + self._main_layout.addWidget(self._left_container, 7) # 70% + + # We haven't added the advanced widget yet, but we'll do so with ratio=3 => 30% + self._advanced_widget = AdvancedSettingsWidget(self) + # Hide it initially + self._advanced_widget.hide() + self._main_layout.addWidget(self._advanced_widget, 3) + self.setCentralWidget(self._main_widget) - # Image view + # The image view self.image_view = ImageGraphicsView() self._left_panel.addWidget(self.image_view) @@ -963,11 +990,6 @@ class MainWindow(QMainWindow): self._left_panel.addLayout(btn_layout) - # Advanced settings widget - self._advanced_widget = AdvancedSettingsWidget(self) - self._advanced_widget.hide() - self._main_layout.addWidget(self._advanced_widget) - self.resize(1000, 600) self._old_central_widget = None self._editor = None @@ -977,6 +999,7 @@ class MainWindow(QMainWindow): self._advanced_widget.show() else: self._advanced_widget.hide() + # Force re-layout self.adjustSize() def open_circle_editor(self):