Make Notepad++ dark mode colors customizable

Add 6 more color choices.

Close #10128
This commit is contained in:
Don Ho 2021-07-09 03:51:48 +02:00
parent 066ef8a4a0
commit 39b9090b96
7 changed files with 285 additions and 29 deletions

View File

@ -56,6 +56,7 @@ namespace NppDarkMode
} }
}; };
// black (default)
static const Colors darkColors{ static const Colors darkColors{
HEXRGB(0x202020), // background HEXRGB(0x202020), // background
HEXRGB(0x404040), // softerBackground HEXRGB(0x404040), // softerBackground
@ -69,6 +70,98 @@ namespace NppDarkMode
HEXRGB(0x414141) // highlightHotTrack 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 struct Theme
{ {
Colors colors; 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() Theme& getTheme()
{ {
static Theme g_theme(darkColors); switch (g_colorToneChoice)
return g_theme; {
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 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() void initDarkMode()
@ -106,7 +237,7 @@ namespace NppDarkMode
{ {
bool supportedChanged = false; bool supportedChanged = false;
auto& config = configuredOptions(); auto config = configuredOptions();
if (_options.enable != config.enable) if (_options.enable != config.enable)
{ {

View File

@ -29,6 +29,16 @@ namespace NppDarkMode
tabbar tabbar
}; };
enum ColorTone {
blackTone = 0,
redTone = 1,
greenTone = 2,
blueTone = 3,
purpleTone = 4,
cyanTone = 5,
oliveTone = 6
};
void initDarkMode(); // pulls options from NppParameters 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 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 invertLightness(COLORREF c);
COLORREF invertLightnessSofter(COLORREF c); COLORREF invertLightnessSofter(COLORREF c);
void setDarkTone(ColorTone colorToneChoice);
COLORREF getBackgroundColor(); COLORREF getBackgroundColor();
COLORREF getSofterBackgroundColor(); COLORREF getSofterBackgroundColor();
COLORREF getHotBackgroundColor(); COLORREF getHotBackgroundColor();

View File

@ -5387,9 +5387,12 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
return defaultValue; return defaultValue;
}; };
_nppGUI._darkmode.enable = parseYesNoBoolAttribute(TEXT("enable")); _nppGUI._darkmode._isEnabled = parseYesNoBoolAttribute(TEXT("enable"));
_nppGUI._darkmode.enableMenubar = parseYesNoBoolAttribute(TEXT("enableMenubar"));
_nppGUI._darkmode.enableScrollbarHack = parseYesNoBoolAttribute(TEXT("enableScrollbarHack")); int i;
const TCHAR* val = element->Attribute(TEXT("colorTone"), &i);
if (val)
_nppGUI._darkmode._colorTone = static_cast<NppDarkMode::ColorTone>(i);
} }
} }
} }
@ -6402,7 +6405,7 @@ void NppParameters::createXmlTreeFromGUIParams()
GUIConfigElement->InsertEndChild(TiXmlText(_nppGUI._commandLineInterpreter.c_str())); GUIConfigElement->InsertEndChild(TiXmlText(_nppGUI._commandLineInterpreter.c_str()));
} }
// <GUIConfig name="DarkMode" enable="no" enableExperimental="no" enableMenubar="no" enableScrollbarHack="no" /> // <GUIConfig name="DarkMode" enable="no" colorTone="0" />
{ {
TiXmlElement* GUIConfigElement = (newGUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); TiXmlElement* GUIConfigElement = (newGUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement();
GUIConfigElement->SetAttribute(TEXT("name"), TEXT("DarkMode")); GUIConfigElement->SetAttribute(TEXT("name"), TEXT("DarkMode"));
@ -6412,9 +6415,8 @@ void NppParameters::createXmlTreeFromGUIParams()
GUIConfigElement->SetAttribute(name, pStr); GUIConfigElement->SetAttribute(name, pStr);
}; };
setYesNoBoolAttribute(TEXT("enable"), _nppGUI._darkmode.enable); setYesNoBoolAttribute(TEXT("enable"), _nppGUI._darkmode._isEnabled);
setYesNoBoolAttribute(TEXT("enableMenubar"), _nppGUI._darkmode.enableMenubar); GUIConfigElement->SetAttribute(TEXT("colorTone"), _nppGUI._darkmode._colorTone);
setYesNoBoolAttribute(TEXT("enableScrollbarHack"), _nppGUI._darkmode.enableScrollbarHack);
} }
// <GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="no" rightClickKeepsSelection="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" /> // <GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="no" rightClickKeepsSelection="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" />

View File

@ -777,6 +777,11 @@ public:
bool _doDoubleQuotes = false; bool _doDoubleQuotes = false;
}; };
struct DarkModeConf final
{
bool _isEnabled = false;
NppDarkMode::ColorTone _colorTone = NppDarkMode::blackTone;
};
struct NppGUI final struct NppGUI final
{ {
@ -931,7 +936,7 @@ struct NppGUI final
bool _isDocPeekOnTab = false; bool _isDocPeekOnTab = false;
bool _isDocPeekOnMap = false; bool _isDocPeekOnMap = false;
NppDarkMode::Options _darkmode; DarkModeConf _darkmode;
}; };
struct ScintillaViewParams struct ScintillaViewParams

