From 3541ba49f1ccbb7c49d9464a339cd0d18a9990e0 Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Thu, 10 Sep 2020 16:49:00 +0200 Subject: [PATCH] implement default styles for dark mode, and allow enabling them (both GUI and HTML) in one step through menu entry --- src/qtgui/guiutils.cpp | 1 + src/qtgui/guiutils.h | 2 ++ src/qtgui/rclmain.ui | 16 +++++++++ src/qtgui/rclmain_w.cpp | 59 ++++++++++++++++++++++++++++++++++ src/qtgui/rclmain_w.h | 1 + src/qtgui/uiprefs_w.cpp | 10 ++++-- src/qtgui/uiprefs_w.h | 2 +- src/sampleconf/recoll-dark.css | 2 +- 8 files changed, 88 insertions(+), 5 deletions(-) diff --git a/src/qtgui/guiutils.cpp b/src/qtgui/guiutils.cpp index 7b98b4e1..8c734a79 100644 --- a/src/qtgui/guiutils.cpp +++ b/src/qtgui/guiutils.cpp @@ -220,6 +220,7 @@ void rwSettings(bool writing) SETTING_RW(prefs.reslistheadertext, "/Recoll/prefs/reslist/headertext", String, ""); + SETTING_RW(prefs.darkMode, "/Recoll/prefs/darkMode", Bool, 0); SETTING_RW(prefs.qssFile, "/Recoll/prefs/stylesheet", String, ""); SETTING_RW(prefs.snipCssFile, "/Recoll/prefs/snippets/cssfile", String, ""); SETTING_RW(prefs.queryStemLang, "/Recoll/prefs/query/stemLang", String, diff --git a/src/qtgui/guiutils.h b/src/qtgui/guiutils.h index 0d6b200d..f731764a 100644 --- a/src/qtgui/guiutils.h +++ b/src/qtgui/guiutils.h @@ -131,6 +131,8 @@ class PrefsPack { QString synFile; bool synFileEnable; + bool darkMode; + QStringList restableFields; vector restableColWidths; diff --git a/src/qtgui/rclmain.ui b/src/qtgui/rclmain.ui index 07804b89..49fd8aec 100644 --- a/src/qtgui/rclmain.ui +++ b/src/qtgui/rclmain.ui @@ -117,6 +117,8 @@ + + @@ -415,6 +417,20 @@ enbSynAction + + + true + + + Use default dark mode + + + Dark mode + + + enbDarkModeAction + + &Full Screen diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp index 218d8fe2..c162bd63 100644 --- a/src/qtgui/rclmain_w.cpp +++ b/src/qtgui/rclmain_w.cpp @@ -68,6 +68,7 @@ #include "systray.h" #include "rclmain_w.h" #include "rclhelp.h" +#include "readfile.h" #include "moc_rclmain_w.cpp" using std::pair; @@ -162,6 +163,7 @@ void RclMain::init() enbSynAction->setDisabled(prefs.synFile.isEmpty()); enbSynAction->setChecked(prefs.synFileEnable); + enbDarkModeAction->setChecked(prefs.darkMode); // Stemming language menu g_stringNoStem = tr("(no stemming)"); @@ -360,6 +362,8 @@ void RclMain::init() this, SLOT(showExtIdxDialog())); connect(enbSynAction, SIGNAL(toggled(bool)), this, SLOT(setSynEnabled(bool))); + connect(enbDarkModeAction, SIGNAL(toggled(bool)), + this, SLOT(setDarkModeEnabled(bool))); connect(toggleFullScreenAction, SIGNAL(triggered()), this, SLOT(toggleFullScreen())); @@ -478,6 +482,61 @@ void RclMain::setSynEnabled(bool on) uiprefs->synFileCB->setChecked(prefs.synFileEnable); } +void RclMain::setDarkModeEnabled(bool on) +{ + string fn; + + if (on) { + if (!prefs.reslistheadertext.isEmpty() || !prefs.qssFile.isEmpty()) { + QString message = + tr("This will replace the current contents of the result list" + " header string and GUI qss file name. Continue ?"); + switch(QMessageBox::warning(0, "Recoll", message, + "Yes", "No", 0, 0, 1)) { + case 0: + break; + case 1: + goto resetcheckednosigs; + } + } + string datadir = theconfig->getDatadir(); + fn = path_cat(path_cat(datadir, "examples"), "recoll-dark.qss"); + if (!path_readable(fn)) { + goto unreadable; + } + prefs.qssFile = u8s2qs(fn); + fn = path_cat(path_cat(datadir, "examples"), "recoll-dark.css"); + string data; + string reason; + if (!file_to_string(fn, data, &reason)) { + goto unreadable; + } + prefs.reslistheadertext = u8s2qs(data); + } else { + prefs.reslistheadertext.clear(); + prefs.qssFile.clear(); + } + + applyStyleSheet(); + prefs.darkMode = on; + if (uiprefs) { + uiprefs->resetStylesheet(prefs.qssFile); + } + QMessageBox::warning(0, "Recoll", tr("You will need to run a query to " + "complete the display change.")); + return; + +unreadable: + QMessageBox::warning(0, "Recoll", tr("Could not read: ") + u8s2qs(fn)); + prefs.reslistheadertext.clear(); + prefs.qssFile.clear(); + // And reset checkbox state: +resetcheckednosigs: + bool oldState = enbDarkModeAction->blockSignals(true); + enbDarkModeAction->setChecked(!on); + enbDarkModeAction->blockSignals(oldState); +} + void RclMain::resultCount(int n) { actionSortByDateAsc->setEnabled(n>0); diff --git a/src/qtgui/rclmain_w.h b/src/qtgui/rclmain_w.h index a103476d..0a5cf112 100644 --- a/src/qtgui/rclmain_w.h +++ b/src/qtgui/rclmain_w.h @@ -113,6 +113,7 @@ public slots: virtual void showDocHistory(); virtual void showExtIdxDialog(); virtual void setSynEnabled(bool); + virtual void setDarkModeEnabled(bool); virtual void showUIPrefs(); virtual void showIndexConfig(); virtual void execIndexConfig(); diff --git a/src/qtgui/uiprefs_w.cpp b/src/qtgui/uiprefs_w.cpp index 41dd5006..8f4e3022 100644 --- a/src/qtgui/uiprefs_w.cpp +++ b/src/qtgui/uiprefs_w.cpp @@ -469,10 +469,14 @@ void UIPrefsDialog::showStylesheetDialog() } } -void UIPrefsDialog::resetStylesheet() +void UIPrefsDialog::resetStylesheet(QString fn) { - qssFile = ""; - stylesheetPB->setText(tr("Choose")); + qssFile = fn; + if (fn.isEmpty()) { + stylesheetPB->setText(tr("Choose")); + } else { + stylesheetPB->setText(fn); + } } void UIPrefsDialog::showSnipCssDialog() { diff --git a/src/qtgui/uiprefs_w.h b/src/qtgui/uiprefs_w.h index 212d17c5..45533813 100644 --- a/src/qtgui/uiprefs_w.h +++ b/src/qtgui/uiprefs_w.h @@ -53,7 +53,7 @@ public slots: virtual void showStylesheetDialog(); virtual void showSynFileDialog(); virtual void showSnipCssDialog(); - virtual void resetStylesheet(); + virtual void resetStylesheet(QString fn = QString()); virtual void resetSnipCss(); virtual void showViewAction(); virtual void showViewAction(const QString& mt); diff --git a/src/sampleconf/recoll-dark.css b/src/sampleconf/recoll-dark.css index 520cfb6e..b686ec04 100644 --- a/src/sampleconf/recoll-dark.css +++ b/src/sampleconf/recoll-dark.css @@ -1,5 +1,5 @@ -/* Result list HTML Header insert */ +