From 9d7561ba2f81d52a973752f785ce6813bbc23c7c Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 25 May 2026 22:34:53 +0200 Subject: [PATCH] Apply nmea_client dark theme across all tabs and plots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- gui_client.py | 68 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/gui_client.py b/gui_client.py index fbf3ca5..97cfa34 100644 --- a/gui_client.py +++ b/gui_client.py @@ -30,10 +30,54 @@ from PyQt5.QtWidgets import ( import pyqtgraph as pg -pg.setConfigOption("background", "w") -pg.setConfigOption("foreground", "k") +pg.setConfigOption("background", "#12121e") +pg.setConfigOption("foreground", "#aaaacc") 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" # Maps full dotted trace key → short display label used in chips, legends and @@ -165,7 +209,7 @@ class ConnectorTab(QWidget): form.addRow(btn_row) self._status = QLabel("Disconnected") - self._status.setStyleSheet("color: gray;") + self._status.setStyleSheet("color: #9E9E9E;") form.addRow("Status:", self._status) layout.addWidget(grp) @@ -181,7 +225,7 @@ class ConnectorTab(QWidget): self._host.setEnabled(False) self._port.setEnabled(False) 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 = ""): self._btn.setText("Connect") @@ -189,10 +233,10 @@ class ConnectorTab(QWidget): self._port.setEnabled(True) if reason: self._status.setText(f"Disconnected ({reason})") - self._status.setStyleSheet("color: red;") + self._status.setStyleSheet("color: #F44336;") else: self._status.setText("Disconnected") - self._status.setStyleSheet("color: gray;") + self._status.setStyleSheet("color: #9E9E9E;") # ── Dashboard tab ───────────────────────────────────────────────────────────── @@ -204,7 +248,7 @@ class DashboardTab(QWidget): self._ts = QLabel("Last update: —") 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) self._tree = QTreeWidget() @@ -225,7 +269,7 @@ class DashboardTab(QWidget): bold = QFont() bold.setBold(True) - domain_color = QColor("#1a4d99") + domain_color = QColor("#aaaacc") for domain, domain_data in snapshot.items(): if domain == "ts" or not isinstance(domain_data, dict): @@ -295,7 +339,8 @@ class DashboardTab(QWidget): class PlotTab(QWidget): NUM_PLOTS = 8 MAX_TRACES = 4 - COLORS = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728"] + COLORS = ["#2196F3", "#F44336", "#4CAF50", "#FF9800", + "#9C27B0", "#00BCD4", "#FFEB3B", "#795548"] def __init__(self): super().__init__() @@ -361,7 +406,7 @@ class PlotTab(QWidget): # plot pw = pg.PlotWidget( - background="white", + background="#12121e", axisItems={"bottom": pg.DateAxisItem(orientation="bottom")}, ) pw.showGrid(x=True, y=True, alpha=0.3) @@ -414,7 +459,7 @@ class PlotTab(QWidget): btn.setStyleSheet( f"QPushButton {{ background:{color}; color:white; border-radius:3px;" 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)) self._chip_bars[plot_idx].addWidget(btn) @@ -614,6 +659,7 @@ class MainWindow(QMainWindow): def main(): app = QApplication(sys.argv) app.setStyle("Fusion") + app.setStyleSheet(DARK_STYLE) win = MainWindow() win.show() sys.exit(app.exec_())