From c63821617adb2bdd71362ecdc002f465f65d20e5 Mon Sep 17 00:00:00 2001 From: bartool Date: Mon, 29 Sep 2025 06:30:25 +0200 Subject: [PATCH] feat: add view settings dialog with adjustable parameters and navigation controls --- ui/icons/arrow-left-335-svgrepo-com.svg | 19 ++ ui/icons/arrow-right-336-svgrepo-com.svg | 19 ++ ui/main_window.py | 4 +- ui/view_settings_dialog.py | 211 +++++++++++++++++++++-- 4 files changed, 236 insertions(+), 17 deletions(-) create mode 100644 ui/icons/arrow-left-335-svgrepo-com.svg create mode 100644 ui/icons/arrow-right-336-svgrepo-com.svg diff --git a/ui/icons/arrow-left-335-svgrepo-com.svg b/ui/icons/arrow-left-335-svgrepo-com.svg new file mode 100644 index 0000000..cc006d3 --- /dev/null +++ b/ui/icons/arrow-left-335-svgrepo-com.svg @@ -0,0 +1,19 @@ + + + + + arrow_left [#335] + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/icons/arrow-right-336-svgrepo-com.svg b/ui/icons/arrow-right-336-svgrepo-com.svg new file mode 100644 index 0000000..49e64cc --- /dev/null +++ b/ui/icons/arrow-right-336-svgrepo-com.svg @@ -0,0 +1,19 @@ + + + + + arrow_right [#336] + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/main_window.py b/ui/main_window.py index 1b8360f..ef13f0a 100644 --- a/ui/main_window.py +++ b/ui/main_window.py @@ -44,7 +44,8 @@ class MainWindow(QMainWindow): histogram_view.setFixedHeight(200) self.view_settings_button = QPushButton("Ustawienia widoku") - control_layout.addWidget(self.view_settings_button) + self.view_settings_button.setMinimumHeight(40) + self.view_settings_button.setStyleSheet("font-size: 12pt;") self.view_settings_dialog = ViewSettingsDialog(self) self.view_settings_button.clicked.connect(self.view_settings_dialog.show) @@ -61,6 +62,7 @@ class MainWindow(QMainWindow): self.photo_button.setStyleSheet("font-size: 12pt;") control_layout.addWidget(histogram_view) + control_layout.addWidget(self.view_settings_button) control_layout.addWidget(self.color_list_widget) control_layout.addWidget(self.record_button) control_layout.addWidget(self.photo_button) diff --git a/ui/view_settings_dialog.py b/ui/view_settings_dialog.py index 993bece..c61dafd 100644 --- a/ui/view_settings_dialog.py +++ b/ui/view_settings_dialog.py @@ -1,30 +1,209 @@ -from PySide6.QtWidgets import QDialog, QHBoxLayout ,QVBoxLayout, QPushButton -from PySide6.QtCore import Qt +from PySide6.QtWidgets import QDialog, QHBoxLayout ,QVBoxLayout, QPushButton, QGroupBox, QLabel, QRadioButton, QWidget, QToolButton, QSlider, QButtonGroup +from PySide6.QtGui import QIcon +from PySide6.QtCore import Qt, QSize, Signal +ISO_ARR = ["AUTO","100", "200", "400", "800", "1600", "3200"] +SPEED_ARR = ["30", "25", "20", "15", "13", "10.3", "8", "6.3", "5", "4", "3.2", "2.5", "2", "1.6", "1.3", "1", "0.8", "0.6", "0.5", "0.4", "0.3", "1/4", "1/5", "1/6", "1/8", "1/10", "1/13", "1/15", "1/20", "1/25", "1/30", "1/40", "1/50", "1/60", "1/80", "1/100", "1/125", "1/160", "1/200", "1/250", "1/320", "1/400", "1/500", "1/640", "1/800", "1/1000", "1/1250", "1/1600", "1/2000", "1/2500", "1/3200", "1/4000"] +class LabeledSpinSelector(QWidget): + indexChanged = Signal(int) + + def __init__(self, title: str, values: list[str], show_slider: bool = False, parent=None): + super().__init__(parent) + self.values = values + self.current_index = 0 + self.show_slider = show_slider + self._init_ui(title) + + def _init_ui(self, title: str, button_size: int = 24, icon_size: int = 16): + self.title_label = QLabel(title) + + decrement_button = QToolButton() + decrement_button.setIcon(QIcon("ui/icons/arrow-left-335-svgrepo-com.svg")) + decrement_button.setFixedSize(button_size, button_size) + decrement_button.setIconSize(QSize(icon_size, icon_size)) + decrement_button.clicked.connect(self._decrement) + + increment_button = QToolButton() + increment_button.setIcon(QIcon("ui/icons/arrow-right-336-svgrepo-com.svg")) + increment_button.setFixedSize(button_size, button_size) + increment_button.setIconSize(QSize(icon_size, icon_size)) + increment_button.clicked.connect(self._increment) + + self.value_label = QLabel(self.values[self.current_index] if self.values else "N/A") + self.value_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.value_label.setStyleSheet("background-color: rgb(48, 48, 48);") + self.value_label.setFixedHeight(button_size - 2) + + spin_layout = QHBoxLayout() + spin_layout.addWidget(decrement_button) + spin_layout.addWidget(self.value_label) + spin_layout.addWidget(increment_button) + + top_layout = QHBoxLayout() + top_layout.addWidget(self.title_label) + top_layout.addLayout(spin_layout) + + self.slider = QSlider(Qt.Orientation.Horizontal) + self.slider.setRange(0, max(0, len(self.values) - 1)) + self.slider.setTickPosition(QSlider.TickPosition.TicksBelow) + self.slider.valueChanged.connect(self._slider_changed) + + main_layout = QVBoxLayout() + main_layout.addLayout(top_layout) + if self.show_slider: + main_layout.addWidget(self.slider) + + main_layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(main_layout) + + def _increment(self): + if not self.values: + return + new_index = min(self.current_index + 1, len(self.values) - 1) + self.set_index(new_index) + + def _decrement(self): + if not self.values: + return + new_index = max(self.current_index - 1, 0) + self.set_index(new_index) + + def _slider_changed(self, index): + if not self.values: + return + self.set_index(index) + + def set_label(self, label: str): + self.title_label.setText(label) + + def set_index(self, index: int): + if not self.values or not (0 <= index < len(self.values)): + return + if self.current_index != index: + self.current_index = index + self.value_label.setText(self.values[index]) + if self.show_slider: + self.slider.setValue(index) + self.indexChanged.emit(index) + else: + # Always update UI even if index is the same (for initial set) + self.value_label.setText(self.values[index]) + if self.show_slider: + self.slider.setValue(index) class ViewSettingsDialog(QDialog): + detectDevice = Signal(str) + connectionChanged = Signal(str) + def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Ustawienia widoku") - self.setFixedSize(300, 200) + self.setFixedSize(640, 480) - self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) + self.setWindowFlags(self.windowFlags() | Qt.WindowType.WindowStaysOnTopHint) - self.setup_ui() + # self.setup_ui() + camera_frame = self._create_devices_frame("camera") + hdmi_frame = self._create_devices_frame("hdmi") + conn_frame = self._create_connection_frame() + camera_settings = self._create_settings_frame() + hdmi_settings = self._create_settings_frame() + dialog_buttons = self._create_dialog_buttons() - def setup_ui(self): - self.main_layout = QVBoxLayout(self) + hdmi_settings.setEnabled(False) - self.btn_layout = QHBoxLayout() - self.btn_layout.addStretch() + settings_layout = QHBoxLayout() + settings_layout.addWidget(camera_settings, 1) + settings_layout.addWidget(hdmi_settings, 1) + # main layout + main_layout = QVBoxLayout(self) + main_layout.addWidget(camera_frame) + main_layout.addWidget(hdmi_frame) + main_layout.addWidget(conn_frame) + main_layout.addLayout(settings_layout) + main_layout.addLayout(dialog_buttons) - self.ok_button = QPushButton("OK") - self.ok_button.clicked.connect(self.accept) - self.btn_layout.addWidget(self.ok_button) + main_layout.setStretch(3, 1) - self.cancel_button = QPushButton("Anuluj") - self.cancel_button.clicked.connect(self.reject) - self.btn_layout.addWidget(self.cancel_button) + self.last_choice = None - self.main_layout.addLayout(self.btn_layout) \ No newline at end of file + + def _create_dialog_buttons(self): + ok_btn = QPushButton("OK") + ok_btn.clicked.connect(self.accept) + + cancel_btn = QPushButton("Anuluj") + cancel_btn.setDefault(True) + cancel_btn.clicked.connect(self.reject) + + layout = QHBoxLayout() + layout.addStretch() + layout.addWidget(ok_btn) + layout.addWidget(cancel_btn) + + return layout + + def _create_devices_frame(self, name): + frame = QGroupBox() + frame.setTitle("Wykryte aparaty") + frame.setContentsMargins(6, 20, 6, 10) + + device_label = QLabel("Nie wykryto podłączonych urządzeń.") + detect_button = QPushButton("Wykryj...") + detect_button.clicked.connect(lambda: self.detectDevice.emit(name)) + + layout = QHBoxLayout() + layout.addWidget(device_label) + layout.addStretch() + layout.addWidget(detect_button) + + frame.setLayout(layout) + + return frame + + def _create_connection_frame(self): + frame = QGroupBox() + frame.setTitle("Wybór połączenia") + frame.setContentsMargins(6, 20, 6, 10) + + radio_usb = QRadioButton("USB") + radio_hybrid = QRadioButton("USB + HDMI") + radio_hdmi = QRadioButton("HDMI") + + radio_hdmi.setEnabled(False) + + radio_usb.clicked.connect(lambda: self.radio_toggle("usb")) + radio_hybrid.clicked.connect(lambda: self.radio_toggle("hybrid")) + radio_hdmi.clicked.connect(lambda: self.radio_toggle("hdmi")) + + radio_layout = QHBoxLayout() + radio_layout.addStretch() + radio_layout.addWidget(radio_usb) + radio_layout.addStretch() + radio_layout.addWidget(radio_hybrid) + radio_layout.addStretch() + radio_layout.addWidget(radio_hdmi) + radio_layout.addStretch() + + frame.setLayout(radio_layout) + + return frame + + # def _create_settings_frame(self, settings: dict[str, list[str]]): + def _create_settings_frame(self): + frame = QGroupBox() + frame.setTitle("Ustawienia aparatu") + + layout = QVBoxLayout() + # for key, value in settings.items(): + # layout.addWidget(LabeledSpinSelector(key, value)) + layout.addStretch() + + frame.setLayout(layout) + return frame + + def radio_toggle(self, value): + if self.last_choice != value: + self.last_choice = value + self.connectionChanged.emit(value) \ No newline at end of file