From 39b9090b960aab05292d38623ab420d16b721e3b Mon Sep 17 00:00:00 2001 From: Don Ho Date: Fri, 9 Jul 2021 03:51:48 +0200 Subject: [PATCH] Make Notepad++ dark mode colors customizable Add 6 more color choices. Close #10128 --- PowerEditor/src/NppDarkMode.cpp | 141 +++++++++++++++++- PowerEditor/src/NppDarkMode.h | 12 ++ PowerEditor/src/Parameters.cpp | 16 +- PowerEditor/src/Parameters.h | 7 +- .../src/WinControls/Preference/preference.rc | 18 +-- .../WinControls/Preference/preferenceDlg.cpp | 111 +++++++++++++- .../WinControls/Preference/preference_rc.h | 9 +- 7 files changed, 285 insertions(+), 29 deletions(-) diff --git a/PowerEditor/src/NppDarkMode.cpp b/PowerEditor/src/NppDarkMode.cpp index 0bbe0f0d8..3881279cb 100644 --- a/PowerEditor/src/NppDarkMode.cpp +++ b/PowerEditor/src/NppDarkMode.cpp @@ -56,6 +56,7 @@ namespace NppDarkMode } }; + // black (default) static const Colors darkColors{ HEXRGB(0x202020), // background HEXRGB(0x404040), // softerBackground @@ -69,6 +70,98 @@ namespace NppDarkMode HEXRGB(0x414141) // highlightHotTrack }; + // red tone + static const Colors darkRedColors{ + HEXRGB(0x302020), // background + HEXRGB(0x504040), // softerBackground + HEXRGB(0x504040), // hotBackground + HEXRGB(0x302020), // pureBackground + HEXRGB(0xC00000), // errorBackground + HEXRGB(0xE0E0E0), // textColor + HEXRGB(0xC0C0C0), // darkerTextColor + HEXRGB(0x808080), // disabledTextColor + HEXRGB(0x908080), // edgeColor + HEXRGB(0x514141) // highlightHotTrack + }; + + // green tone + static const Colors darkGreenColors{ + HEXRGB(0x203020), // background + HEXRGB(0x405040), // softerBackground + HEXRGB(0x405040), // hotBackground + HEXRGB(0x203020), // pureBackground + HEXRGB(0xB01000), // errorBackground + HEXRGB(0xE0E0E0), // textColor + HEXRGB(0xC0C0C0), // darkerTextColor + HEXRGB(0x808080), // disabledTextColor + HEXRGB(0x809080), // edgeColor + HEXRGB(0x415141) // highlightHotTrack + }; + + + // blue tone + static const Colors darkBlueColors{ + HEXRGB(0x202040), // background + HEXRGB(0x404060), // softerBackground + HEXRGB(0x404060), // hotBackground + HEXRGB(0x202040), // pureBackground + HEXRGB(0xB00020), // errorBackground + HEXRGB(0xE0E0E0), // textColor + HEXRGB(0xC0C0C0), // darkerTextColor + HEXRGB(0x808080), // disabledTextColor + HEXRGB(0x8080A0), // edgeColor + HEXRGB(0x414161) // highlightHotTrack + }; + + // purple tone + static const Colors darkPurpleColors{ + HEXRGB(0x302040), // background + HEXRGB(0x504060), // softerBackground + HEXRGB(0x504060), // hotBackground + HEXRGB(0x302040), // pureBackground + HEXRGB(0xC00020), // errorBackground + HEXRGB(0xE0E0E0), // textColor + HEXRGB(0xC0C0C0), // darkerTextColor + HEXRGB(0x808080), // disabledTextColor + HEXRGB(0x9080A0), // edgeColor + HEXRGB(0x514161) // highlightHotTrack + }; + + // cyan tone + static const Colors darkCyanColors{ + HEXRGB(0x203040), // background + HEXRGB(0x405060), // softerBackground + HEXRGB(0x405060), // hotBackground + HEXRGB(0x203040), // pureBackground + HEXRGB(0xB01020), // errorBackground + HEXRGB(0xE0E0E0), // textColor + HEXRGB(0xC0C0C0), // darkerTextColor + HEXRGB(0x808080), // disabledTextColor + HEXRGB(0x8090A0), // edgeColor + HEXRGB(0x415161) // highlightHotTrack + }; + + // olive tone + static const Colors darkOliveColors{ + HEXRGB(0x303020), // background + HEXRGB(0x505040), // softerBackground + HEXRGB(0x505040), // hotBackground + HEXRGB(0x303020), // pureBackground + HEXRGB(0xC01000), // errorBackground + HEXRGB(0xE0E0E0), // textColor + HEXRGB(0xC0C0C0), // darkerTextColor + HEXRGB(0x808080), // disabledTextColor + HEXRGB(0x909080), // edgeColor + HEXRGB(0x515141) // highlightHotTrack + }; + + ColorTone g_colorToneChoice = blackTone; + + void setDarkTone(ColorTone colorToneChoice) + { + g_colorToneChoice = colorToneChoice; + } + struct Theme { Colors colors; @@ -80,17 +173,55 @@ namespace NppDarkMode {} }; + Theme t0(darkColors); + Theme t1(darkRedColors); + Theme t2(darkGreenColors); + Theme t3(darkBlueColors); + Theme t4(darkPurpleColors); + Theme t5(darkCyanColors); + Theme t6(darkOliveColors); + + Theme& getTheme() { - static Theme g_theme(darkColors); - return g_theme; + switch (g_colorToneChoice) + { + case redTone: + return t1; + + case greenTone: + return t2; + + case blueTone: + return t3; + + case purpleTone: + return t4; + + case cyanTone: + return t5; + + case oliveTone: + return t6; + + default: + return t0; + } } static Options _options; // actual runtime options - const Options& configuredOptions() + Options configuredOptions() { - return NppParameters::getInstance().getNppGUI()._darkmode; + NppGUI nppGui = NppParameters::getInstance().getNppGUI(); + Options opt; + opt.enable = nppGui._darkmode._isEnabled; + opt.enableMenubar = opt.enable; + opt.enableScrollbarHack = opt.enable; + + g_colorToneChoice = nppGui._darkmode._colorTone; + + return opt; } void initDarkMode() @@ -106,7 +237,7 @@ namespace NppDarkMode { bool supportedChanged = false; - auto& config = configuredOptions(); + auto config = configuredOptions(); if (_options.enable != config.enable) { diff --git a/PowerEditor/src/NppDarkMode.h b/PowerEditor/src/NppDarkMode.h index 59691904e..212f831dc 100644 --- a/PowerEditor/src/NppDarkMode.h +++ b/PowerEditor/src/NppDarkMode.h @@ -29,6 +29,16 @@ namespace NppDarkMode tabbar }; + enum ColorTone { + blackTone = 0, + redTone = 1, + greenTone = 2, + blueTone = 3, + purpleTone = 4, + cyanTone = 5, + oliveTone = 6 + }; + void initDarkMode(); // pulls options from NppParameters void refreshDarkMode(HWND hwnd, bool forceRefresh = false); // attempts to apply new options from NppParameters, sends NPPM_INTERNAL_REFRESHDARKMODE to hwnd's top level parent @@ -40,6 +50,8 @@ namespace NppDarkMode COLORREF invertLightness(COLORREF c); COLORREF invertLightnessSofter(COLORREF c); + void setDarkTone(ColorTone colorToneChoice); + COLORREF getBackgroundColor(); COLORREF getSofterBackgroundColor(); COLORREF getHotBackgroundColor(); diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index e93513389..ebd8f59b7 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -5387,9 +5387,12 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) return defaultValue; }; - _nppGUI._darkmode.enable = parseYesNoBoolAttribute(TEXT("enable")); - _nppGUI._darkmode.enableMenubar = parseYesNoBoolAttribute(TEXT("enableMenubar")); - _nppGUI._darkmode.enableScrollbarHack = parseYesNoBoolAttribute(TEXT("enableScrollbarHack")); + _nppGUI._darkmode._isEnabled = parseYesNoBoolAttribute(TEXT("enable")); + + int i; + const TCHAR* val = element->Attribute(TEXT("colorTone"), &i); + if (val) + _nppGUI._darkmode._colorTone = static_cast(i); } } } @@ -6402,7 +6405,7 @@ void NppParameters::createXmlTreeFromGUIParams() GUIConfigElement->InsertEndChild(TiXmlText(_nppGUI._commandLineInterpreter.c_str())); } - // + // { TiXmlElement* GUIConfigElement = (newGUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); GUIConfigElement->SetAttribute(TEXT("name"), TEXT("DarkMode")); @@ -6412,9 +6415,8 @@ void NppParameters::createXmlTreeFromGUIParams() GUIConfigElement->SetAttribute(name, pStr); }; - setYesNoBoolAttribute(TEXT("enable"), _nppGUI._darkmode.enable); - setYesNoBoolAttribute(TEXT("enableMenubar"), _nppGUI._darkmode.enableMenubar); - setYesNoBoolAttribute(TEXT("enableScrollbarHack"), _nppGUI._darkmode.enableScrollbarHack); + setYesNoBoolAttribute(TEXT("enable"), _nppGUI._darkmode._isEnabled); + GUIConfigElement->SetAttribute(TEXT("colorTone"), _nppGUI._darkmode._colorTone); } // diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 2a8540919..2896b1f7a 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -777,6 +777,11 @@ public: bool _doDoubleQuotes = false; }; +struct DarkModeConf final +{ + bool _isEnabled = false; + NppDarkMode::ColorTone _colorTone = NppDarkMode::blackTone; +}; struct NppGUI final { @@ -931,7 +936,7 @@ struct NppGUI final bool _isDocPeekOnTab = false; bool _isDocPeekOnMap = false; - NppDarkMode::Options _darkmode; + DarkModeConf _darkmode; }; struct ScintillaViewParams diff --git a/PowerEditor/src/WinControls/Preference/preference.rc b/PowerEditor/src/WinControls/Preference/preference.rc index 20a9e1e96..6859154b0 100644 --- a/PowerEditor/src/WinControls/Preference/preference.rc +++ b/PowerEditor/src/WinControls/Preference/preference.rc @@ -101,16 +101,14 @@ STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "Enable &dark mode",IDC_CHECK_DARKMODE_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,20,150,10 - /* - CONTROL "Override &menubar drawing", IDC_CHECK_DARKMODE_ENABLE_MENUBAR, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,66,289,10 - CONTROL "&Use system dark mode API* (dark title bar and menus)",IDC_CHECK_DARKMODE_ENABLE_EXPERIMENTAL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,80,289,10 - CONTROL "Override &scrollbar themes*", IDC_CHECK_DARKMODE_ENABLE_SCROLLBAR_HACK, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 20,94,289,10 - GROUPBOX "Experimental Dark Mode Options",IDC_GROUPBOX_DARKMODE,11,47,307,70,BS_CENTER - */ - LTEXT "* Notepad++ must be restarted to take effect completely",IDC_STATIC_DARKMODE_WARNING,20,35,310,16 + //LTEXT "* Notepad++ must be restarted to take effect completely",IDC_STATIC_DARKMODE_WARNING,20,35,310,16 + CONTROL "Black tone",IDC_RADIO_DARKMODE_BLACK, "Button",BS_AUTORADIOBUTTON | WS_GROUP,35,40,150,10 + CONTROL "Red tone",IDC_RADIO_DARKMODE_RED, "Button",BS_AUTORADIOBUTTON ,35,55,150,10 + CONTROL "Green tone",IDC_RADIO_DARKMODE_GREEN, "Button",BS_AUTORADIOBUTTON ,35,70,150,10 + CONTROL "Blue tone",IDC_RADIO_DARKMODE_BLUE, "Button",BS_AUTORADIOBUTTON ,35,85,150,10 + CONTROL "Purple tone",IDC_RADIO_DARKMODE_PURPLE, "Button",BS_AUTORADIOBUTTON ,35,100,150,10 + CONTROL "Cyan tone",IDC_RADIO_DARKMODE_CYAN, "Button",BS_AUTORADIOBUTTON ,35,115,150,10 + CONTROL "Olive tone",IDC_RADIO_DARKMODE_OLIVE, "Button",BS_AUTORADIOBUTTON ,35,130,150,10 END IDD_PREFERENCE_SUB_MARGING_BORDER_EDGE DIALOGEX 0, 0, 455, 185 diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp index 6914af7f7..af67867e5 100644 --- a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp @@ -815,7 +815,39 @@ INT_PTR CALLBACK DarkModeSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM { case WM_INITDIALOG: { - ::SendDlgItemMessage(_hSelf, IDC_CHECK_DARKMODE_ENABLE, BM_SETCHECK, nppGUI._darkmode.enable, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_DARKMODE_ENABLE, BM_SETCHECK, nppGUI._darkmode._isEnabled, 0); + + int id = IDC_RADIO_DARKMODE_BLACK; + switch (nppGUI._darkmode._colorTone) + { + case NppDarkMode::redTone: + id = IDC_RADIO_DARKMODE_RED; + break; + case NppDarkMode::greenTone: + id = IDC_RADIO_DARKMODE_GREEN; + break; + case NppDarkMode::blueTone: + id = IDC_RADIO_DARKMODE_BLUE; + break; + case NppDarkMode::purpleTone: + id = IDC_RADIO_DARKMODE_PURPLE; + break; + case NppDarkMode::cyanTone: + id = IDC_RADIO_DARKMODE_CYAN; + break; + case NppDarkMode::oliveTone: + id = IDC_RADIO_DARKMODE_OLIVE; + break; + } + ::SendDlgItemMessage(_hSelf, id, BM_SETCHECK, TRUE, 0); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_BLACK), nppGUI._darkmode._isEnabled); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_RED), nppGUI._darkmode._isEnabled); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_GREEN), nppGUI._darkmode._isEnabled); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_BLUE), nppGUI._darkmode._isEnabled); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_PURPLE), nppGUI._darkmode._isEnabled); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_CYAN), nppGUI._darkmode._isEnabled); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_OLIVE), nppGUI._darkmode._isEnabled); ETDTProc enableDlgTheme = (ETDTProc)nppParam.getEnableThemeDlgTexture(); if (enableDlgTheme) @@ -829,13 +861,20 @@ INT_PTR CALLBACK DarkModeSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM switch (wParam) { case IDC_CHECK_DARKMODE_ENABLE: + { bool enableDarkMode = isCheckedOrNot(static_cast(wParam)); - nppGUI._darkmode.enable = enableDarkMode; - nppGUI._darkmode.enableMenubar = enableDarkMode; - nppGUI._darkmode.enableScrollbarHack = enableDarkMode; + nppGUI._darkmode._isEnabled = enableDarkMode; + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_BLACK), enableDarkMode); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_RED), enableDarkMode); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_GREEN), enableDarkMode); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_BLUE), enableDarkMode); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_PURPLE), enableDarkMode); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_CYAN), enableDarkMode); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_DARKMODE_OLIVE), enableDarkMode); // Maintain the coherence in preferences - if (nppGUI._darkmode.enable) + if (nppGUI._darkmode._isEnabled) { // For toolbar: if dark mode enabled & TB_STANDARD is selected, switch to TB_SMALL bool isStandardChecked = false; @@ -847,12 +886,74 @@ INT_PTR CALLBACK DarkModeSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM ::SendMessage(_hParent, PREF_MSG_DISABLETABBARALTERNATEICONS, 0, 0); } changed = true; + } + break; + + case IDC_RADIO_DARKMODE_BLACK: + case IDC_RADIO_DARKMODE_RED: + case IDC_RADIO_DARKMODE_GREEN: + case IDC_RADIO_DARKMODE_BLUE: + case IDC_RADIO_DARKMODE_PURPLE: + case IDC_RADIO_DARKMODE_CYAN: + case IDC_RADIO_DARKMODE_OLIVE: + if (wParam == IDC_RADIO_DARKMODE_BLACK) + { + if (nppGUI._darkmode._colorTone == NppDarkMode::blackTone) + return TRUE; + nppGUI._darkmode._colorTone = NppDarkMode::blackTone; + } + else if (wParam == IDC_RADIO_DARKMODE_RED) + { + if (nppGUI._darkmode._colorTone == NppDarkMode::redTone) + return TRUE; + nppGUI._darkmode._colorTone = NppDarkMode::redTone; + } + else if (wParam == IDC_RADIO_DARKMODE_GREEN) + { + if (nppGUI._darkmode._colorTone == NppDarkMode::greenTone) + return TRUE; + nppGUI._darkmode._colorTone = NppDarkMode::greenTone; + } + else if (wParam == IDC_RADIO_DARKMODE_BLUE) + { + if (nppGUI._darkmode._colorTone == NppDarkMode::blueTone) + return TRUE; + nppGUI._darkmode._colorTone = NppDarkMode::blueTone; + } + else if (wParam == IDC_RADIO_DARKMODE_PURPLE) + { + if (nppGUI._darkmode._colorTone == NppDarkMode::purpleTone) + return TRUE; + nppGUI._darkmode._colorTone = NppDarkMode::purpleTone; + } + else if (wParam == IDC_RADIO_DARKMODE_CYAN) + { + if (nppGUI._darkmode._colorTone == NppDarkMode::cyanTone) + return TRUE; + nppGUI._darkmode._colorTone = NppDarkMode::cyanTone; + } + else if (wParam == IDC_RADIO_DARKMODE_OLIVE) + { + if (nppGUI._darkmode._colorTone == NppDarkMode::oliveTone) + return TRUE; + nppGUI._darkmode._colorTone = NppDarkMode::oliveTone; + } + + // switch to light mode firstly (to make color change completely) + nppGUI._darkmode._isEnabled = false; + NppDarkMode::refreshDarkMode(_hSelf); + + // switch to chosen dark mode + nppGUI._darkmode._isEnabled = true; + NppDarkMode::setDarkTone(nppGUI._darkmode._colorTone); + changed = true; break; } if (changed) { NppDarkMode::refreshDarkMode(_hSelf); + getFocus(); // to make black mode title bar appear return TRUE; } diff --git a/PowerEditor/src/WinControls/Preference/preference_rc.h b/PowerEditor/src/WinControls/Preference/preference_rc.h index 5b9af1d9a..c7f176a66 100644 --- a/PowerEditor/src/WinControls/Preference/preference_rc.h +++ b/PowerEditor/src/WinControls/Preference/preference_rc.h @@ -375,6 +375,13 @@ #define IDD_PREFERENCE_SUB_DARKMODE 7100 //(IDD_PREFERENCE_BOX + 1100) #define IDC_CHECK_DARKMODE_ENABLE (IDD_PREFERENCE_SUB_DARKMODE + 1) - #define IDC_STATIC_DARKMODE_WARNING (IDD_PREFERENCE_SUB_DARKMODE + 6) + #define IDC_RADIO_DARKMODE_BLACK (IDD_PREFERENCE_SUB_DARKMODE + 2) + #define IDC_RADIO_DARKMODE_RED (IDD_PREFERENCE_SUB_DARKMODE + 3) + #define IDC_RADIO_DARKMODE_GREEN (IDD_PREFERENCE_SUB_DARKMODE + 4) + #define IDC_RADIO_DARKMODE_BLUE (IDD_PREFERENCE_SUB_DARKMODE + 5) + //#define IDC_STATIC_DARKMODE_WARNING (IDD_PREFERENCE_SUB_DARKMODE + 6) + #define IDC_RADIO_DARKMODE_PURPLE (IDD_PREFERENCE_SUB_DARKMODE + 7) + #define IDC_RADIO_DARKMODE_CYAN (IDD_PREFERENCE_SUB_DARKMODE + 8) + #define IDC_RADIO_DARKMODE_OLIVE (IDD_PREFERENCE_SUB_DARKMODE + 9) #endif //PREFERENCE_RC_H