Compare commits
5 Commits
7779131cf9
...
v0.37.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 51133e4042 | |||
|
bcf6ac2656
|
|||
| d59261f021 | |||
|
44923b771a
|
|||
| eaaf14c58a |
@@ -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<version>` 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
|
||||
|
||||
@@ -41,24 +41,15 @@ apt pulls the GUI dependencies (PySide6, pyte) automatically:
|
||||
sudo apt install ./rigdoctor_*_all.deb # CLI only: add --no-install-recommends
|
||||
```
|
||||
|
||||
**Or add the apt repository** for `apt install` + automatic updates. The registry is private and
|
||||
GPG-signed, so you need a Gitea token with **`read:package`**, the signing key, and the deb822
|
||||
source (`read -rsp` keeps the token out of your shell history):
|
||||
**Or add the apt repository** for `apt install` + automatic updates. The registry is public and
|
||||
GPG-signed — no token needed; just add the signing key and a deb822 source:
|
||||
|
||||
```bash
|
||||
read -rsp 'Gitea read:package token: ' TOKEN; echo
|
||||
|
||||
# signing key → dearmored into the keyring (the key endpoint requires the token too)
|
||||
# signing key → dearmored into the keyring
|
||||
sudo install -d -m 0755 /etc/apt/keyrings
|
||||
curl -fsSL --user <user>:"$TOKEN" \
|
||||
https://git.jesseyvanofferen.com/api/packages/jessey/debian/repository.key \
|
||||
curl -fsSL https://git.jesseyvanofferen.com/api/packages/jessey/debian/repository.key \
|
||||
| sudo gpg --dearmor -o /etc/apt/keyrings/gitea-jessey.gpg
|
||||
|
||||
# download credentials, kept out of the sources file
|
||||
printf 'machine git.jesseyvanofferen.com login <user> password %s\n' "$TOKEN" \
|
||||
| sudo tee /etc/apt/auth.conf.d/rigdoctor.conf >/dev/null
|
||||
sudo chmod 0600 /etc/apt/auth.conf.d/rigdoctor.conf
|
||||
|
||||
# the source (modern deb822 format, GPG-verified, all-arch)
|
||||
sudo tee /etc/apt/sources.list.d/rigdoctor.sources >/dev/null <<'EOF'
|
||||
Types: deb
|
||||
@@ -72,8 +63,7 @@ EOF
|
||||
sudo apt update && sudo apt install rigdoctor
|
||||
```
|
||||
|
||||
Then `sudo apt upgrade` keeps it current. *(Quick-and-dirty alternative if the registry isn't
|
||||
signed: skip the key and use a one-line `deb [arch=all trusted=yes] …/debian stable main` source.)*
|
||||
Then `sudo apt upgrade` keeps it current.
|
||||
|
||||
### Any distro — self-extracting `.run` (no root)
|
||||
|
||||
|
||||
+1
-1
@@ -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"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
"""RigDoctor — modular hardware monitoring & crash diagnostics for Linux gamers."""
|
||||
|
||||
__version__ = "0.36.1"
|
||||
__version__ = "0.37.0"
|
||||
|
||||
@@ -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'<span style="color:{ACCENT};">●</span> <span style="color:{MUTED};">Live</span>')
|
||||
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):
|
||||
|
||||
@@ -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; }}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user