mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-06 14:16:39 +08:00
cabana: support toggle between light / dark theme (#27787)
add dark theme old-commit-hash: c56872265a126a0e8feda8bb21225e885ea6e941
This commit is contained in:
@@ -15,6 +15,7 @@ int main(int argc, char *argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
app.setApplicationDisplayName("Cabana");
|
||||
app.setWindowIcon(QIcon(":cabana-icon.png"));
|
||||
utils::setTheme(settings.theme);
|
||||
|
||||
QCommandLineParser cmd_parser;
|
||||
cmd_parser.addHelpOption();
|
||||
|
||||
@@ -85,8 +85,6 @@ ChartsWidget::ChartsWidget(QWidget *parent) : align_timer(this), QFrame(parent)
|
||||
main_layout->addWidget(charts_scroll);
|
||||
|
||||
// init settings
|
||||
use_dark_theme = QApplication::palette().color(QPalette::WindowText).value() >
|
||||
QApplication::palette().color(QPalette::Background).value();
|
||||
column_count = std::clamp(settings.chart_column_count, 1, MAX_COLUMN_COUNT);
|
||||
max_chart_range = std::clamp(settings.chart_range, 1, settings.max_cached_minutes * 60);
|
||||
display_range = {0, max_chart_range};
|
||||
@@ -231,7 +229,7 @@ ChartView *ChartsWidget::createChart() {
|
||||
chart->setFixedHeight(settings.chart_height);
|
||||
chart->setMinimumWidth(CHART_MIN_WIDTH);
|
||||
chart->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
|
||||
chart->chart()->setTheme(use_dark_theme ? QChart::QChart::ChartThemeDark : QChart::ChartThemeLight);
|
||||
chart->chart()->setTheme(settings.theme == 2 ? QChart::QChart::ChartThemeDark : QChart::ChartThemeLight);
|
||||
QObject::connect(chart, &ChartView::remove, [=]() { removeChart(chart); });
|
||||
QObject::connect(chart, &ChartView::zoomIn, this, &ChartsWidget::zoomIn);
|
||||
QObject::connect(chart, &ChartView::zoomUndo, this, &ChartsWidget::zoomUndo);
|
||||
|
||||
@@ -173,7 +173,6 @@ private:
|
||||
std::pair<double, double> display_range;
|
||||
std::pair<double, double> zoomed_range;
|
||||
QStack<QPair<double, double>> zoom_stack;
|
||||
bool use_dark_theme = false;
|
||||
QAction *columns_action;
|
||||
int column_count = 1;
|
||||
int current_column_count = 0;
|
||||
|
||||
@@ -541,6 +541,7 @@ void MainWindow::updateDownloadProgress(uint64_t cur, uint64_t total, bool succe
|
||||
|
||||
void MainWindow::updateStatus() {
|
||||
status_label->setText(tr("Cached Minutes:%1 FPS:%2").arg(settings.max_cached_minutes).arg(settings.fps));
|
||||
utils::setTheme(settings.theme);
|
||||
}
|
||||
|
||||
void MainWindow::dockCharts(bool dock) {
|
||||
|
||||
@@ -27,6 +27,7 @@ void Settings::save() {
|
||||
s.setValue("recent_files", recent_files);
|
||||
s.setValue("message_header_state", message_header_state);
|
||||
s.setValue("chart_series_type", chart_series_type);
|
||||
s.setValue("theme", theme);
|
||||
s.setValue("sparkline_range", sparkline_range);
|
||||
}
|
||||
|
||||
@@ -45,6 +46,7 @@ void Settings::load() {
|
||||
recent_files = s.value("recent_files").toStringList();
|
||||
message_header_state = s.value("message_header_state").toByteArray();
|
||||
chart_series_type = s.value("chart_series_type", 0).toInt();
|
||||
theme = s.value("theme", 0).toInt();
|
||||
sparkline_range = s.value("sparkline_range", 15).toInt();
|
||||
}
|
||||
|
||||
@@ -54,6 +56,12 @@ SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) {
|
||||
setWindowTitle(tr("Settings"));
|
||||
QFormLayout *form_layout = new QFormLayout(this);
|
||||
|
||||
theme = new QComboBox(this);
|
||||
theme->setToolTip(tr("You may need to restart cabana after changes theme"));
|
||||
theme->addItems({tr("Automatic"), tr("Light"), tr("Dark")});
|
||||
theme->setCurrentIndex(settings.theme);
|
||||
form_layout->addRow(tr("Color Theme"), theme);
|
||||
|
||||
fps = new QSpinBox(this);
|
||||
fps->setRange(10, 100);
|
||||
fps->setSingleStep(10);
|
||||
@@ -87,6 +95,7 @@ SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) {
|
||||
|
||||
void SettingsDlg::save() {
|
||||
settings.fps = fps->value();
|
||||
settings.theme = theme->currentIndex();
|
||||
settings.max_cached_minutes = cached_minutes->value();
|
||||
settings.chart_series_type = chart_series_type->currentIndex();
|
||||
settings.chart_height = chart_height->value();
|
||||
|
||||
@@ -19,6 +19,7 @@ public:
|
||||
int chart_column_count = 1;
|
||||
int chart_range = 3 * 60; // 3 minutes
|
||||
int chart_series_type = 0;
|
||||
int theme = 0;
|
||||
int sparkline_range = 15; // 15 seconds
|
||||
QString last_dir;
|
||||
QString last_route_dir;
|
||||
@@ -42,6 +43,7 @@ public:
|
||||
QSpinBox *cached_minutes;
|
||||
QSpinBox *chart_height;
|
||||
QComboBox *chart_series_type;
|
||||
QComboBox *theme;
|
||||
};
|
||||
|
||||
extern Settings settings;
|
||||
|
||||
+35
-3
@@ -8,6 +8,7 @@
|
||||
#include <limits>
|
||||
|
||||
#include "selfdrive/ui/qt/util.h"
|
||||
#include "tools/cabana/settings.h"
|
||||
|
||||
static QColor blend(QColor a, QColor b) {
|
||||
return QColor((a.red() + b.red()) / 2, (a.green() + b.green()) / 2, (a.blue() + b.blue()) / 2, (a.alpha() + b.alpha()) / 2);
|
||||
@@ -145,8 +146,7 @@ QValidator::State NameValidator::validate(QString &input, int &pos) const {
|
||||
|
||||
namespace utils {
|
||||
QPixmap icon(const QString &id) {
|
||||
static bool dark_theme = QApplication::palette().color(QPalette::WindowText).value() >
|
||||
QApplication::palette().color(QPalette::Background).value();
|
||||
bool dark_theme = settings.theme == 2;
|
||||
QPixmap pm;
|
||||
QString key = "bootstrap_" % id % (dark_theme ? "1" : "0");
|
||||
if (!QPixmapCache::find(key, &pm)) {
|
||||
@@ -154,12 +154,44 @@ QPixmap icon(const QString &id) {
|
||||
if (dark_theme) {
|
||||
QPainter p(&pm);
|
||||
p.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
||||
p.fillRect(pm.rect(), Qt::lightGray);
|
||||
p.fillRect(pm.rect(), Qt::white);
|
||||
}
|
||||
QPixmapCache::insert(key, pm);
|
||||
}
|
||||
return pm;
|
||||
}
|
||||
|
||||
void setTheme(int theme) {
|
||||
auto style = QApplication::style();
|
||||
if (!style) return;
|
||||
|
||||
static int prev_theme = 0;
|
||||
if (theme != prev_theme) {
|
||||
prev_theme = theme;
|
||||
if (theme == 2) {
|
||||
// modify palette to dark
|
||||
QPalette darkPalette;
|
||||
darkPalette.setColor(QPalette::Window, QColor(53, 53, 53));
|
||||
darkPalette.setColor(QPalette::WindowText, Qt::white);
|
||||
darkPalette.setColor(QPalette::Base, QColor(25, 25, 25));
|
||||
darkPalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53));
|
||||
darkPalette.setColor(QPalette::ToolTipBase, Qt::white);
|
||||
darkPalette.setColor(QPalette::ToolTipText, QColor(41, 41, 41));
|
||||
darkPalette.setColor(QPalette::Text, Qt::white);
|
||||
darkPalette.setColor(QPalette::Button, QColor(53, 53, 53));
|
||||
darkPalette.setColor(QPalette::ButtonText, Qt::white);
|
||||
darkPalette.setColor(QPalette::BrightText, Qt::red);
|
||||
darkPalette.setColor(QPalette::Link, QColor(42, 130, 218));
|
||||
darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218));
|
||||
darkPalette.setColor(QPalette::HighlightedText, Qt::black);
|
||||
qApp->setPalette(darkPalette);
|
||||
} else {
|
||||
qApp->setPalette(style->standardPalette());
|
||||
}
|
||||
style->polish(qApp);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace utils
|
||||
|
||||
QToolButton *toolButton(const QString &icon, const QString &tooltip) {
|
||||
|
||||
@@ -98,6 +98,7 @@ public:
|
||||
|
||||
namespace utils {
|
||||
QPixmap icon(const QString &id);
|
||||
void setTheme(int theme);
|
||||
inline QString formatSeconds(int seconds) {
|
||||
return QDateTime::fromTime_t(seconds).toString(seconds > 60 * 60 ? "hh:mm:ss" : "mm:ss");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user