diff --git a/CHANGELOG.md b/CHANGELOG.md index b25819b..4615cc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to RigDoctor are recorded here. Format follows (`MAJOR.MINOR.PATCH`, pre-1.0). `__version__` and `pyproject.toml` must match the git release tag (so the auto-updater, D18, can compare versions). +## [0.37.0] - 2026-05-22 +### Added +- **Version footer** — a footer across the bottom of the window shows `RigDoctor v` in + the bottom-right (moved out of the sidebar). +### Fixed +- **Pages scroll when content doesn't fit, and the window is no longer pinned to the tallest + page's height.** Long pages (Settings, Tuning, …) get a scrollbar when too tall — so controls + like Uninstall are always reachable — and the window can now be resized smaller than the screen + (min height dropped from "taller than the screen" to ~600px). Pages that manage their own + scroll/fill (Dashboard, System Health, Inventory, Share) are unchanged. + ## [0.36.1] - 2026-05-22 ### Fixed - `rigdoctor gui` printed the wrong fix when PySide6 is missing — it suggested the non-existent diff --git a/pyproject.toml b/pyproject.toml index 40b5bf7..37c944f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "rigdoctor" -version = "0.36.1" +version = "0.37.0" description = "Modular hardware monitoring & crash diagnostics for Linux gamers." readme = "README.md" requires-python = ">=3.11" diff --git a/src/rigdoctor/__init__.py b/src/rigdoctor/__init__.py index a329db3..23a6340 100644 --- a/src/rigdoctor/__init__.py +++ b/src/rigdoctor/__init__.py @@ -1,3 +1,3 @@ """RigDoctor — modular hardware monitoring & crash diagnostics for Linux gamers.""" -__version__ = "0.36.1" +__version__ = "0.37.0" diff --git a/src/rigdoctor/gui/main_window.py b/src/rigdoctor/gui/main_window.py index 221356e..d8d5881 100644 --- a/src/rigdoctor/gui/main_window.py +++ b/src/rigdoctor/gui/main_window.py @@ -20,6 +20,7 @@ from PySide6.QtWidgets import ( QMainWindow, QMessageBox, QPushButton, + QScrollArea, QStackedWidget, QSystemTrayIcon, QTextEdit, @@ -51,6 +52,10 @@ _NAV = [ ("App", ["Settings", "Share"]), ] _PAGES = [name for _section, names in _NAV for name in names] +# Pages that manage their own scrolling (pinned header + inner scroll) or must fill the +# viewport (the Share terminal) — these are added to the stack as-is; every other page is +# wrapped in a QScrollArea so it scrolls when too tall and doesn't pin the window's height. +_NO_WRAP = {"Dashboard", "System Health", "Inventory", "Share"} _ICON = Path(__file__).parent / "assets" / "rigdoctor.svg" @@ -68,7 +73,11 @@ class MainWindow(QMainWindow): central = QWidget() self.setCentralWidget(central) - layout = QHBoxLayout(central) + outer = QVBoxLayout(central) + outer.setContentsMargins(0, 0, 0, 0) + outer.setSpacing(0) + body = QWidget() + layout = QHBoxLayout(body) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) @@ -100,11 +109,14 @@ class MainWindow(QMainWindow): "Share": self.share_page, } for name in _PAGES: - self._stack.addWidget(self._pages[name]) + page = self._pages[name] + self._stack.addWidget(page if name in _NO_WRAP else self._scrollable(page)) content_layout.addWidget(self._stack) layout.addWidget(self._build_sidebar()) layout.addWidget(content, 1) + outer.addWidget(body, 1) + outer.addWidget(self._build_footer()) self._worker = SamplerWorker(interval=interval) self._worker.sampled.connect(self.dashboard.update_sample) @@ -216,9 +228,6 @@ class MainWindow(QMainWindow): v.addStretch(1) live = QLabel(f' Live') v.addWidget(live) - version = QLabel(f"v{__version__}") - version.setObjectName("Muted") - v.addWidget(version) changelog_btn = QPushButton("Changelog") changelog_btn.setObjectName("LinkButton") changelog_btn.setCursor(Qt.CursorShape.PointingHandCursor) @@ -248,6 +257,27 @@ class MainWindow(QMainWindow): v.addWidget(self._restart_btn) return bar + def _scrollable(self, page: QWidget) -> QScrollArea: + """Wrap a page so it scrolls when taller than the window — and so the window can shrink + below the page's natural height instead of being pinned to it.""" + area = QScrollArea() + area.setWidget(page) + area.setWidgetResizable(True) + area.setFrameShape(QFrame.Shape.NoFrame) + area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + return area + + def _build_footer(self) -> QFrame: + bar = QFrame() + bar.setObjectName("Footer") + h = QHBoxLayout(bar) + h.setContentsMargins(14, 5, 16, 5) + h.addStretch(1) + version = QLabel(f"RigDoctor v{__version__}") + version.setObjectName("Muted") + h.addWidget(version) + return bar + def _restart(self) -> None: gui = os.path.join(os.path.dirname(sys.executable), "rigdoctor-gui") if os.path.exists(gui): diff --git a/src/rigdoctor/gui/theme.py b/src/rigdoctor/gui/theme.py index 5df6d25..1aaca58 100644 --- a/src/rigdoctor/gui/theme.py +++ b/src/rigdoctor/gui/theme.py @@ -68,6 +68,8 @@ QMainWindow, #ContentArea, #Page {{ background: {BG}; }} QLabel {{ background: transparent; }} #Sidebar {{ background: {SIDEBAR}; border-right: 1px solid {CARD_BORDER}; }} +#Footer {{ background: {SIDEBAR}; border-top: 1px solid {CARD_BORDER}; }} +#Footer QLabel {{ font-size: 11px; }} #AppTitle {{ font-size: 17px; font-weight: 800; }} #AppSubtitle {{ color: {MUTED}; font-size: 11px; }}