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{
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)
{

View File

@ -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();

View File

@ -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<NppDarkMode::ColorTone>(i);
}
}
}
@ -6402,7 +6405,7 @@ void NppParameters::createXmlTreeFromGUIParams()
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();
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);
}
// <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;
};
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

View File

@ -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

View File

@ -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<int>(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;
}

View File

@ -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