Release SyncVito 1.0.5
This commit is contained in:
1 parent
30982e8a4d
commit
bb2a0db609
6 files changed
+178
-12
No files matched your search
+47
-10
@@ -3,7 +3,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from PyQt6.QtCore import QEvent, Qt, QTimer, pyqtSignal
|
||||
@@ -48,6 +48,9 @@ from syncvito.version import __version__
|
||||
|
||||
__all__ = ["MainWindow"]
|
||||
|
||||
UPDATE_CHECK_INTERVAL_MS = 30 * 60 * 1000
|
||||
UPDATE_RETRY_INTERVAL_MS = 60 * 1000
|
||||
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
"""Zentrale SyncVito-Benutzeroberfläche."""
|
||||
@@ -59,6 +62,7 @@ class MainWindow(QMainWindow):
|
||||
self.config = config
|
||||
self.config_store = config_store
|
||||
self._allow_close = False
|
||||
self._notified_update_version: str | None = None
|
||||
self.setWindowTitle("SyncVito")
|
||||
self.setWindowIcon(app_icon())
|
||||
self.setMinimumSize(980, 680)
|
||||
@@ -71,6 +75,15 @@ class MainWindow(QMainWindow):
|
||||
self._connect_coordinator()
|
||||
self._refresh_tasks()
|
||||
self._set_global_status(*self.coordinator.current_overall_status())
|
||||
|
||||
self.update_check_timer = QTimer(self)
|
||||
self.update_check_timer.setInterval(UPDATE_CHECK_INTERVAL_MS)
|
||||
self.update_check_timer.timeout.connect(self._automatic_update_check)
|
||||
self.update_check_timer.start()
|
||||
self.update_retry_timer = QTimer(self)
|
||||
self.update_retry_timer.setSingleShot(True)
|
||||
self.update_retry_timer.setInterval(UPDATE_RETRY_INTERVAL_MS)
|
||||
self.update_retry_timer.timeout.connect(self._automatic_update_check)
|
||||
QTimer.singleShot(3000, self._automatic_update_check)
|
||||
cleanup_attempts = 6 if "--updated" in sys.argv else 1
|
||||
QTimer.singleShot(3000, lambda: self._cleanup_update_installers(cleanup_attempts))
|
||||
@@ -159,6 +172,7 @@ class MainWindow(QMainWindow):
|
||||
layout.addWidget(button)
|
||||
self.nav_buttons.append(button)
|
||||
self.nav_buttons[0].setChecked(True)
|
||||
self.settings_nav_button = self.nav_buttons[2]
|
||||
layout.addStretch(1)
|
||||
|
||||
version = QLabel(f"Version {__version__}\nby Davito")
|
||||
@@ -340,7 +354,7 @@ class MainWindow(QMainWindow):
|
||||
version_label = QLabel(f"Installierte Version: {__version__}")
|
||||
version_label.setProperty("muted", True)
|
||||
update_layout.addWidget(version_label)
|
||||
self.update_check_box = QCheckBox("Beim Start automatisch nach Updates suchen")
|
||||
self.update_check_box = QCheckBox("Beim Start und danach alle 30 Minuten automatisch nach Updates suchen")
|
||||
self.update_check_box.setChecked(self.config.settings.check_updates_on_start)
|
||||
update_layout.addWidget(self.update_check_box)
|
||||
update_hint = QLabel(
|
||||
@@ -511,6 +525,7 @@ class MainWindow(QMainWindow):
|
||||
def _save_settings(self) -> None:
|
||||
settings = self.config.settings
|
||||
old_autostart = settings.autostart
|
||||
old_update_check = settings.check_updates_on_start
|
||||
settings.autostart = self.autostart_check.isChecked()
|
||||
settings.font_family = self.font_combo.currentText()
|
||||
settings.font_size = self.font_size_spin.value()
|
||||
@@ -528,18 +543,22 @@ class MainWindow(QMainWindow):
|
||||
return
|
||||
apply_theme(QApplication.instance(), settings)
|
||||
self._append_log("Einstellungen", "Erfolg", "Darstellung und Systemstart wurden übernommen.")
|
||||
if settings.check_updates_on_start and not old_update_check:
|
||||
QTimer.singleShot(0, self._automatic_update_check)
|
||||
elif not settings.check_updates_on_start:
|
||||
self.update_retry_timer.stop()
|
||||
|
||||
def _automatic_update_check(self) -> None:
|
||||
settings = self.config.settings
|
||||
if not settings.check_updates_on_start or self.coordinator.is_running:
|
||||
if not settings.check_updates_on_start:
|
||||
self.update_retry_timer.stop()
|
||||
return
|
||||
if settings.last_update_check:
|
||||
try:
|
||||
last_check = datetime.fromisoformat(settings.last_update_check)
|
||||
except ValueError:
|
||||
last_check = datetime.min
|
||||
if datetime.now() - last_check < timedelta(hours=24):
|
||||
return
|
||||
if self.coordinator.is_running or self.updater.busy:
|
||||
if not self.update_retry_timer.isActive():
|
||||
self.update_retry_timer.start()
|
||||
return
|
||||
self.update_retry_timer.stop()
|
||||
self.update_check_timer.start(UPDATE_CHECK_INTERVAL_MS)
|
||||
self._check_updates(manual=False)
|
||||
|
||||
def _check_updates(self, manual: bool) -> None:
|
||||
@@ -558,12 +577,18 @@ class MainWindow(QMainWindow):
|
||||
self._mark_update_checked()
|
||||
self._update_progress(100, f"Version {info.version} ist verfügbar")
|
||||
self._append_log("Update", "Hinweis", f"Version {info.version} ist verfügbar.")
|
||||
self._set_update_indicator(info.version)
|
||||
if not manual and self._notified_update_version == info.version:
|
||||
return
|
||||
self._notified_update_version = info.version
|
||||
dialog = UpdateDialog(__version__, info, getattr(sys, "frozen", False), self)
|
||||
if dialog.exec() == UpdateDialog.DialogCode.Accepted:
|
||||
self.updater.download(info)
|
||||
|
||||
def _on_no_update(self, manual: bool) -> None:
|
||||
self._mark_update_checked()
|
||||
self._set_update_indicator(None)
|
||||
self._notified_update_version = None
|
||||
self._update_progress(100, "SyncVito ist aktuell")
|
||||
self._append_log("Update", "Erfolg", "Die installierte Version ist aktuell.")
|
||||
if manual:
|
||||
@@ -579,6 +604,18 @@ class MainWindow(QMainWindow):
|
||||
f"{message}\n\nBitte die Netzwerkverbindung prüfen und anschließend erneut versuchen.",
|
||||
)
|
||||
|
||||
def _set_update_indicator(self, version: str | None) -> None:
|
||||
available = bool(version)
|
||||
self.settings_nav_button.setText("Einstellungen • UPDATE" if available else "Einstellungen")
|
||||
self.settings_nav_button.setProperty("updateAvailable", available)
|
||||
description = f"SyncVito {version} ist verfügbar" if version else ""
|
||||
self.settings_nav_button.setToolTip(description)
|
||||
self.settings_nav_button.setAccessibleDescription(description)
|
||||
style = self.settings_nav_button.style()
|
||||
style.unpolish(self.settings_nav_button)
|
||||
style.polish(self.settings_nav_button)
|
||||
self.settings_nav_button.update()
|
||||
|
||||
def _install_update(self, path: Path, info: UpdateInfo) -> None:
|
||||
try:
|
||||
self.updater.service.launch_installer(path, info.version)
|
||||
|
||||
Reference in new issue
Block a user