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:
+57
-11
@@ -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_())
|
||||||
|
|||||||
Reference in New Issue
Block a user