View File

@ -101,16 +101,14 @@ STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
FONT 8, "MS Shell Dlg", 0, 0, 0x1 FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN BEGIN
CONTROL "Enable &dark mode",IDC_CHECK_DARKMODE_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,20,150,10 CONTROL "Enable &dark mode",IDC_CHECK_DARKMODE_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,20,150,10
/* //LTEXT "* Notepad++ must be restarted to take effect completely",IDC_STATIC_DARKMODE_WARNING,20,35,310,16
CONTROL "Override &menubar drawing", IDC_CHECK_DARKMODE_ENABLE_MENUBAR, CONTROL "Black tone",IDC_RADIO_DARKMODE_BLACK, "Button",BS_AUTORADIOBUTTON | WS_GROUP,35,40,150,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,66,289,10 CONTROL "Red tone",IDC_RADIO_DARKMODE_RED, "Button",BS_AUTORADIOBUTTON ,35,55,150,10
CONTROL "&Use system dark mode API* (dark title bar and menus)",IDC_CHECK_DARKMODE_ENABLE_EXPERIMENTAL, CONTROL "Green tone",IDC_RADIO_DARKMODE_GREEN, "Button",BS_AUTORADIOBUTTON ,35,70,150,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,80,289,10 CONTROL "Blue tone",IDC_RADIO_DARKMODE_BLUE, "Button",BS_AUTORADIOBUTTON ,35,85,150,10
CONTROL "Override &scrollbar themes*", IDC_CHECK_DARKMODE_ENABLE_SCROLLBAR_HACK, CONTROL "Purple tone",IDC_RADIO_DARKMODE_PURPLE, "Button",BS_AUTORADIOBUTTON ,35,100,150,10
"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 20,94,289,10 CONTROL "Cyan tone",IDC_RADIO_DARKMODE_CYAN, "Button",BS_AUTORADIOBUTTON ,35,115,150,10
GROUPBOX "Experimental Dark Mode Options",IDC_GROUPBOX_DARKMODE,11,47,307,70,BS_CENTER CONTROL "Olive tone",IDC_RADIO_DARKMODE_OLIVE, "Button",BS_AUTORADIOBUTTON ,35,130,150,10
*/
LTEXT "* Notepad++ must be restarted to take effect completely",IDC_STATIC_DARKMODE_WARNING,20,35,310,16
END END
IDD_PREFERENCE_SUB_MARGING_BORDER_EDGE DIALOGEX 0, 0, 455, 185 IDD_PREFERENCE_SUB_MARGING_BORDER_EDGE DIALOGEX 0, 0, 455, 185

View File

@ -815,7 +815,39 @@ INT_PTR CALLBACK DarkModeSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
{ {
case WM_INITDIALOG: 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(); ETDTProc enableDlgTheme = (ETDTProc)nppParam.getEnableThemeDlgTexture();
if (enableDlgTheme) if (enableDlgTheme)
@ -829,13 +861,20 @@ INT_PTR CALLBACK DarkModeSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
switch (wParam) switch (wParam)
{ {
case IDC_CHECK_DARKMODE_ENABLE: case IDC_CHECK_DARKMODE_ENABLE:
{
bool enableDarkMode = isCheckedOrNot(static_cast<int>(wParam)); bool enableDarkMode = isCheckedOrNot(static_cast<int>(wParam));
nppGUI._darkmode.enable = enableDarkMode; nppGUI._darkmode._isEnabled = enableDarkMode;
nppGUI._darkmode.enableMenubar = enableDarkMode;
nppGUI._darkmode.enableScrollbarHack = 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 // 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 // For toolbar: if dark mode enabled & TB_STANDARD is selected, switch to TB_SMALL
bool isStandardChecked = false; 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); ::SendMessage(_hParent, PREF_MSG_DISABLETABBARALTERNATEICONS, 0, 0);
} }
changed = true; 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; break;
} }
if (changed) if (changed)
{ {
NppDarkMode::refreshDarkMode(_hSelf); NppDarkMode::refreshDarkMode(_hSelf);
getFocus(); // to make black mode title bar appear
return TRUE; return TRUE;
} }

View File

@ -375,6 +375,13 @@
#define IDD_PREFERENCE_SUB_DARKMODE 7100 //(IDD_PREFERENCE_BOX + 1100) #define IDD_PREFERENCE_SUB_DARKMODE 7100 //(IDD_PREFERENCE_BOX + 1100)
#define IDC_CHECK_DARKMODE_ENABLE (IDD_PREFERENCE_SUB_DARKMODE + 1) #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 #endif //PREFERENCE_RC_H