Files
pyPhotoSorter/photo_sorter/ui/settings_dialog.py
Hirnwunde 87ab7ee73c first
2026-02-26 08:42:12 +01:00

125 lines
3.9 KiB
Python

from __future__ import annotations
from typing import Dict, List, Optional
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (
QButtonGroup,
QDialog,
QDialogButtonBox,
QFileDialog,
QGridLayout,
QHBoxLayout,
QLabel,
QLineEdit,
QPushButton,
QRadioButton,
QVBoxLayout,
)
from photo_sorter.core.config_manager import AppConfig, TargetConfig, ActionType
KEYS = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
class SettingsDialog(QDialog):
"""Dialog zur Konfiguration der Ziele und der Standard-Aktion."""
def __init__(self, config: AppConfig, parent=None) -> None:
super().__init__(parent)
self.setWindowTitle("Ziele konfigurieren")
self._config = config
self._target_rows: Dict[str, Dict[str, object]] = {}
self._action: ActionType = config.default_action
main_layout = QVBoxLayout(self)
grid = QGridLayout()
grid.addWidget(QLabel("Taste"), 0, 0)
grid.addWidget(QLabel("Label"), 0, 1)
grid.addWidget(QLabel("Verzeichnis"), 0, 2)
grid.addWidget(QLabel(""), 0, 3)
existing_by_key: Dict[str, TargetConfig] = {t.key: t for t in config.targets}
for row, key in enumerate(KEYS, start=1):
key_label = QLabel(key)
label_edit = QLineEdit()
path_edit = QLineEdit()
path_edit.setReadOnly(True)
browse_btn = QPushButton("Wählen…")
def make_browse(k: str, pe: QLineEdit):
def browse() -> None:
directory = QFileDialog.getExistingDirectory(self, "Zielverzeichnis wählen")
if directory:
pe.setText(directory)
return browse
browse_btn.clicked.connect(make_browse(key, path_edit)) # type: ignore[arg-type]
grid.addWidget(key_label, row, 0)
grid.addWidget(label_edit, row, 1)
grid.addWidget(path_edit, row, 2)
grid.addWidget(browse_btn, row, 3)
existing = existing_by_key.get(key)
if existing:
label_edit.setText(existing.label)
path_edit.setText(existing.path)
self._target_rows[key] = {
"label_edit": label_edit,
"path_edit": path_edit,
}
main_layout.addLayout(grid)
# Move/Copy Auswahl
action_layout = QHBoxLayout()
action_layout.addWidget(QLabel("Aktion:"))
self._move_radio = QRadioButton("Verschieben")
self._copy_radio = QRadioButton("Kopieren")
bg = QButtonGroup(self)
bg.addButton(self._move_radio)
bg.addButton(self._copy_radio)
if config.default_action == "copy":
self._copy_radio.setChecked(True)
else:
self._move_radio.setChecked(True)
action_layout.addWidget(self._move_radio)
action_layout.addWidget(self._copy_radio)
action_layout.addStretch(1)
main_layout.addLayout(action_layout)
# Buttons
buttons = QDialogButtonBox(
QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel,
parent=self,
)
buttons.accepted.connect(self.accept) # type: ignore[arg-type]
buttons.rejected.connect(self.reject) # type: ignore[arg-type]
main_layout.addWidget(buttons)
def get_config(self) -> AppConfig:
targets: List[TargetConfig] = []
for key in KEYS:
row = self._target_rows[key]
label = row["label_edit"].text().strip() # type: ignore[assignment]
path = row["path_edit"].text().strip() # type: ignore[assignment]
if not path:
continue
targets.append(TargetConfig(key=key, path=path, label=label))
action: ActionType = "move"
if self._copy_radio.isChecked():
action = "copy"
return AppConfig(targets=targets, default_action=action)