diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bc1e0d..eff5e67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Änderungsprotokoll +## 1.0.6 – 2026-09-24 + +### Behoben + +- Dateianzeige und Fortschrittsleiste besitzen nun feste Breiten und verschieben sich beim Wechsel zwischen unterschiedlich langen Dateipfaden nicht mehr. +- Lange Dateipfade werden platzsparend gekürzt; der vollständige Text bleibt als Tooltip verfügbar. + ## 1.0.5 – 2026-09-24 ### Neu diff --git a/pyproject.toml b/pyproject.toml index 3ba94a0..349bc1e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "syncvito" -version = "1.0.5" +version = "1.0.6" description = "Windows-Desktopwerkzeug für lokale und NAS-Synchronisation" readme = "README.md" requires-python = ">=3.11" diff --git a/src/syncvito/main_window.py b/src/syncvito/main_window.py index c60242c..01b292c 100644 --- a/src/syncvito/main_window.py +++ b/src/syncvito/main_window.py @@ -7,7 +7,7 @@ from datetime import datetime from pathlib import Path from PyQt6.QtCore import QEvent, Qt, QTimer, pyqtSignal -from PyQt6.QtGui import QAction, QCloseEvent, QFontDatabase +from PyQt6.QtGui import QAction, QCloseEvent, QFontDatabase, QResizeEvent from PyQt6.QtWidgets import ( QAbstractItemView, QApplication, @@ -50,6 +50,35 @@ __all__ = ["MainWindow"] UPDATE_CHECK_INTERVAL_MS = 30 * 60 * 1000 UPDATE_RETRY_INTERVAL_MS = 60 * 1000 +PROGRESS_TEXT_WIDTH = 300 +PROGRESS_BAR_WIDTH = 450 + + +class _ElidedLabel(QLabel): + """Hält dynamische Texte in einer festen Breite vollständig zugänglich.""" + + def __init__(self, text: str = "", parent: QWidget | None = None) -> None: + super().__init__(parent) + self._full_text = "" + self.setText(text) + + def setText(self, text: str) -> None: # noqa: N802 - Qt API + self._full_text = text + self.setToolTip(text) + self.setAccessibleName(text) + self._refresh_elided_text() + + def resizeEvent(self, event: QResizeEvent) -> None: # noqa: N802 - Qt API + super().resizeEvent(event) + self._refresh_elided_text() + + def _refresh_elided_text(self) -> None: + visible_text = self.fontMetrics().elidedText( + self._full_text, + Qt.TextElideMode.ElideMiddle, + max(0, self.contentsRect().width()), + ) + super().setText(visible_text) class MainWindow(QMainWindow): @@ -65,7 +94,7 @@ class MainWindow(QMainWindow): self._notified_update_version: str | None = None self.setWindowTitle("SyncVito") self.setWindowIcon(app_icon()) - self.setMinimumSize(980, 680) + self.setMinimumSize(1040, 680) self.resize(1220, 800) self.coordinator = SyncCoordinator(config, config_store, self) @@ -380,15 +409,17 @@ class MainWindow(QMainWindow): dock.setFixedHeight(66) layout = QHBoxLayout(dock) layout.setContentsMargins(28, 12, 28, 12) - self.progress_text = QLabel("Bereit") - self.progress_text.setMinimumWidth(250) + self.progress_text = _ElidedLabel("Bereit") + self.progress_text.setFixedWidth(PROGRESS_TEXT_WIDTH) self.progress_text.setProperty("muted", True) self.progress_bar = QProgressBar() + self.progress_bar.setFixedWidth(PROGRESS_BAR_WIDTH) self.progress_bar.setRange(0, 100) self.progress_bar.setValue(0) self.progress_bar.setFormat("%p %") layout.addWidget(self.progress_text) - layout.addWidget(self.progress_bar, 1) + layout.addWidget(self.progress_bar) + layout.addStretch(1) return dock def _build_tray(self) -> None: diff --git a/tests/test_progress_layout.py b/tests/test_progress_layout.py new file mode 100644 index 0000000..36ae39b --- /dev/null +++ b/tests/test_progress_layout.py @@ -0,0 +1,28 @@ +from types import SimpleNamespace + +from PyQt6.QtWidgets import QApplication + +from syncvito.main_window import PROGRESS_BAR_WIDTH, PROGRESS_TEXT_WIDTH, MainWindow + + +def test_progress_widgets_keep_fixed_widths_for_long_paths() -> None: + application = QApplication.instance() or QApplication([]) + owner = SimpleNamespace() + dock = MainWindow._build_progress_dock(owner) + dock.resize(900, 66) + dock.show() + application.processEvents() + bar_x = owner.progress_bar.x() + long_path = "Kopieren: " + "sehr-langer-ordner\\" * 20 + "wichtige-datei.ini" + + owner.progress_text.setText(long_path) + application.processEvents() + + assert owner.progress_text.width() == PROGRESS_TEXT_WIDTH + assert owner.progress_bar.width() == PROGRESS_BAR_WIDTH + assert owner.progress_bar.x() == bar_x + assert owner.progress_text.text() != long_path + assert "…" in owner.progress_text.text() + assert owner.progress_text.toolTip() == long_path + assert owner.progress_text.accessibleName() == long_path + dock.close() diff --git a/version.txt b/version.txt index 90a27f9..af0b7dd 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.5 +1.0.6