feat(gui): global recording indicator in the sidebar — 0.18.0 #13
@@ -5,6 +5,13 @@ All notable changes to RigDoctor are recorded here. Format follows
|
|||||||
(`MAJOR.MINOR.PATCH`, pre-1.0). `__version__` and `pyproject.toml` must match the git
|
(`MAJOR.MINOR.PATCH`, pre-1.0). `__version__` and `pyproject.toml` must match the git
|
||||||
release tag (so the auto-updater, D18, can compare versions).
|
release tag (so the auto-updater, D18, can compare versions).
|
||||||
|
|
||||||
|
## [0.18.0] - 2026-05-22
|
||||||
|
### Added
|
||||||
|
- **Global recording indicator.** While a capture is running, the sidebar shows a red
|
||||||
|
**● Recording** badge on every page — with the **game** being captured and the live sample
|
||||||
|
count (and a GPU-lost flag if seen). It polls the recorder, so it reflects captures started
|
||||||
|
any way: manual `record`, a guided diagnostic, or the Steam launch wrapper.
|
||||||
|
|
||||||
## [0.17.0] - 2026-05-22
|
## [0.17.0] - 2026-05-22
|
||||||
### Added
|
### Added
|
||||||
- **Inventory page is back in the GUI** (it was removed in 0.7.2 in favor of the CLI). Sidebar
|
- **Inventory page is back in the GUI** (it was removed in 0.7.2 in favor of the CLI). Sidebar
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "rigdoctor"
|
name = "rigdoctor"
|
||||||
version = "0.17.0"
|
version = "0.18.0"
|
||||||
description = "Modular hardware monitoring & crash diagnostics for Linux gamers."
|
description = "Modular hardware monitoring & crash diagnostics for Linux gamers."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
"""RigDoctor — modular hardware monitoring & crash diagnostics for Linux gamers."""
|
"""RigDoctor — modular hardware monitoring & crash diagnostics for Linux gamers."""
|
||||||
|
|
||||||
__version__ = "0.17.0"
|
__version__ = "0.18.0"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import html
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
@@ -36,7 +37,7 @@ from .notifications_page import NotificationsPage
|
|||||||
from .recorder_page import RecorderPage
|
from .recorder_page import RecorderPage
|
||||||
from .setup_page import SetupPage
|
from .setup_page import SetupPage
|
||||||
from .share_page import SharePage
|
from .share_page import SharePage
|
||||||
from .theme import ACCENT, GOOD, MUTED
|
from .theme import ACCENT, CRIT, GOOD, MUTED, TEXT
|
||||||
from .worker import SamplerWorker
|
from .worker import SamplerWorker
|
||||||
|
|
||||||
_NAV_ITEMS = ["Dashboard", "Logs", "Health", "Games", "Environment", "Inventory", "Setup", "Notifications", "Share"]
|
_NAV_ITEMS = ["Dashboard", "Logs", "Health", "Games", "Environment", "Inventory", "Setup", "Notifications", "Share"]
|
||||||
@@ -127,6 +128,14 @@ class MainWindow(QMainWindow):
|
|||||||
self._update_timer.timeout.connect(self._start_update_check)
|
self._update_timer.timeout.connect(self._start_update_check)
|
||||||
self._update_timer.start()
|
self._update_timer.start()
|
||||||
|
|
||||||
|
# Reflect any capture (manual, diagnostic, or the Steam wrapper) in the sidebar on
|
||||||
|
# every page, so it's always clear when RigDoctor is recording and for which game.
|
||||||
|
self._rec_timer = QTimer(self)
|
||||||
|
self._rec_timer.setInterval(1500)
|
||||||
|
self._rec_timer.timeout.connect(self._update_recording)
|
||||||
|
self._rec_timer.start()
|
||||||
|
self._update_recording()
|
||||||
|
|
||||||
def _build_sidebar(self) -> QFrame:
|
def _build_sidebar(self) -> QFrame:
|
||||||
bar = QFrame()
|
bar = QFrame()
|
||||||
bar.setObjectName("Sidebar")
|
bar.setObjectName("Sidebar")
|
||||||
@@ -141,6 +150,17 @@ class MainWindow(QMainWindow):
|
|||||||
subtitle.setObjectName("AppSubtitle")
|
subtitle.setObjectName("AppSubtitle")
|
||||||
v.addWidget(title)
|
v.addWidget(title)
|
||||||
v.addWidget(subtitle)
|
v.addWidget(subtitle)
|
||||||
|
|
||||||
|
# Global recording indicator — visible on every page while a capture runs.
|
||||||
|
self._rec_indicator = QLabel()
|
||||||
|
self._rec_indicator.setWordWrap(True)
|
||||||
|
self._rec_indicator.setTextFormat(Qt.TextFormat.RichText)
|
||||||
|
self._rec_indicator.setStyleSheet(
|
||||||
|
f"background: #241316; border: 1px solid {CRIT}; border-radius: 8px; padding: 8px 10px;"
|
||||||
|
)
|
||||||
|
self._rec_indicator.hide()
|
||||||
|
v.addSpacing(12)
|
||||||
|
v.addWidget(self._rec_indicator)
|
||||||
v.addSpacing(18)
|
v.addSpacing(18)
|
||||||
|
|
||||||
group = QButtonGroup(self)
|
group = QButtonGroup(self)
|
||||||
@@ -242,6 +262,23 @@ class MainWindow(QMainWindow):
|
|||||||
self.health_page._run()
|
self.health_page._run()
|
||||||
self.inventory_page._run()
|
self.inventory_page._run()
|
||||||
|
|
||||||
|
def _update_recording(self) -> None:
|
||||||
|
from .core import diagnostic
|
||||||
|
|
||||||
|
status = diagnostic.active()
|
||||||
|
if not status:
|
||||||
|
self._rec_indicator.hide()
|
||||||
|
return
|
||||||
|
game = status.get("game")
|
||||||
|
samples = status.get("samples", 0)
|
||||||
|
lost = " · GPU-lost" if status.get("gpu_lost") else ""
|
||||||
|
lines = [f"<span style='color:{CRIT};'>●</span> <b style='color:{TEXT};'>Recording</b>"]
|
||||||
|
if game:
|
||||||
|
lines.append(f"<span style='color:{TEXT};'>{html.escape(str(game))}</span>")
|
||||||
|
lines.append(f"<span style='color:{MUTED};'>{samples} samples{lost}</span>")
|
||||||
|
self._rec_indicator.setText("<br>".join(lines))
|
||||||
|
self._rec_indicator.show()
|
||||||
|
|
||||||
def _set_games_badge(self, count: int) -> None:
|
def _set_games_badge(self, count: int) -> None:
|
||||||
btn = self._nav_buttons.get("Games")
|
btn = self._nav_buttons.get("Games")
|
||||||
if btn is not None:
|
if btn is not None:
|
||||||
|
|||||||
Reference in New Issue
Block a user