Apply nmea_client dark theme across all tabs and plots

Color palette taken directly from nmea_client/gui/plot_widget.py:
- Background #1a1a2e / #12121e, borders #2a2a4a/#3a3a5e,
  text #aaaacc/#ddddee, connected #4CAF50, error #F44336
- Trace colors: Material palette (blue, red, green, orange, …)
- Plot widget background overridden from "white" to #12121e
- pyqtgraph foreground set to #aaaacc

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 22:34:53 +02:00
co-authored by Claude Sonnet 4.6
parent 8797c774e9
commit 9d7561ba2f
+57 -11
View File
@@ -30,10 +30,54 @@ from PyQt5.QtWidgets import (
import pyqtgraph as pg import pyqtgraph as pg
pg.setConfigOption("background", "w") pg.setConfigOption("background", "#12121e")
pg.setConfigOption("foreground", "k") pg.setConfigOption("foreground", "#aaaacc")
MAX_PLOT_POINTS = 200 MAX_PLOT_POINTS = 200
DARK_STYLE = """
QWidget { background:#1a1a2e; color:#aaaacc; font-size:12px; }
QMainWindow { background:#1a1a2e; }
QTabWidget::pane { border:1px solid #2a2a4a; background:#1a1a2e; }
QTabBar::tab { background:#12121e; color:#aaaacc; padding:5px 12px;
border:1px solid #2a2a4a; border-bottom:none; }
QTabBar::tab:selected { background:#1a1a2e; color:#ddddee; }
QTabBar::tab:hover { background:#2a2a4a; }
QGroupBox { border:1px solid #2a2a4a; border-radius:4px;
margin-top:8px; padding-top:8px; color:#aaaacc; }
QGroupBox::title { subcontrol-origin:margin; left:8px; color:#aaaacc; }
QLabel { color:#aaaacc; background:transparent; }
QLineEdit, QSpinBox { background:#12121e; border:1px solid #3a3a5e;
border-radius:3px; color:#ddddee; padding:2px 4px; }
QLineEdit:focus, QSpinBox:focus{ border:1px solid #555577; }
QSpinBox::up-button,
QSpinBox::down-button { background:#2a2a4a; border:none; }
QPushButton { background:#2a2a4a; color:#aaaacc; border:1px solid #3a3a5e;
border-radius:3px; padding:4px 10px; }
QPushButton:hover { background:#3a3a5e; }
QPushButton:pressed { background:#12121e; }
QPushButton:disabled { color:#555577; }
QComboBox { background:#12121e; border:1px solid #3a3a5e;
border-radius:3px; color:#ddddee; padding:2px 4px; }
QComboBox::drop-down { border:none; width:16px; }
QComboBox QAbstractItemView { background:#1a1a2e; color:#ddddee;
selection-background-color:#2a2a4a; }
QTreeWidget { background:#12121e; alternate-background-color:#1a1a2e;
color:#aaaacc; border:1px solid #2a2a4a; }
QTreeWidget::item:selected { background:#2a2a4a; color:#ddddee; }
QHeaderView::section { background:#12121e; color:#aaaacc;
border:1px solid #2a2a4a; padding:4px; }
QScrollArea { border:none; }
QScrollBar:vertical { background:#12121e; width:10px; margin:0; }
QScrollBar::handle:vertical { background:#3a3a5e; border-radius:4px; min-height:20px; }
QScrollBar::handle:vertical:hover { background:#555577; }
QScrollBar:horizontal { background:#12121e; height:10px; margin:0; }
QScrollBar::handle:horizontal { background:#3a3a5e; border-radius:4px; min-width:20px; }
QScrollBar::handle:horizontal:hover { background:#555577; }
QScrollBar::add-line,
QScrollBar::sub-line { width:0; height:0; }
QStatusBar { background:#12121e; color:#aaaacc; }
"""
_SETTINGS_PATH = Path.home() / ".config" / "we_monitor" / "plot_settings.json" _SETTINGS_PATH = Path.home() / ".config" / "we_monitor" / "plot_settings.json"
# Maps full dotted trace key → short display label used in chips, legends and # Maps full dotted trace key → short display label used in chips, legends and
@@ -165,7 +209,7 @@ class ConnectorTab(QWidget):
form.addRow(btn_row) form.addRow(btn_row)
self._status = QLabel("Disconnected") self._status = QLabel("Disconnected")
self._status.setStyleSheet("color: gray;") self._status.setStyleSheet("color: #9E9E9E;")
form.addRow("Status:", self._status) form.addRow("Status:", self._status)
layout.addWidget(grp) layout.addWidget(grp)
@@ -181,7 +225,7 @@ class ConnectorTab(QWidget):
self._host.setEnabled(False) self._host.setEnabled(False)
self._port.setEnabled(False) self._port.setEnabled(False)
self._status.setText(f"Connected → {host}:{port}") self._status.setText(f"Connected → {host}:{port}")
self._status.setStyleSheet("color: green; font-weight: bold;") self._status.setStyleSheet("color: #4CAF50; font-weight: bold;")
def set_disconnected(self, reason: str = ""): def set_disconnected(self, reason: str = ""):
self._btn.setText("Connect") self._btn.setText("Connect")
@@ -189,10 +233,10 @@ class ConnectorTab(QWidget):
self._port.setEnabled(True) self._port.setEnabled(True)
if reason: if reason:
self._status.setText(f"Disconnected ({reason})") self._status.setText(f"Disconnected ({reason})")
self._status.setStyleSheet("color: red;") self._status.setStyleSheet("color: #F44336;")
else: else:
self._status.setText("Disconnected") self._status.setText("Disconnected")
self._status.setStyleSheet("color: gray;") self._status.setStyleSheet("color: #9E9E9E;")
# ── Dashboard tab ───────────────────────────────────────────────────────────── # ── Dashboard tab ─────────────────────────────────────────────────────────────
@@ -204,7 +248,7 @@ class DashboardTab(QWidget):
self._ts = QLabel("Last update: —") self._ts = QLabel("Last update: —")
self._ts.setAlignment(Qt.AlignRight) self._ts.setAlignment(Qt.AlignRight)
self._ts.setStyleSheet("color: gray; font-size: 11px;") self._ts.setStyleSheet("color: #9E9E9E; font-size: 11px;")
layout.addWidget(self._ts) layout.addWidget(self._ts)
self._tree = QTreeWidget() self._tree = QTreeWidget()
@@ -225,7 +269,7 @@ class DashboardTab(QWidget):
bold = QFont() bold = QFont()
bold.setBold(True) bold.setBold(True)
domain_color = QColor("#1a4d99") domain_color = QColor("#aaaacc")
for domain, domain_data in snapshot.items(): for domain, domain_data in snapshot.items():
if domain == "ts" or not isinstance(domain_data, dict): if domain == "ts" or not isinstance(domain_data, dict):
@@ -295,7 +339,8 @@ class DashboardTab(QWidget):
class PlotTab(QWidget): class PlotTab(QWidget):
NUM_PLOTS = 8 NUM_PLOTS = 8
MAX_TRACES = 4 MAX_TRACES = 4
COLORS = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728"] COLORS = ["#2196F3", "#F44336", "#4CAF50", "#FF9800",
"#9C27B0", "#00BCD4", "#FFEB3B", "#795548"]
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@@ -361,7 +406,7 @@ class PlotTab(QWidget):
# plot # plot
pw = pg.PlotWidget( pw = pg.PlotWidget(
background="white", background="#12121e",
axisItems={"bottom": pg.DateAxisItem(orientation="bottom")}, axisItems={"bottom": pg.DateAxisItem(orientation="bottom")},
) )
pw.showGrid(x=True, y=True, alpha=0.3) pw.showGrid(x=True, y=True, alpha=0.3)
@@ -414,7 +459,7 @@ class PlotTab(QWidget):
btn.setStyleSheet( btn.setStyleSheet(
f"QPushButton {{ background:{color}; color:white; border-radius:3px;" f"QPushButton {{ background:{color}; color:white; border-radius:3px;"
f" padding:1px 6px; font-size:11px; }}" f" padding:1px 6px; font-size:11px; }}"
f"QPushButton:hover {{ background:#888; }}" f"QPushButton:hover {{ background:#555577; }}"
) )
btn.clicked.connect(lambda: self._remove_trace(plot_idx, key)) btn.clicked.connect(lambda: self._remove_trace(plot_idx, key))
self._chip_bars[plot_idx].addWidget(btn) self._chip_bars[plot_idx].addWidget(btn)
@@ -614,6 +659,7 @@ class MainWindow(QMainWindow):
def main(): def main():
app = QApplication(sys.argv) app = QApplication(sys.argv)
app.setStyle("Fusion") app.setStyle("Fusion")
app.setStyleSheet(DARK_STYLE)
win = MainWindow() win = MainWindow()
win.show() win.show()
sys.exit(app.exec_()) sys.exit(app.exec_())