From ec4c0cb0d543c469460a69a5da49eb49465763bd Mon Sep 17 00:00:00 2001 From: Torsten Kozel Date: Tue, 10 Feb 2026 02:12:30 +0100 Subject: [PATCH 1/2] Add disk space display to status bar, Fixes #569 --- qt/statusbar.py | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/qt/statusbar.py b/qt/statusbar.py index 3bc70e60b..fcf669bff 100644 --- a/qt/statusbar.py +++ b/qt/statusbar.py @@ -22,6 +22,7 @@ ) from PyQt6.QtCore import QEvent from PyQt6.QtGui import QPalette, QColor +import os import bitbase import qttools @@ -44,7 +45,6 @@ def __init__(self, main_window: QMainWindow): layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) container.setLayout(layout) - # Status text self._status = QLabel(container) self._status.setWordWrap(False) @@ -58,12 +58,23 @@ def __init__(self, main_window: QMainWindow): self._progress.setTextVisible(False) self._progress.setVisible(False) + # Disk space info label + self._disk_space = QLabel(container) + self._disk_space.setWordWrap(False) + self._disk_space.setSizePolicy( + QSizePolicy.Policy.Preferred, + QSizePolicy.Policy.Preferred, + ) + self._disk_space.setVisible(False) + # Layout if self._root: layout.addWidget(self._root) layout.addWidget(self._status, stretch=_PROGRESS_BAR_WIDTH_FX-1) + layout.addWidget(self._disk_space) layout.addStretch(0) layout.addWidget(self._progress, stretch=1) + self.addPermanentWidget(container, 1) container.resizeEvent = self._on_resize @@ -125,3 +136,32 @@ def progress_hide(self) -> None: def set_progress_value(self, val: int) -> None: """Set numeric value of progress bar.""" self._progress.setValue(val) + + def set_disk_space_info(self, path: str) -> None: + """Set the backup disk space information.""" + if not path: + self._disk_space.setVisible(False) + return + + try: + statvfs = os.statvfs(path) + + free = statvfs.f_frsize * ( + statvfs.f_bfree if bitbase.IS_IN_ROOT_MODE else statvfs.f_bavail + ) + + for unit in ["B", "KB", "MB", "GB", "TB"]: + if free < 1024.0: + break + free /= 1024.0 + + formatted = f"{free:.1f} {unit}" + self._disk_space.setText(_("Free space: ") + formatted) + self._disk_space.setVisible(True) + + except OSError: + self._disk_space.setVisible(False) + + def hide_disk_space_info(self) -> None: + """Hide the disk space information.""" + self._disk_space.setVisible(False) From 19cc40a1d475da43e0378cbcaace846573762901 Mon Sep 17 00:00:00 2001 From: Torsten Kozel Date: Wed, 11 Mar 2026 06:57:03 +0100 Subject: [PATCH 2/2] Fix failed tests and add call in app.py --- qt/app.py | 3 +++ qt/statusbar.py | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/qt/app.py b/qt/app.py index 1d23b7383..6530145a0 100644 --- a/qt/app.py +++ b/qt/app.py @@ -1102,6 +1102,7 @@ def updateProfile(self): else: self.places.set_sorting(sorting) + self.status_bar.set_disk_space_info(self.config.snapshotsPath()) # # EncFS deprecation warning (see #1734) # current_mode = self.config.snapshotsMode(profile_id) # if current_mode in ('local_encfs', 'ssh_encfs'): @@ -1218,6 +1219,8 @@ def _update_backup_status(self, force_wait_lock=False): if self.shutdown.activate_shutdown and get_shutdown_confirmation(): self.shutdown.shutdown() + self.status_bar.set_disk_space_info(self.config.snapshotsPath()) + message = self._set_take_snapshot_message( message=takeSnapshotMessage, force_update=force_update, diff --git a/qt/statusbar.py b/qt/statusbar.py index fcf669bff..30fd41a46 100644 --- a/qt/statusbar.py +++ b/qt/statusbar.py @@ -11,6 +11,7 @@ # . """A module offering a status bar widget """ +import os from PyQt6.QtWidgets import (QFrame, QHBoxLayout, QLabel, @@ -22,11 +23,11 @@ ) from PyQt6.QtCore import QEvent from PyQt6.QtGui import QPalette, QColor -import os import bitbase import qttools _PROGRESS_BAR_WIDTH_FX = 10 +_UNIT_MULTIPLIER = 1024 class StatusBar(QStatusBar): @@ -146,17 +147,19 @@ def set_disk_space_info(self, path: str) -> None: try: statvfs = os.statvfs(path) - free = statvfs.f_frsize * ( - statvfs.f_bfree if bitbase.IS_IN_ROOT_MODE else statvfs.f_bavail - ) + free = statvfs.f_frsize + if bitbase.IS_IN_ROOT_MODE: + free *= statvfs.f_bfree + else: + free *= statvfs.f_bavail - for unit in ["B", "KB", "MB", "GB", "TB"]: - if free < 1024.0: + for unit in ['B', 'KB', 'MB', 'GB', 'TB']: + if free < _UNIT_MULTIPLIER: break - free /= 1024.0 + free /= _UNIT_MULTIPLIER formatted = f"{free:.1f} {unit}" - self._disk_space.setText(_("Free space: ") + formatted) + self._disk_space.setText(_('Free space: ') + formatted) self._disk_space.setVisible(True) except OSError: