- Remove 257 redundant per-definition comment stubs across the package - Drop dead nonlocal declarations in autoslicer_detection.py - Document the swapped flag and swap_left_right in architecture docs - Remove unsupported 'legacy override' claims from autotune/runtime docs
244 lines
11 KiB
Python
244 lines
11 KiB
Python
from PySide6.QtCore import QSize, Qt
|
|
from PySide6.QtWidgets import (
|
|
QCheckBox,
|
|
QComboBox,
|
|
QGridLayout,
|
|
QHBoxLayout,
|
|
QLabel,
|
|
QPushButton,
|
|
QSpinBox,
|
|
QWidget,
|
|
)
|
|
|
|
from .ui_builders_shared import ScanSlicerUiSharedMixin, ScrollbarWheelOnlyScrollArea, icon_from_svg_data_url
|
|
|
|
|
|
class ScanSlicerUiControlsMixin(ScanSlicerUiSharedMixin):
|
|
def _add_directory_section(self, controls_layout, section_row):
|
|
controls_layout.addWidget(self._build_section_title("Directory"), section_row, 0, 1, 2)
|
|
section_row += 1
|
|
directory_group, directory_layout = self._new_group_layout()
|
|
|
|
row = 0
|
|
self.button_opendir = self._create_panel_button("Open directory", self.open_directory)
|
|
row = self._add_full_width_widget(directory_layout, row, self.button_opendir)
|
|
row = self._add_spacer_row(directory_layout, row)
|
|
row = self._add_label_row(directory_layout, row, "Output Directory")
|
|
|
|
self.output_dir_label = QLabel("(not set)")
|
|
self.output_dir_label.setWordWrap(True)
|
|
row = self._add_full_width_widget(directory_layout, row, self.output_dir_label)
|
|
row = self._add_spacer_row(directory_layout, row)
|
|
|
|
self.button_set_outdir = self._create_panel_button("Set output directory", self.set_output_directory)
|
|
row = self._add_full_width_widget(directory_layout, row, self.button_set_outdir)
|
|
row = self._add_spacer_row(directory_layout, row)
|
|
row = self._add_label_row(directory_layout, row, "Sort Images")
|
|
|
|
self.sort_mode_dropdown = QComboBox()
|
|
self.sort_mode_dropdown.addItems(["Name", "Time"])
|
|
self.sort_mode_dropdown.currentTextChanged.connect(self.set_sort_mode)
|
|
row = self._add_full_width_widget(directory_layout, row, self.sort_mode_dropdown)
|
|
|
|
controls_layout.addWidget(directory_group, section_row, 0, 1, 2)
|
|
return section_row + 1
|
|
|
|
def _add_images_section(self, controls_layout, section_row):
|
|
controls_layout.addWidget(self._build_section_title("Images"), section_row, 0, 1, 2)
|
|
section_row += 1
|
|
image_group, image_layout = self._new_group_layout()
|
|
|
|
row = 0
|
|
navigation_row = QWidget(image_group)
|
|
navigation_row_layout = QGridLayout(navigation_row)
|
|
navigation_row_layout.setContentsMargins(0, 0, 0, 0)
|
|
navigation_row_layout.setHorizontalSpacing(6)
|
|
|
|
self.goto_image_dropdown = QComboBox(navigation_row)
|
|
self.goto_image_dropdown.currentIndexChanged.connect(self.goto_image_from_dropdown)
|
|
self.goto_image_dropdown.setEnabled(False)
|
|
navigation_row_layout.addWidget(self.goto_image_dropdown, 0, 0)
|
|
|
|
self.button_previmg = QPushButton(navigation_row)
|
|
self.button_previmg.clicked.connect(self.prev_image)
|
|
self.button_previmg.setToolTip("Previous image")
|
|
prev_icon = icon_from_svg_data_url(
|
|
self.PREV_IMAGE_ICON_DATA_URL,
|
|
20,
|
|
palette=self.button_previmg.palette(),
|
|
)
|
|
if prev_icon is not None:
|
|
self.button_previmg.setIcon(prev_icon)
|
|
self.button_previmg.setText("")
|
|
self.button_previmg.setIconSize(QSize(20, 20))
|
|
else:
|
|
self.button_previmg.setText("Prev")
|
|
navigation_row_layout.addWidget(self.button_previmg, 0, 1)
|
|
|
|
self.button_nextimg = QPushButton(navigation_row)
|
|
self.button_nextimg.clicked.connect(self.next_image)
|
|
self.button_nextimg.setToolTip("Next image")
|
|
next_icon = icon_from_svg_data_url(
|
|
self.NEXT_IMAGE_ICON_DATA_URL,
|
|
20,
|
|
palette=self.button_nextimg.palette(),
|
|
)
|
|
if next_icon is not None:
|
|
self.button_nextimg.setIcon(next_icon)
|
|
self.button_nextimg.setText("")
|
|
self.button_nextimg.setIconSize(QSize(20, 20))
|
|
else:
|
|
self.button_nextimg.setText("Next")
|
|
navigation_row_layout.addWidget(self.button_nextimg, 0, 2)
|
|
nav_button_height = max(
|
|
self.button_previmg.sizeHint().height(),
|
|
self.button_nextimg.sizeHint().height(),
|
|
)
|
|
self.goto_image_dropdown.setFixedHeight(nav_button_height)
|
|
navigation_row_layout.setColumnStretch(0, 1)
|
|
|
|
row = self._add_full_width_widget(image_layout, row, navigation_row)
|
|
|
|
row = self._add_spacer_row(image_layout, row)
|
|
row = self._add_label_row(image_layout, row, "Save Format")
|
|
|
|
self.save_format_dropdown = QComboBox()
|
|
self.save_format_dropdown.addItems(["jpg", "png"])
|
|
self.save_format_dropdown.currentTextChanged.connect(self.set_save_format)
|
|
row = self._add_full_width_widget(image_layout, row, self.save_format_dropdown)
|
|
row = self._add_spacer_row(image_layout, row)
|
|
|
|
self.jpg_quality_label = QLabel("JPG Quality (1-100)")
|
|
row = self._add_full_width_widget(image_layout, row, self.jpg_quality_label)
|
|
|
|
self.jpg_quality_spinbox = QSpinBox()
|
|
self.jpg_quality_spinbox.setRange(1, 100)
|
|
self.jpg_quality_spinbox.setSingleStep(1)
|
|
self.jpg_quality_spinbox.setValue(self.jpg_quality)
|
|
self.jpg_quality_spinbox.setFixedWidth(self.STEPPER_WIDTH)
|
|
self.jpg_quality_spinbox.valueChanged.connect(self.set_jpg_quality)
|
|
row = self._add_full_width_widget(image_layout, row, self.jpg_quality_spinbox)
|
|
|
|
self.png_compression_label = QLabel("PNG Compression (0-9)")
|
|
row = self._add_full_width_widget(image_layout, row, self.png_compression_label)
|
|
|
|
self.png_compression_spinbox = QSpinBox()
|
|
self.png_compression_spinbox.setRange(0, 9)
|
|
self.png_compression_spinbox.setSingleStep(1)
|
|
self.png_compression_spinbox.setValue(self.png_compression)
|
|
self.png_compression_spinbox.setFixedWidth(self.STEPPER_WIDTH)
|
|
self.png_compression_spinbox.valueChanged.connect(self.set_png_compression)
|
|
row = self._add_full_width_widget(image_layout, row, self.png_compression_spinbox)
|
|
|
|
self.save_format_dropdown.setCurrentText(self.save_format)
|
|
|
|
row = self._add_spacer_row(image_layout, row)
|
|
self.button_saveimgs = self._create_panel_button("Save images", self.save_all)
|
|
row = self._add_full_width_widget(image_layout, row, self.button_saveimgs)
|
|
|
|
controls_layout.addWidget(image_group, section_row, 0, 1, 2)
|
|
return section_row + 1
|
|
|
|
def _add_presets_section(self, controls_layout, section_row):
|
|
controls_layout.addWidget(self._build_section_title("Presets"), section_row, 0, 1, 2)
|
|
section_row += 1
|
|
presets_group, presets_layout = self._new_group_layout()
|
|
|
|
row = 0
|
|
autotune_row = QWidget(presets_group)
|
|
autotune_row_layout = QHBoxLayout(autotune_row)
|
|
autotune_row_layout.setContentsMargins(0, 0, 0, 0)
|
|
autotune_row_layout.setSpacing(6)
|
|
|
|
self.autotune_profile_dropdown = QComboBox(autotune_row)
|
|
self.autotune_profile_dropdown.addItems(self.autoslicer.autotune_profile_names())
|
|
self.autotune_profile_dropdown.setToolTip("Auto-tune search profile")
|
|
self.autotune_profile_dropdown.setCurrentText(self.autotune_profile)
|
|
self.autotune_profile_dropdown.currentTextChanged.connect(self.set_autotune_profile)
|
|
autotune_row_layout.addWidget(self.autotune_profile_dropdown, 1)
|
|
|
|
self.button_autotune = self._create_panel_button("Auto-tune", self.autotune_parameters)
|
|
autotune_row_layout.addWidget(self.button_autotune)
|
|
|
|
row = self._add_full_width_widget(presets_layout, row, autotune_row)
|
|
|
|
self.button_clear_autotune_history = self._create_panel_button(
|
|
"Clear auto-tune history",
|
|
self.clear_autotune_history,
|
|
tooltip="Clear saved feedback used by auto-tune",
|
|
)
|
|
row = self._add_full_width_widget(presets_layout, row, self.button_clear_autotune_history)
|
|
row = self._add_spacer_row(presets_layout, row)
|
|
|
|
expected_block = self._build_parameter_block(
|
|
presets_group,
|
|
"expected_count",
|
|
self.params.expected_count,
|
|
)
|
|
row = self._add_full_width_widget(presets_layout, row, expected_block)
|
|
row = self._add_spacer_row(presets_layout, row)
|
|
row = self._add_label_row(presets_layout, row, "Preset")
|
|
|
|
self.preset_dropdown = QComboBox()
|
|
self.preset_dropdown.addItem("Custom")
|
|
self.preset_dropdown.addItems(self.params.preset_names())
|
|
self.preset_dropdown.currentTextChanged.connect(self.apply_parameter_preset)
|
|
row = self._add_full_width_widget(presets_layout, row, self.preset_dropdown)
|
|
self.button_delete_preset = self._create_panel_button("Delete current preset", self.delete_current_preset)
|
|
row = self._add_full_width_widget(presets_layout, row, self.button_delete_preset)
|
|
|
|
controls_layout.addWidget(presets_group, section_row, 0, 1, 2)
|
|
return section_row + 1
|
|
|
|
def _add_parameters_section(self, controls_layout, section_row):
|
|
controls_layout.addWidget(self._build_section_title("Parameters"), section_row, 0, 1, 2)
|
|
section_row += 1
|
|
parameters_group, parameters_layout = self._new_group_layout()
|
|
|
|
row = 0
|
|
self.button_loaddef = self._create_panel_button("Load defaults", self.load_default_parameters)
|
|
row = self._add_full_width_widget(parameters_layout, row, self.button_loaddef)
|
|
|
|
self.button_savedef = self._create_panel_button("Save new defaults", self.save_default_parameters)
|
|
row = self._add_full_width_widget(parameters_layout, row, self.button_savedef)
|
|
|
|
self.button_savepreset = self._create_panel_button("Save as preset...", self.save_current_as_preset)
|
|
row = self._add_full_width_widget(parameters_layout, row, self.button_savepreset)
|
|
row = self._add_spacer_row(parameters_layout, row)
|
|
|
|
self.show_advanced_checkbox = QCheckBox("Show advanced parameters")
|
|
self.show_advanced_checkbox.setChecked(self.show_advanced_params)
|
|
self.show_advanced_checkbox.toggled.connect(self.set_show_advanced_parameters)
|
|
row = self._add_full_width_widget(parameters_layout, row, self.show_advanced_checkbox)
|
|
row = self._add_spacer_row(parameters_layout, row)
|
|
|
|
for name, parameter in self.params.items():
|
|
if name == "expected_count":
|
|
continue
|
|
param_block = self._build_parameter_block(parameters_group, name, parameter)
|
|
row = self._add_full_width_widget(parameters_layout, row, param_block)
|
|
|
|
controls_layout.addWidget(parameters_group, section_row, 0, 1, 2)
|
|
return section_row + 1
|
|
|
|
def _build_controls_panel(self, root):
|
|
controls = QWidget()
|
|
controls_layout = QGridLayout(controls)
|
|
|
|
section_row = 0
|
|
section_row = self._add_directory_section(controls_layout, section_row)
|
|
section_row = self._add_images_section(controls_layout, section_row)
|
|
section_row = self._add_presets_section(controls_layout, section_row)
|
|
section_row = self._add_parameters_section(controls_layout, section_row)
|
|
|
|
controls_layout.setRowStretch(section_row + 1, 1)
|
|
|
|
controls_scroll = ScrollbarWheelOnlyScrollArea(root)
|
|
controls_scroll.setWidgetResizable(True)
|
|
controls_scroll.setWidget(controls)
|
|
controls_scroll.setFixedWidth(self.CONTROL_PANEL_WIDTH)
|
|
controls_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
|
return controls_scroll
|
|
|
|
|
|
__all__ = ["ScanSlicerUiControlsMixin"]
|