desktop: automatically pick a good theme title color

The preference setting seemed far too strange to do this. And not very user
friendly. So instead we figure out if this is a dark theme or not by looking at
text and background colors in the palette, and make sure we get notified if
that changes.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2020-11-04 13:09:44 -08:00
parent 4c6b00f812
commit 6201ac34b4
6 changed files with 33 additions and 14 deletions

View file

@ -5,6 +5,7 @@ TabBase::TabBase(QWidget *parent) : QWidget(parent)
{ {
} }
void TabBase::updateUi() void TabBase::updateUi(QString titleColor)
{ {
Q_UNUSED(titleColor)
} }

View file

@ -13,7 +13,7 @@ public:
TabBase(QWidget *parent = 0); TabBase(QWidget *parent = 0);
virtual void updateData() = 0; virtual void updateData() = 0;
virtual void clear() = 0; virtual void clear() = 0;
virtual void updateUi(); virtual void updateUi(QString titleColor);
}; };
#endif #endif

View file

@ -243,14 +243,10 @@ void TabDiveInformation::updateData()
showCurrentWidget(false, 0); // Show current star widget at lefthand side showCurrentWidget(false, 0); // Show current star widget at lefthand side
} }
void TabDiveInformation::updateUi() void TabDiveInformation::updateUi(QString titleColor)
{ {
// Put together appropriate CSS stylesheets: NB: colors below in same order as the enum in prefs.h
QStringList colors = { "mediumblue", "lightblue", "black" }; // If using dark theme, set color appropriately
QString colorText = colors[prefs.headerstyle_color];
QString CSSSetSmallLabel = "QLabel:enabled { color: "; QString CSSSetSmallLabel = "QLabel:enabled { color: ";
CSSSetSmallLabel.append(colorText + "; font-size: "); CSSSetSmallLabel.append(titleColor + "; font-size: ");
CSSSetSmallLabel.append(QString::number((int)(0.5 + ui->diveHeadingLabel->geometry().height() * 0.66)) + "px;}"); CSSSetSmallLabel.append(QString::number((int)(0.5 + ui->diveHeadingLabel->geometry().height() * 0.66)) + "px;}");
ui->groupBox_visibility->setStyleSheet(ui->groupBox_visibility->styleSheet() + CSSSetSmallLabel); ui->groupBox_visibility->setStyleSheet(ui->groupBox_visibility->styleSheet() + CSSSetSmallLabel);
ui->groupBox_current->setStyleSheet(ui->groupBox_current->styleSheet() + CSSSetSmallLabel); ui->groupBox_current->setStyleSheet(ui->groupBox_current->styleSheet() + CSSSetSmallLabel);

View file

@ -16,7 +16,7 @@ public:
~TabDiveInformation(); ~TabDiveInformation();
void updateData() override; void updateData() override;
void clear() override; void clear() override;
void updateUi() override; void updateUi(QString titleColor) override;
private slots: private slots:
void divesChanged(const QVector<dive *> &dives, DiveField field); void divesChanged(const QVector<dive *> &dives, DiveField field);
void cylinderChanged(dive *d); void cylinderChanged(dive *d);

View file

@ -47,6 +47,12 @@ struct Completers {
QCompleter *tags; QCompleter *tags;
}; };
static bool paletteIsDark(const QPalette &p)
{
// we consider a palette dark if the text color is lighter than the windows background
return p.window().color().valueF() < p.windowText().color().valueF();
}
MainTab::MainTab(QWidget *parent) : QTabWidget(parent), MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
editMode(false), editMode(false),
ignoreInput(false), ignoreInput(false),
@ -72,6 +78,9 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
extraWidgets << new TabDiveComputer(this); extraWidgets << new TabDiveComputer(this);
ui.tabWidget->addTab(extraWidgets.last(), tr("Device names")); ui.tabWidget->addTab(extraWidgets.last(), tr("Device names"));
// make sure we know if this is a light or dark mode
isDark = paletteIsDark(palette());
// call colorsChanged() for the initial setup now that the extraWidgets are loaded // call colorsChanged() for the initial setup now that the extraWidgets are loaded
colorsChanged(); colorsChanged();
@ -704,13 +713,24 @@ void MainTab::clearTabs()
widget->clear(); widget->clear();
} }
void MainTab::changeEvent(QEvent *ev)
{
if (ev->type() == QEvent::PaletteChange) {
// check if this is a light or dark mode
bool dark = paletteIsDark(palette());
if (dark != isDark) {
// things have changed, so setup the colors correctly
isDark = dark;
colorsChanged();
}
}
QTabWidget::changeEvent(ev);
}
// setup the colors of 'header' elements in the tab widget // setup the colors of 'header' elements in the tab widget
void MainTab::colorsChanged() void MainTab::colorsChanged()
{ {
// Put together appropriate CSS stylesheets: NB: colors below in same order as the enum in prefs.h QString colorText = isDark ? QStringLiteral("lightblue") : QStringLiteral("mediumblue");
QStringList colors = { "mediumblue", "lightblue", "black" }; // If using dark theme, set color appropriately
QString colorText = colors[prefs.headerstyle_color];
QString lastpart = colorText + " ;}"; QString lastpart = colorText + " ;}";
// only set the color if the widget is enabled // only set the color if the widget is enabled
@ -731,5 +751,5 @@ void MainTab::colorsChanged()
// finally call the individual updateUi() functions so they can overwrite these style sheets // finally call the individual updateUi() functions so they can overwrite these style sheets
for (TabBase *widget: extraWidgets) for (TabBase *widget: extraWidgets)
widget->updateUi(); widget->updateUi(colorText);
} }

View file

@ -78,6 +78,8 @@ private:
dive_trip *currentTrip; dive_trip *currentTrip;
QList<TabBase*> extraWidgets; QList<TabBase*> extraWidgets;
void divesEdited(int num); // Opens a warning window if more than one dive was edited void divesEdited(int num); // Opens a warning window if more than one dive was edited
void changeEvent(QEvent *ev) override;
bool isDark;
}; };
#endif // MAINTAB_H #endif // MAINTAB_H