Release SyncVito 1.0.6
This commit is contained in:
1 parent
bb2a0db609
commit
3d6ab87ce3
5 files changed
+73
-7
No files matched your search
@@ -1,5 +1,12 @@
|
|||||||
# Änderungsprotokoll
|
# Ä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
|
## 1.0.5 – 2026-09-24
|
||||||
|
|
||||||
### Neu
|
### Neu
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "syncvito"
|
name = "syncvito"
|
||||||
version = "1.0.5"
|
version = "1.0.6"
|
||||||
description = "Windows-Desktopwerkzeug für lokale und NAS-Synchronisation"
|
description = "Windows-Desktopwerkzeug für lokale und NAS-Synchronisation"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from datetime import datetime
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from PyQt6.QtCore import QEvent, Qt, QTimer, pyqtSignal
|
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 (
|
from PyQt6.QtWidgets import (
|
||||||
QAbstractItemView,
|
QAbstractItemView,
|
||||||
QApplication,
|
QApplication,
|
||||||
@@ -50,6 +50,35 @@ __all__ = ["MainWindow"]
|
|||||||
|
|
||||||
UPDATE_CHECK_INTERVAL_MS = 30 * 60 * 1000
|
UPDATE_CHECK_INTERVAL_MS = 30 * 60 * 1000
|
||||||
UPDATE_RETRY_INTERVAL_MS = 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):
|
class MainWindow(QMainWindow):
|
||||||
@@ -65,7 +94,7 @@ class MainWindow(QMainWindow):
|
|||||||
self._notified_update_version: str | None = None
|
self._notified_update_version: str | None = None
|
||||||
self.setWindowTitle("SyncVito")
|
self.setWindowTitle("SyncVito")
|
||||||
self.setWindowIcon(app_icon())
|
self.setWindowIcon(app_icon())
|
||||||
self.setMinimumSize(980, 680)
|
self.setMinimumSize(1040, 680)
|
||||||
self.resize(1220, 800)
|
self.resize(1220, 800)
|
||||||
|
|
||||||
self.coordinator = SyncCoordinator(config, config_store, self)
|
self.coordinator = SyncCoordinator(config, config_store, self)
|
||||||
@@ -380,15 +409,17 @@ class MainWindow(QMainWindow):
|
|||||||
dock.setFixedHeight(66)
|
dock.setFixedHeight(66)
|
||||||
layout = QHBoxLayout(dock)
|
layout = QHBoxLayout(dock)
|
||||||
layout.setContentsMargins(28, 12, 28, 12)
|
layout.setContentsMargins(28, 12, 28, 12)
|
||||||
self.progress_text = QLabel("Bereit")
|
self.progress_text = _ElidedLabel("Bereit")
|
||||||
self.progress_text.setMinimumWidth(250)
|
self.progress_text.setFixedWidth(PROGRESS_TEXT_WIDTH)
|
||||||
self.progress_text.setProperty("muted", True)
|
self.progress_text.setProperty("muted", True)
|
||||||
self.progress_bar = QProgressBar()
|
self.progress_bar = QProgressBar()
|
||||||
|
self.progress_bar.setFixedWidth(PROGRESS_BAR_WIDTH)
|
||||||
self.progress_bar.setRange(0, 100)
|
self.progress_bar.setRange(0, 100)
|
||||||
self.progress_bar.setValue(0)
|
self.progress_bar.setValue(0)
|
||||||
self.progress_bar.setFormat("%p %")
|
self.progress_bar.setFormat("%p %")
|
||||||
layout.addWidget(self.progress_text)
|
layout.addWidget(self.progress_text)
|
||||||
layout.addWidget(self.progress_bar, 1)
|
layout.addWidget(self.progress_bar)
|
||||||
|
layout.addStretch(1)
|
||||||
return dock
|
return dock
|
||||||
|
|
||||||
def _build_tray(self) -> None:
|
def _build_tray(self) -> None:
|
||||||
|
|||||||
@@ -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()
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
1.0.5
|
1.0.6
|
||||||
Reference in new issue
Block a user