Refactor fluent icon color feature code

- fix visual glitches when toggling dark mode
- make english names consistent

Close #16435
This commit is contained in:
ozone10 2025-04-16 18:47:20 +02:00 committed by Don Ho
parent 331030ce66
commit d5b5e5e107
11 changed files with 439 additions and 395 deletions

View File

@ -689,11 +689,8 @@ LRESULT Notepad_plus::init(HWND hwnd)
//-- Tool Bar Section --//
const NppDarkMode::TbIconInfo toolbarIconInfo = NppDarkMode::getToolbarIconInfo();
nppGUI._tbIconInfo = toolbarIconInfo;
nppGUI._toolBarStatus = static_cast<toolBarStatusType>(nppGUI._tbIconInfo._tbIconSet);
toolBarStatusType tbStatus = nppGUI._toolBarStatus;
nppGUI._tbIconInfo = NppDarkMode::getToolbarIconInfo();
toolBarStatusType tbStatus = nppGUI._tbIconInfo._tbIconSet;
willBeShown = nppGUI._toolbarShow;
// To notify plugins that toolbar icons can be registered
@ -893,7 +890,7 @@ bool Notepad_plus::saveGUIParams()
NppParameters& nppParams = NppParameters::getInstance();
NppGUI & nppGUI = nppParams.getNppGUI();
nppGUI._toolbarShow = _rebarTop.getIDVisible(REBAR_BAR_TOOLBAR);
nppGUI._toolBarStatus = _toolBar.getState();
nppGUI._tbIconInfo._tbIconSet = _toolBar.getState();
nppGUI._splitterPos = _subSplitter.isVertical()?POS_VERTICAL:POS_HORIZOTAL;
UserDefineDialog *udd = _pEditView->getUserDefineDlg();
@ -7290,11 +7287,11 @@ void Notepad_plus::launchClipboardHistoryPanel()
// define the default docking behaviour
data.uMask = DWS_DF_CONT_RIGHT | DWS_ICONTAB | DWS_USEOWNDARKMODE;
int icoID = IDR_CLIPBOARDPANEL_ICO;
if (NppDarkMode::isEnabled())
int icoID = IDR_CLIPBOARDPANEL_ICO2;
if (nppParams.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDR_CLIPBOARDPANEL_ICO;
else if (NppDarkMode::isEnabled())
icoID = IDR_CLIPBOARDPANEL_ICO_DM;
else if (nppParams.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_CLIPBOARDPANEL_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, _pClipboardHistoryPanel->getHSelf());
DPIManagerV2::loadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
@ -7354,11 +7351,11 @@ void Notepad_plus::launchDocumentListPanel(bool changeFromBtnCmd)
// define the default docking behaviour
data.uMask = DWS_DF_CONT_LEFT | DWS_ICONTAB | DWS_USEOWNDARKMODE;
int icoID = IDR_DOCLIST_ICO;
if (NppDarkMode::isEnabled())
int icoID = IDR_DOCLIST_ICO2;
if (nppParams.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDR_DOCLIST_ICO;
else if (NppDarkMode::isEnabled())
icoID = IDR_DOCLIST_ICO_DM;
else if (nppParams.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_DOCLIST_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, _pDocumentListPanel->getHSelf());
DPIManagerV2::loadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
@ -7442,11 +7439,11 @@ void Notepad_plus::launchAnsiCharPanel()
// define the default docking behaviour
data.uMask = DWS_DF_CONT_RIGHT | DWS_ICONTAB | DWS_USEOWNDARKMODE;
int icoID = IDR_ASCIIPANEL_ICO;
if (NppDarkMode::isEnabled())
int icoID = IDR_ASCIIPANEL_ICO2;
if (nppParams.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDR_ASCIIPANEL_ICO;
else if (NppDarkMode::isEnabled())
icoID = IDR_ASCIIPANEL_ICO_DM;
else if (nppParams.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_ASCIIPANEL_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, _pAnsiCharPanel->getHSelf());
DPIManagerV2::loadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
@ -7494,11 +7491,11 @@ void Notepad_plus::launchFileBrowser(const vector<wstring> & folders, const wstr
// define the default docking behaviour
data.uMask = DWS_DF_CONT_LEFT | DWS_ICONTAB | DWS_USEOWNDARKMODE;
int icoID = IDR_FILEBROWSER_ICO;
if (NppDarkMode::isEnabled())
int icoID = IDR_FILEBROWSER_ICO2;
if (nppParams.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDR_FILEBROWSER_ICO;
else if (NppDarkMode::isEnabled())
icoID = IDR_FILEBROWSER_ICO_DM;
else if (nppParams.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_FILEBROWSER_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, _pFileBrowser->getHSelf());
DPIManagerV2::loadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
@ -7604,11 +7601,11 @@ void Notepad_plus::launchProjectPanel(int cmdID, ProjectPanel ** pProjPanel, int
// define the default docking behaviour
data.uMask = DWS_DF_CONT_LEFT | DWS_ICONTAB | DWS_USEOWNDARKMODE;
int icoID = IDR_PROJECTPANEL_ICO;
if (NppDarkMode::isEnabled())
int icoID = IDR_PROJECTPANEL_ICO2;
if (nppParam.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDR_PROJECTPANEL_ICO;
else if (NppDarkMode::isEnabled())
icoID = IDR_PROJECTPANEL_ICO_DM;
else if (nppParam.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_PROJECTPANEL_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, (*pProjPanel)->getHSelf());
DPIManagerV2::loadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
@ -7670,11 +7667,11 @@ void Notepad_plus::launchDocMap()
// define the default docking behaviour
data.uMask = DWS_DF_CONT_RIGHT | DWS_ICONTAB | DWS_USEOWNDARKMODE;
int icoID = IDR_DOCMAP_ICO;
if (NppDarkMode::isEnabled())
int icoID = IDR_DOCMAP_ICO2;
if (nppParam.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDR_DOCMAP_ICO;
else if (NppDarkMode::isEnabled())
icoID = IDR_DOCMAP_ICO_DM;
else if (nppParam.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_DOCMAP_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, _pDocMap->getHSelf());
DPIManagerV2::loadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
@ -7721,11 +7718,11 @@ void Notepad_plus::launchFunctionList()
NppParameters& nppParam = NppParameters::getInstance();
int icoID = IDR_FUNC_LIST_ICO;
if (NppDarkMode::isEnabled())
int icoID = IDR_FUNC_LIST_ICO2;
if (nppParam.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDR_FUNC_LIST_ICO;
else if (NppDarkMode::isEnabled())
icoID = IDR_FUNC_LIST_ICO_DM;
else if (nppParam.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_FUNC_LIST_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, _pFuncList->getHSelf());
DPIManagerV2::loadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
@ -8521,13 +8518,10 @@ void Notepad_plus::refreshDarkMode(bool resetStyle)
}
}
toolBarStatusType state = TB_STANDARD;
auto& nppGUITbInfo = nppParams.getNppGUI()._tbIconInfo;
const NppDarkMode::TbIconInfo toolbarIconInfo = NppDarkMode::getToolbarIconInfo();
nppGUITbInfo = toolbarIconInfo;
state = static_cast<toolBarStatusType>(nppGUITbInfo._tbIconSet);
nppGUITbInfo = NppDarkMode::getToolbarIconInfo();
switch (state)
switch (nppGUITbInfo._tbIconSet)
{
case TB_SMALL:
_toolBar.reduce();

View File

@ -322,13 +322,10 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
nppGUI._darkmode._isEnabled = enableDarkMode;
if (!_preference.isCreated())
{
toolBarStatusType state = TB_STANDARD;
auto& nppGUITbInfo = nppGUI._tbIconInfo;
const NppDarkMode::TbIconInfo toolbarIconInfo = NppDarkMode::getToolbarIconInfo();
nppGUITbInfo = toolbarIconInfo;
state = static_cast<toolBarStatusType>(nppGUITbInfo._tbIconSet);
nppGUITbInfo = NppDarkMode::getToolbarIconInfo();
switch (state)
switch (nppGUITbInfo._tbIconSet)
{
case TB_SMALL:
_toolBar.reduce();

View File

@ -34,7 +34,6 @@
#ifdef __GNUC__
#include <cmath>
#include <memory>
#define WINAPI_LAMBDA WINAPI
#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
@ -377,7 +376,7 @@ namespace NppDarkMode
}
static Options _options; // actual runtime options
static AdvancedOptions g_advOptions;
static ::AdvancedOptions g_advOptions;
static Options configuredOptions()
{
@ -578,7 +577,7 @@ namespace NppDarkMode
: g_advOptions._lightDefaults._tbIconInfo;
if (toolbarInfo._tbCustomColor == 0)
toolbarInfo._tbCustomColor = NppDarkMode::getAccentColor();
toolbarInfo._tbCustomColor = NppDarkMode::getAccentColor(useDark);
return toolbarInfo;
}
@ -591,9 +590,9 @@ namespace NppDarkMode
void setToolbarIconSet(int state2Set, bool useDark)
{
if (useDark)
g_advOptions._darkDefaults._tbIconInfo._tbIconSet = state2Set;
g_advOptions._darkDefaults._tbIconInfo._tbIconSet = static_cast<toolBarStatusType>(state2Set);
else
g_advOptions._lightDefaults._tbIconInfo._tbIconSet = state2Set;
g_advOptions._lightDefaults._tbIconInfo._tbIconSet = static_cast<toolBarStatusType>(state2Set);
}
void setToolbarIconSet(int state2Set)
@ -721,9 +720,14 @@ namespace NppDarkMode
return lightness;
}
COLORREF getAccentColor(bool useDark)
{
return useDark ? cAccentDark : cAccentLight;
}
COLORREF getAccentColor()
{
return NppDarkMode::isEnabled() ? cAccentDark : cAccentLight;
return getAccentColor(NppDarkMode::isEnabled());
}
COLORREF getBackgroundColor() { return getTheme()._colors.background; }
@ -3856,204 +3860,4 @@ namespace NppDarkMode
}
return NppDarkMode::onCtlColor(hdc);
}
bool changeFluentIconColor(HICON* phIcon, const std::vector<std::pair<COLORREF, COLORREF>>& colorMappings, int tolerance)
{
if (!*phIcon)
{
return false;
}
HDC hdcScreen = nullptr;
HDC hdcBitmap = nullptr;
BITMAP bm{};
ICONINFO ii{};
HBITMAP hbmNew = nullptr;
std::unique_ptr<RGBQUAD[]> pixels;
const bool changeEverything = colorMappings[0].first == 0;
auto cleanup = [&]()
{
if (hdcScreen) ::ReleaseDC(nullptr, hdcScreen);
if (hdcBitmap) ::DeleteDC(hdcBitmap);
if (ii.hbmColor) ::DeleteObject(ii.hbmColor);
if (ii.hbmMask) ::DeleteObject(ii.hbmMask);
if (hbmNew) ::DeleteObject(hbmNew);
};
hdcScreen = ::GetDC(nullptr);
hdcBitmap = ::CreateCompatibleDC(nullptr);
if (!hdcScreen || !hdcBitmap || !::GetIconInfo(*phIcon, &ii) || !ii.hbmColor || !::GetObject(ii.hbmColor, sizeof(BITMAP), &bm))
{
cleanup();
return false;
}
BITMAPINFO bmi{};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = bm.bmWidth;
bmi.bmiHeader.biHeight = -bm.bmHeight; // Top-down bitmap
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
pixels = std::make_unique<RGBQUAD[]>(static_cast<size_t>(bm.bmWidth) * bm.bmHeight);
if (!pixels || !::GetDIBits(hdcBitmap, ii.hbmColor, 0, bm.bmHeight, pixels.get(), &bmi, DIB_RGB_COLORS))
{
cleanup();
return false;
}
for (int i = 0; i < bm.bmWidth * bm.bmHeight; i++)
{
if (pixels[i].rgbReserved != 0) // Modify non-transparent pixels
{
if (changeEverything)
{
COLORREF cNew = colorMappings[0].second == 0 ? NppDarkMode::getAccentColor() : colorMappings[0].second;
pixels[i].rgbRed = GetRValue(cNew);
pixels[i].rgbGreen = GetGValue(cNew);
pixels[i].rgbBlue = GetBValue(cNew);
}
else
{
for (const auto& [cToChange, cNew] : colorMappings)
{
if (std::abs(pixels[i].rgbRed - GetRValue(cToChange)) <= tolerance &&
std::abs(pixels[i].rgbGreen - GetGValue(cToChange)) <= tolerance &&
std::abs(pixels[i].rgbBlue - GetBValue(cToChange)) <= tolerance)
{
COLORREF finalNewColor = (cNew == 0) ? NppDarkMode::getAccentColor() : cNew;
pixels[i].rgbRed = GetRValue(finalNewColor);
pixels[i].rgbGreen = GetGValue(finalNewColor);
pixels[i].rgbBlue = GetBValue(finalNewColor);
break;
}
}
}
}
}
hbmNew = ::CreateCompatibleBitmap(hdcScreen, bm.bmWidth, bm.bmHeight);
if (!hbmNew || !::SetDIBits(hdcBitmap, hbmNew, 0, bm.bmHeight, pixels.get(), &bmi, DIB_RGB_COLORS))
{
cleanup();
return false;
}
if (ii.hbmColor)
{
::DeleteObject(ii.hbmColor);
ii.hbmColor = nullptr;
}
ii.hbmColor = hbmNew;
HICON hIconNew = ::CreateIconIndirect(&ii);
if (!hIconNew)
{
cleanup();
return false;
}
::DestroyIcon(*phIcon);
*phIcon = hIconNew;
cleanup();
return true;
}
bool changeFluentIconColor(HICON* phIcon)
{
const auto cMain = NppDarkMode::isEnabled() ? cDefaultMainDark : cDefaultMainLight;
const auto cSecondary = NppDarkMode::isEnabled() ? cDefaultSecondaryDark : cDefaultSecondaryLight;
std::vector<std::pair<COLORREF, COLORREF>> colorMappings;
NppParameters& nppParams = NppParameters::getInstance();
const auto& tbInfo = nppParams.getNppGUI()._tbIconInfo;
COLORREF cOld = tbInfo._tbUseMono ? 0 : cSecondary;
COLORREF cNew = 0;
switch (tbInfo._tbColor)
{
case FluentColor::accent:
{
cNew = 0;
break;
}
case FluentColor::red:
{
cNew = RGB(0xE8, 0x11, 0x23);
break;
}
case FluentColor::green:
{
cNew = RGB(0x00, 0x8B, 0x00);
break;
}
case FluentColor::blue:
{
cNew = RGB(0x00, 0x78, 0xD4);
break;
}
case FluentColor::purple:
{
cNew = RGB(0xB1, 0x46, 0xC2);
break;
}
case FluentColor::cyan:
{
cNew = RGB(0x00, 0xB7, 0xC3);
break;
}
case FluentColor::olive:
{
cNew = RGB(0x49, 0x82, 0x05);
break;
}
case FluentColor::yellow:
{
cNew = RGB(0xFF, 0xB9, 0x00);
break;
}
case FluentColor::custom:
{
if (tbInfo._tbCustomColor != 0)
{
cNew = tbInfo._tbCustomColor;
break;
}
[[fallthrough]];
}
case FluentColor::defaultColor:
{
if (tbInfo._tbUseMono)
{
cNew = cMain;
break;
}
[[fallthrough]];
}
default:
{
return false;
}
}
colorMappings = { {cOld, cNew} };
return NppDarkMode::changeFluentIconColor(phIcon, colorMappings);
}
}

View File

@ -17,9 +17,11 @@
#pragma once
#include <string>
#include <vector>
#include <windows.h>
enum class FluentColor;
struct TbIconInfo;
struct AdvancedOptions;
namespace NppDarkMode
{
@ -80,52 +82,6 @@ namespace NppDarkMode
dark = 2
};
enum class FluentColor
{
defaultColor = 0,
accent = 1,
red = 2,
green = 3,
blue = 4,
purple = 5,
cyan = 6,
olive = 7,
yellow = 8,
custom = 9,
maxValue = 10
};
struct TbIconInfo
{
// 0: Fluent small, 1: Fluent big, 2: Filled Fluent small, 3: Filled Fluent big, 4: Standard small
int _tbIconSet = 4;
// fluent icon color
FluentColor _tbColor = FluentColor::defaultColor;
// fluent icon custom color, used when _tbColor == FluentColor::custom
COLORREF _tbCustomColor = 0;
// does fluent icon use monochrome colorization
bool _tbUseMono = false;
};
struct AdvOptDefaults
{
std::wstring _xmlFileName;
TbIconInfo _tbIconInfo{};
int _tabIconSet = -1;
bool _tabUseTheme = false;
};
struct AdvancedOptions
{
bool _enableWindowsMode = false;
NppDarkMode::AdvOptDefaults _darkDefaults{ L"DarkModeDefault.xml", {0, FluentColor::defaultColor, 0, false}, 2, false};
NppDarkMode::AdvOptDefaults _lightDefaults{ L"", { 4, FluentColor::defaultColor, 0, false }, 0, true };
};
constexpr UINT WM_SETBUTTONIDEALSIZE = (WM_USER + 4200);
void initDarkMode(); // pulls options from NppParameters
@ -167,6 +123,7 @@ namespace NppDarkMode
void setDarkTone(ColorTone colorToneChoice);
COLORREF getAccentColor(bool useDark);
COLORREF getAccentColor();
COLORREF getBackgroundColor();
@ -281,7 +238,4 @@ namespace NppDarkMode
LRESULT onCtlColorError(HDC hdc);
LRESULT onCtlColorDlgStaticText(HDC hdc, bool isTextEnabled);
LRESULT onCtlColorListbox(WPARAM wParam, LPARAM lParam);
bool changeFluentIconColor(HICON* phIcon, const std::vector<std::pair<COLORREF, COLORREF>>& colorMappings, int tolerance = 3);
bool changeFluentIconColor(HICON* phIcon);
}

View File

@ -4803,7 +4803,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
if (val)
{
auto& tbColor = _nppGUI._tbIconInfo._tbColor;
tbColor = static_cast<NppDarkMode::FluentColor>(i);
tbColor = static_cast<FluentColor>(i);
}
val = element->Attribute(L"fluentCustomColor", &i);
@ -4829,16 +4829,17 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
val = n->Value();
if (val)
{
auto& tbIconSet = _nppGUI._tbIconInfo._tbIconSet;
if (!lstrcmp(val, L"small"))
_nppGUI._toolBarStatus = TB_SMALL;
tbIconSet = TB_SMALL;
else if (!lstrcmp(val, L"large"))
_nppGUI._toolBarStatus = TB_LARGE;
tbIconSet = TB_LARGE;
else if (!lstrcmp(val, L"small2"))
_nppGUI._toolBarStatus = TB_SMALL2;
tbIconSet = TB_SMALL2;
else if (!lstrcmp(val, L"large2"))
_nppGUI._toolBarStatus = TB_LARGE2;
tbIconSet = TB_LARGE2;
else //if (!lstrcmp(val, L"standard"))
_nppGUI._toolBarStatus = TB_STANDARD;
tbIconSet = TB_STANDARD;
}
}
@ -6393,14 +6394,15 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
auto& windowsMode = _nppGUI._darkmode._advOptions._enableWindowsMode;
windowsMode = parseYesNoBoolAttribute(L"enableWindowsMode");
constexpr int fluentColorMaxValue = static_cast<int>(NppDarkMode::FluentColor::maxValue) - 1;
constexpr int fluentColorMaxValue = static_cast<int>(FluentColor::maxValue) - 1;
constexpr int tbStdIcoSet = static_cast<int>(TB_STANDARD);
auto& darkDefaults = _nppGUI._darkmode._advOptions._darkDefaults;
auto& darkThemeName = darkDefaults._xmlFileName;
auto& darkTbInfo = darkDefaults._tbIconInfo;
darkThemeName = parseStringAttribute(L"darkThemeName", L"DarkModeDefault.xml");
darkTbInfo._tbIconSet = parseMinMaxAttribute(L"darkToolBarIconSet", 0, 4);
darkTbInfo._tbColor = static_cast<NppDarkMode::FluentColor>(parseMinMaxAttribute(L"darkTbFluentColor", 0, fluentColorMaxValue));
darkTbInfo._tbIconSet = static_cast<toolBarStatusType>(parseMinMaxAttribute(L"darkToolBarIconSet", static_cast<int>(TB_SMALL), tbStdIcoSet));
darkTbInfo._tbColor = static_cast<FluentColor>(parseMinMaxAttribute(L"darkTbFluentColor", 0, fluentColorMaxValue));
darkTbInfo._tbCustomColor = parseIntAttribute(L"darkTbFluentCustomColor", 0);
darkTbInfo._tbUseMono = parseYesNoBoolAttribute(L"darkTbFluentMono");
darkDefaults._tabIconSet = parseMinMaxAttribute(L"darkTabIconSet", 2);
@ -6410,8 +6412,8 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
auto& lightThemeName = lightDefaults._xmlFileName;
auto& lightTbInfo = lightDefaults._tbIconInfo;
lightThemeName = parseStringAttribute(L"lightThemeName");
lightTbInfo._tbIconSet = parseMinMaxAttribute(L"lightToolBarIconSet", 4, 4);
lightTbInfo._tbColor = static_cast<NppDarkMode::FluentColor>(parseMinMaxAttribute(L"lightTbFluentColor", 0, fluentColorMaxValue));
lightTbInfo._tbIconSet = static_cast<toolBarStatusType>(parseMinMaxAttribute(L"lightToolBarIconSet", tbStdIcoSet, tbStdIcoSet));
lightTbInfo._tbColor = static_cast<FluentColor>(parseMinMaxAttribute(L"lightTbFluentColor", 0, fluentColorMaxValue));
lightTbInfo._tbCustomColor = parseIntAttribute(L"lightTbFluentCustomColor", 0);
lightTbInfo._tbUseMono = parseYesNoBoolAttribute(L"lightTbFluentMono");
lightDefaults._tabIconSet = parseMinMaxAttribute(L"lightTabIconSet", 0);
@ -7301,24 +7303,48 @@ void NppParameters::createXmlTreeFromGUIParams()
// <GUIConfig name="ToolBar" visible="yes">standard</GUIConfig>
{
TiXmlElement *GUIConfigElement = (newGUIRoot->InsertEndChild(TiXmlElement(L"GUIConfig")))->ToElement();
auto& nppGUITbInfo = _nppGUI._tbIconInfo;
GUIConfigElement->SetAttribute(L"name", L"ToolBar");
const wchar_t* pStr = (_nppGUI._toolbarShow) ? L"yes" : L"no";
GUIConfigElement->SetAttribute(L"visible", pStr);
GUIConfigElement->SetAttribute(L"fluentColor", static_cast<int>(_nppGUI._tbIconInfo._tbColor));
GUIConfigElement->SetAttribute(L"fluentCustomColor", _nppGUI._tbIconInfo._tbCustomColor);
pStr = (_nppGUI._tbIconInfo._tbUseMono) ? L"yes" : L"no";
GUIConfigElement->SetAttribute(L"fluentColor", static_cast<int>(nppGUITbInfo._tbColor));
GUIConfigElement->SetAttribute(L"fluentCustomColor", nppGUITbInfo._tbCustomColor);
pStr = (nppGUITbInfo._tbUseMono) ? L"yes" : L"no";
GUIConfigElement->SetAttribute(L"fluentMono", pStr);
if (_nppGUI._toolBarStatus == TB_SMALL)
switch (nppGUITbInfo._tbIconSet)
{
case TB_SMALL:
{
pStr = L"small";
else if (_nppGUI._toolBarStatus == TB_LARGE)
break;
}
case TB_LARGE:
{
pStr = L"large";
else if (_nppGUI._toolBarStatus == TB_SMALL2)
break;
}
case TB_SMALL2:
{
pStr = L"small2";
else if (_nppGUI._toolBarStatus == TB_LARGE2)
break;
}
case TB_LARGE2:
{
pStr = L"large2";
else //if (_nppGUI._toolBarStatus == TB_STANDARD)
break;
}
case TB_STANDARD:
default:
{
pStr = L"standard";
break;
}
}
GUIConfigElement->InsertEndChild(TiXmlText(pStr));
}

View File

@ -764,13 +764,63 @@ public:
bool _doDoubleQuotes = false;
};
constexpr COLORREF g_cDefaultMainDark = RGB(0xDE, 0xDE, 0xDE);
constexpr COLORREF g_cDefaultSecondaryDark = RGB(0x4C, 0xC2, 0xFF);
constexpr COLORREF g_cDefaultMainLight = RGB(0x21, 0x21, 0x21);
constexpr COLORREF g_cDefaultSecondaryLight = RGB(0x00, 0x78, 0xD4);
enum class FluentColor
{
defaultColor = 0,
red = 1,
green = 2,
blue = 3,
purple = 4,
cyan = 5,
olive = 6,
yellow = 7,
accent = 8,
custom = 9,
maxValue = 10
};
struct TbIconInfo
{
toolBarStatusType _tbIconSet = TB_STANDARD;
// fluent icon color
FluentColor _tbColor = FluentColor::defaultColor;
// fluent icon custom color, used when _tbColor == FluentColor::custom
COLORREF _tbCustomColor = 0;
// does fluent icon use monochrome colorization
bool _tbUseMono = false;
};
struct AdvOptDefaults final
{
std::wstring _xmlFileName;
TbIconInfo _tbIconInfo{};
int _tabIconSet = -1;
bool _tabUseTheme = false;
};
struct AdvancedOptions final
{
AdvOptDefaults _darkDefaults{ L"DarkModeDefault.xml", {TB_SMALL, FluentColor::defaultColor, 0, false}, 2, false };
AdvOptDefaults _lightDefaults{ L"", { TB_STANDARD, FluentColor::defaultColor, 0, false }, 0, true };
bool _enableWindowsMode = false;
};
struct DarkModeConf final
{
bool _isEnabled = false;
bool _isEnabledPlugin = true;
NppDarkMode::ColorTone _colorTone = NppDarkMode::blackTone;
NppDarkMode::Colors _customColors = NppDarkMode::getDarkModeDefaultColors();
NppDarkMode::AdvancedOptions _advOptions{};
AdvancedOptions _advOptions{};
};
@ -791,8 +841,7 @@ struct LargeFileRestriction final
struct NppGUI final
{
toolBarStatusType _toolBarStatus = TB_STANDARD;
NppDarkMode::TbIconInfo _tbIconInfo{ TB_STANDARD, NppDarkMode::FluentColor::defaultColor, 0, false };
TbIconInfo _tbIconInfo{ TB_STANDARD, FluentColor::defaultColor, 0, false };
bool _toolbarShow = true;
bool _statusBarShow = true;
bool _menuBarShow = true;

View File

@ -3611,11 +3611,11 @@ void FindReplaceDlg::findAllIn(InWhat op)
// define the default docking behaviour
data.uMask = DWS_DF_CONT_BOTTOM | DWS_ICONTAB | DWS_ADDINFO | DWS_USEOWNDARKMODE;
int icoID = IDI_FIND_RESULT_ICON;
if (NppDarkMode::isEnabled())
int icoID = IDR_FIND_RESULT_ICO2;
if (nppParam.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDI_FIND_RESULT_ICON;
else if (NppDarkMode::isEnabled())
icoID = IDR_FIND_RESULT_ICO_DM;
else if (nppParam.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_FIND_RESULT_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, _pFinder->getHSelf());
DPIManagerV2::loadIcon(_hInst, MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
@ -3759,11 +3759,11 @@ Finder* FindReplaceDlg::createFinder()
// define the default docking behaviour
data.uMask = DWS_DF_CONT_BOTTOM | DWS_ICONTAB | DWS_ADDINFO | DWS_USEOWNDARKMODE;
int icoID = IDI_FIND_RESULT_ICON;
if (NppDarkMode::isEnabled())
int icoID = IDR_FIND_RESULT_ICO2;
if (nppParam.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD)
icoID = IDI_FIND_RESULT_ICON;
else if (NppDarkMode::isEnabled())
icoID = IDR_FIND_RESULT_ICO_DM;
else if (nppParam.getNppGUI()._toolBarStatus != TB_STANDARD)
icoID = IDR_FIND_RESULT_ICO2;
const int iconSize = DPIManagerV2::scale(g_dockingContTabIconSize, _pFinder->getHSelf());
DPIManagerV2::loadIcon(_hInst, MAKEINTRESOURCE(icoID), iconSize, iconSize, &data.hIconTab, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);

View File

@ -18,6 +18,7 @@
#include <stdexcept>
#include <memory>
#include "ImageListSet.h"
#include "Parameters.h"
#include "NppDarkMode.h"
#include "dpiManagerV2.h"
@ -74,7 +75,6 @@ void IconList::addIcon(int iconID, int cx, int cy, int failIconID, bool isToolba
return;
}
}
constexpr int IDI_ICONABSENT = 104; // check resource.h for correct id
DPIManagerV2::loadIcon(_hInst, MAKEINTRESOURCE(IDI_ICONABSENT), cx, cy, &hIcon);
}
}
@ -82,7 +82,7 @@ void IconList::addIcon(int iconID, int cx, int cy, int failIconID, bool isToolba
if (hIcon != nullptr)
{
if (isToolbarNormal)
NppDarkMode::changeFluentIconColor(&hIcon);
IconList::changeFluentIconColor(&hIcon);
::ImageList_AddIcon(_hImglst, hIcon);
::DestroyIcon(hIcon);
}
@ -105,6 +105,207 @@ bool IconList::changeIcon(size_t index, const wchar_t* iconLocation) const
return (i == index);
}
bool IconList::changeFluentIconColor(HICON* phIcon, const std::vector<std::pair<COLORREF, COLORREF>>& colorMappings, int tolerance) const
{
if (!*phIcon)
{
return false;
}
HDC hdcScreen = nullptr;
HDC hdcBitmap = nullptr;
BITMAP bm{};
ICONINFO ii{};
HBITMAP hbmNew = nullptr;
std::unique_ptr<RGBQUAD[]> pixels;
const bool changeEverything = colorMappings[0].first == 0;
auto cleanup = [&]()
{
if (hdcScreen) ::ReleaseDC(nullptr, hdcScreen);
if (hdcBitmap) ::DeleteDC(hdcBitmap);
if (ii.hbmColor) ::DeleteObject(ii.hbmColor);
if (ii.hbmMask) ::DeleteObject(ii.hbmMask);
if (hbmNew) ::DeleteObject(hbmNew);
};
hdcScreen = ::GetDC(nullptr);
hdcBitmap = ::CreateCompatibleDC(nullptr);
if (!hdcScreen || !hdcBitmap || !::GetIconInfo(*phIcon, &ii) || !ii.hbmColor || !::GetObject(ii.hbmColor, sizeof(BITMAP), &bm))
{
cleanup();
return false;
}
BITMAPINFO bmi{};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = bm.bmWidth;
bmi.bmiHeader.biHeight = -bm.bmHeight; // Top-down bitmap
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
pixels = std::make_unique<RGBQUAD[]>(static_cast<size_t>(bm.bmWidth) * bm.bmHeight);
if (!pixels || !::GetDIBits(hdcBitmap, ii.hbmColor, 0, bm.bmHeight, pixels.get(), &bmi, DIB_RGB_COLORS))
{
cleanup();
return false;
}
for (int i = 0; i < bm.bmWidth * bm.bmHeight; i++)
{
if (pixels[i].rgbReserved != 0) // Modify non-transparent pixels
{
if (changeEverything)
{
COLORREF cNew = colorMappings[0].second == 0 ? NppDarkMode::getAccentColor() : colorMappings[0].second;
pixels[i].rgbRed = GetRValue(cNew);
pixels[i].rgbGreen = GetGValue(cNew);
pixels[i].rgbBlue = GetBValue(cNew);
}
else
{
for (const auto& [cToChange, cNew] : colorMappings)
{
if (std::abs(pixels[i].rgbRed - GetRValue(cToChange)) <= tolerance &&
std::abs(pixels[i].rgbGreen - GetGValue(cToChange)) <= tolerance &&
std::abs(pixels[i].rgbBlue - GetBValue(cToChange)) <= tolerance)
{
COLORREF finalNewColor = (cNew == 0) ? NppDarkMode::getAccentColor() : cNew;
pixels[i].rgbRed = GetRValue(finalNewColor);
pixels[i].rgbGreen = GetGValue(finalNewColor);
pixels[i].rgbBlue = GetBValue(finalNewColor);
break;
}
}
}
}
}
hbmNew = ::CreateCompatibleBitmap(hdcScreen, bm.bmWidth, bm.bmHeight);
if (!hbmNew || !::SetDIBits(hdcBitmap, hbmNew, 0, bm.bmHeight, pixels.get(), &bmi, DIB_RGB_COLORS))
{
cleanup();
return false;
}
if (ii.hbmColor)
{
::DeleteObject(ii.hbmColor);
ii.hbmColor = nullptr;
}
ii.hbmColor = hbmNew;
HICON hIconNew = ::CreateIconIndirect(&ii);
if (!hIconNew)
{
cleanup();
return false;
}
::DestroyIcon(*phIcon);
*phIcon = hIconNew;
cleanup();
return true;
}
bool IconList::changeFluentIconColor(HICON* phIcon) const
{
const auto cMain = NppDarkMode::isEnabled() ? g_cDefaultMainDark : g_cDefaultMainLight;
const auto cSecondary = NppDarkMode::isEnabled() ? g_cDefaultSecondaryDark : g_cDefaultSecondaryLight;
std::vector<std::pair<COLORREF, COLORREF>> colorMappings;
NppParameters& nppParams = NppParameters::getInstance();
const auto& tbInfo = nppParams.getNppGUI()._tbIconInfo;
COLORREF cOld = tbInfo._tbUseMono ? 0 : cSecondary;
COLORREF cNew = 0;
switch (tbInfo._tbColor)
{
case FluentColor::accent:
{
cNew = 0;
break;
}
case FluentColor::red:
{
cNew = RGB(0xE8, 0x11, 0x23);
break;
}
case FluentColor::green:
{
cNew = RGB(0x00, 0x8B, 0x00);
break;
}
case FluentColor::blue:
{
cNew = RGB(0x00, 0x78, 0xD4);
break;
}
case FluentColor::purple:
{
cNew = RGB(0xB1, 0x46, 0xC2);
break;
}
case FluentColor::cyan:
{
cNew = RGB(0x00, 0xB7, 0xC3);
break;
}
case FluentColor::olive:
{
cNew = RGB(0x49, 0x82, 0x05);
break;
}
case FluentColor::yellow:
{
cNew = RGB(0xFF, 0xB9, 0x00);
break;
}
case FluentColor::custom:
{
if (tbInfo._tbCustomColor != 0)
{
cNew = tbInfo._tbCustomColor;
break;
}
[[fallthrough]];
}
case FluentColor::defaultColor:
{
if (tbInfo._tbUseMono)
{
cNew = cMain;
break;
}
[[fallthrough]];
}
default:
{
return false;
}
}
colorMappings = { {cOld, cNew} };
return IconList::changeFluentIconColor(phIcon, colorMappings);
}
void ToolBarIcons::init(ToolBarButtonUnit *buttonUnitArray, int arraySize, const std::vector<DynamicCmdIcoBmp>& moreCmds)
{
for (int i = 0 ; i < arraySize ; ++i)

View File

@ -50,6 +50,9 @@ private :
int *_pIconIDArray = nullptr;
int _iconIDArraySize = 0;
int _iconSize = 0;
bool changeFluentIconColor(HICON* phIcon, const std::vector<std::pair<COLORREF, COLORREF>>& colorMappings, int tolerance = 3) const;
bool changeFluentIconColor(HICON* phIcon) const;
};
struct ToolBarButtonUnit
@ -158,4 +161,3 @@ private :
std::vector<IconList> _iconListVector;
};

View File

@ -194,8 +194,8 @@ intptr_t CALLBACK PreferenceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
_searchEngineSubDlg.create(IDD_PREFERENCE_SUB_SEARCHENGINE, false, false);
_wVector.push_back(DlgInfo(&_generalSubDlg, L"General", L"Global"));
_wVector.push_back(DlgInfo(&_toolbarSubDlg, L"Tool Bar", L"Toolbar"));
_wVector.push_back(DlgInfo(&_tabbarSubDlg, L"Tab bar", L"Tabbar"));
_wVector.push_back(DlgInfo(&_toolbarSubDlg, L"Toolbar", L"Toolbar"));
_wVector.push_back(DlgInfo(&_tabbarSubDlg, L"Tab Bar", L"Tabbar"));
_wVector.push_back(DlgInfo(&_editingSubDlg, L"Editing 1", L"Scintillas"));
_wVector.push_back(DlgInfo(&_editing2SubDlg, L"Editing 2", L"Scintillas2"));
_wVector.push_back(DlgInfo(&_darkModeSubDlg, L"Dark Mode", L"DarkMode"));
@ -289,6 +289,10 @@ intptr_t CALLBACK PreferenceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
const bool isEnableAutoC = _autoCompletionSubDlg.isCheckedOrNot(IDD_AUTOC_ENABLECHECK);
::EnableWindow(::GetDlgItem(_autoCompletionSubDlg.getHSelf(), IDD_AUTOC_USEKEY_GRP_STATIC), isEnableAutoC);
const bool isFluentIcon = !_toolbarSubDlg.isCheckedOrNot(IDC_RADIO_STANDARD);
::EnableWindow(::GetDlgItem(_toolbarSubDlg.getHSelf(), IDC_TOOLBAR_GB_COLORCHOICE), isFluentIcon);
::EnableWindow(::GetDlgItem(_toolbarSubDlg.getHSelf(), IDC_TOOLBAR_GB_COLORIZATION), isFluentIcon);
}
return TRUE;
@ -299,38 +303,36 @@ intptr_t CALLBACK PreferenceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
NppParameters& nppParams = NppParameters::getInstance();
NppGUI& nppGUI = nppParams.getNppGUI();
auto& nppGUITbInfo = nppGUI._tbIconInfo;
const NppDarkMode::TbIconInfo toolbarIconInfo = NppDarkMode::getToolbarIconInfo(static_cast<bool>(wParam));
nppGUITbInfo = toolbarIconInfo;
nppGUI._toolBarStatus = static_cast<toolBarStatusType>(nppGUITbInfo._tbIconSet);
nppGUITbInfo = NppDarkMode::getToolbarIconInfo(static_cast<bool>(wParam));
const HWND hToolbarlSubDlg = _toolbarSubDlg.getHSelf();
auto checkOrUncheckBtn = [&hToolbarlSubDlg](int id, WPARAM check = BST_UNCHECKED) -> void
auto checkOrUncheckBtn = [&hToolbarlSubDlg](int id, bool check = false) -> void
{
::SendDlgItemMessage(hToolbarlSubDlg, id, BM_SETCHECK, check, 0);
::SendDlgItemMessage(hToolbarlSubDlg, id, BM_SETCHECK, check ? BST_CHECKED : BST_UNCHECKED, 0);
};
checkOrUncheckBtn(IDC_RADIO_SMALLICON, nppGUI._toolBarStatus == TB_SMALL ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_BIGICON, nppGUI._toolBarStatus == TB_LARGE ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_SMALLICON2, nppGUI._toolBarStatus == TB_SMALL2 ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_BIGICON2, nppGUI._toolBarStatus == TB_LARGE2 ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_STANDARD, nppGUI._toolBarStatus == TB_STANDARD ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_SMALLICON, nppGUITbInfo._tbIconSet == TB_SMALL);
checkOrUncheckBtn(IDC_RADIO_BIGICON, nppGUITbInfo._tbIconSet == TB_LARGE);
checkOrUncheckBtn(IDC_RADIO_SMALLICON2, nppGUITbInfo._tbIconSet == TB_SMALL2);
checkOrUncheckBtn(IDC_RADIO_BIGICON2, nppGUITbInfo._tbIconSet == TB_LARGE2);
checkOrUncheckBtn(IDC_RADIO_STANDARD, nppGUITbInfo._tbIconSet == TB_STANDARD);
checkOrUncheckBtn(IDC_RADIO_RED, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::red ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_GREEN, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::green ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_BLUE, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::blue ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_PURPLE, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::purple ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_CYAN, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::cyan ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_OLIVE, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::olive ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_YELLOW, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::yellow ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_ACCENTCOLOR, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::accent ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_CUSTOMCOLOR, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::custom ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_DEFAULTCOLOR, nppGUITbInfo._tbColor == NppDarkMode::FluentColor::defaultColor ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_RED, nppGUITbInfo._tbColor == FluentColor::red);
checkOrUncheckBtn(IDC_RADIO_GREEN, nppGUITbInfo._tbColor == FluentColor::green);
checkOrUncheckBtn(IDC_RADIO_BLUE, nppGUITbInfo._tbColor == FluentColor::blue);
checkOrUncheckBtn(IDC_RADIO_PURPLE, nppGUITbInfo._tbColor == FluentColor::purple);
checkOrUncheckBtn(IDC_RADIO_CYAN, nppGUITbInfo._tbColor == FluentColor::cyan);
checkOrUncheckBtn(IDC_RADIO_OLIVE, nppGUITbInfo._tbColor == FluentColor::olive);
checkOrUncheckBtn(IDC_RADIO_YELLOW, nppGUITbInfo._tbColor == FluentColor::yellow);
checkOrUncheckBtn(IDC_RADIO_ACCENTCOLOR, nppGUITbInfo._tbColor == FluentColor::accent);
checkOrUncheckBtn(IDC_RADIO_CUSTOMCOLOR, nppGUITbInfo._tbColor == FluentColor::custom);
checkOrUncheckBtn(IDC_RADIO_DEFAULTCOLOR, nppGUITbInfo._tbColor == FluentColor::defaultColor);
checkOrUncheckBtn(IDC_RADIO_COMPLETE, nppGUITbInfo._tbUseMono ? BST_CHECKED : BST_UNCHECKED);
checkOrUncheckBtn(IDC_RADIO_PARTIAL, nppGUITbInfo._tbUseMono ? BST_UNCHECKED : BST_CHECKED);
checkOrUncheckBtn(IDC_RADIO_COMPLETE, nppGUITbInfo._tbUseMono);
checkOrUncheckBtn(IDC_RADIO_PARTIAL, !nppGUITbInfo._tbUseMono);
::SendMessage(hToolbarlSubDlg, NPPM_INTERNAL_CHANGETOOLBARCOLORABLESTATE, 0, 0);
::SendMessage(hToolbarlSubDlg, NPPM_INTERNAL_CHANGETOOLBARCOLORABLESTATE, static_cast<WPARAM>(true), 0);
return TRUE;
}
@ -752,7 +754,6 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
{
case WM_INITDIALOG:
{
toolBarStatusType toolbarStatus = nppGUI._toolBarStatus;
auto& nppGUITbInfo = nppGUI._tbIconInfo;
::SendDlgItemMessage(_hSelf, IDC_CHECK_HIDE, BM_SETCHECK, nppGUI._toolbarShow ? BST_UNCHECKED : BST_CHECKED, 0);
@ -783,34 +784,34 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
ID2Check = 0;
switch (nppGUITbInfo._tbColor)
{
case NppDarkMode::FluentColor::custom:
case FluentColor::custom:
ID2Check = IDC_RADIO_CUSTOMCOLOR;
break;
case NppDarkMode::FluentColor::accent:
case FluentColor::accent:
ID2Check = IDC_RADIO_ACCENTCOLOR;
break;
case NppDarkMode::FluentColor::red:
case FluentColor::red:
ID2Check = IDC_RADIO_RED;
break;
case NppDarkMode::FluentColor::green:
case FluentColor::green:
ID2Check = IDC_RADIO_GREEN;
break;
case NppDarkMode::FluentColor::blue:
case FluentColor::blue:
ID2Check = IDC_RADIO_BLUE;
break;
case NppDarkMode::FluentColor::purple:
case FluentColor::purple:
ID2Check = IDC_RADIO_PURPLE;
break;
case NppDarkMode::FluentColor::cyan:
case FluentColor::cyan:
ID2Check = IDC_RADIO_CYAN;
break;
case NppDarkMode::FluentColor::olive:
case FluentColor::olive:
ID2Check = IDC_RADIO_OLIVE;
break;
case NppDarkMode::FluentColor::yellow:
case FluentColor::yellow:
ID2Check = IDC_RADIO_YELLOW;
break;
case NppDarkMode::FluentColor::defaultColor:
case FluentColor::defaultColor:
default:
ID2Check = IDC_RADIO_DEFAULTCOLOR;
}
@ -827,7 +828,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
_pIconColorPicker->display();
_pIconColorPicker->setColour(nppGUI._tbIconInfo._tbCustomColor);
if (toolbarStatus == TB_STANDARD)
if (nppGUITbInfo._tbIconSet == TB_STANDARD)
{
::SendMessage(_hSelf, NPPM_INTERNAL_CHANGETOOLBARCOLORABLESTATE, 0, 0);
}
@ -839,10 +840,9 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
{
bool enableColor = !isCheckedOrNot(IDC_RADIO_STANDARD);
::EnableWindow(::GetDlgItem(_hSelf, IDC_TOOLBAR_GB_COLORIZATION), enableColor);
::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_COMPLETE), enableColor);
::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_PARTIAL), enableColor);
::EnableWindow(::GetDlgItem(_hSelf, IDC_TOOLBAR_GB_COLORCHOICE), enableColor);
::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_RED), enableColor);
::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_GREEN), enableColor);
::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_BLUE), enableColor);
@ -856,11 +856,29 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
::EnableWindow(_pIconColorPicker->getHSelf(), enableColor);
const bool usePrevDarkMode = static_cast<bool>(wParam) ? !NppDarkMode::isEnabled() : NppDarkMode::isEnabled();
if (enableColor)
{
_pIconColorPicker->setColour(nppGUI._tbIconInfo._tbCustomColor);
_pIconColorPicker->redraw();
const auto& tbIconInfo = NppDarkMode::getToolbarIconInfo(usePrevDarkMode);
_pIconColorPicker->setColour(tbIconInfo._tbCustomColor);
}
else
{
COLORREF disabledColor = usePrevDarkMode ? NppDarkMode::getDlgBackgroundColor() : ::GetSysColor(COLOR_3DFACE);
_pIconColorPicker->setColour(disabledColor);
}
_pIconColorPicker->redraw();
if (NppDarkMode::isEnabled())
{
::EnableWindow(::GetDlgItem(_hSelf, IDC_TOOLBAR_GB_COLORCHOICE), enableColor);
::EnableWindow(::GetDlgItem(_hSelf, IDC_TOOLBAR_GB_COLORIZATION), enableColor);
redrawDlgItem(IDC_TOOLBAR_GB_COLORCHOICE);
redrawDlgItem(IDC_TOOLBAR_GB_COLORIZATION);
}
return TRUE;
}
@ -943,7 +961,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_CUSTOMCOLOR:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::custom;
FluentColor c = FluentColor::custom;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -953,7 +971,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_ACCENTCOLOR:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::accent;
FluentColor c = FluentColor::accent;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -963,7 +981,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_RED:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::red;
FluentColor c = FluentColor::red;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -973,7 +991,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_GREEN:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::green;
FluentColor c = FluentColor::green;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -983,7 +1001,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_BLUE:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::blue;
FluentColor c = FluentColor::blue;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -993,7 +1011,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_PURPLE:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::purple;
FluentColor c = FluentColor::purple;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -1003,7 +1021,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_CYAN:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::cyan;
FluentColor c = FluentColor::cyan;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -1013,7 +1031,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_OLIVE:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::olive;
FluentColor c = FluentColor::olive;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -1023,7 +1041,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_YELLOW:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::yellow;
FluentColor c = FluentColor::yellow;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -1033,10 +1051,9 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
case IDC_RADIO_DEFAULTCOLOR:
{
NppDarkMode::FluentColor c = NppDarkMode::FluentColor::defaultColor;
FluentColor c = FluentColor::defaultColor;
NppDarkMode::setToolbarFluentColor(c);
nppGUI._tbIconInfo._tbColor = c;
UINT msg = getToolbarIconSetMsg(nullptr);
::SendMessage(::GetParent(_hParent), msg, TRUE, 0);
return TRUE;
@ -1083,7 +1100,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
setChecked(IDC_RADIO_ACCENTCOLOR, false);
setChecked(IDC_RADIO_DEFAULTCOLOR, false);
NppDarkMode::FluentColor colorType = NppDarkMode::FluentColor::custom;
FluentColor colorType = FluentColor::custom;
NppDarkMode::setToolbarFluentColor(colorType);
nppGUI._tbIconInfo._tbColor = colorType;
UINT msg = getToolbarIconSetMsg(nullptr);
@ -1096,7 +1113,7 @@ intptr_t CALLBACK ToolbarSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
{
if (reinterpret_cast<HWND>(lParam) == _pIconColorPicker->getHSelf())
{
NppDarkMode::FluentColor colorType = NppDarkMode::FluentColor::custom;
FluentColor colorType = FluentColor::custom;
NppDarkMode::setToolbarFluentColor(colorType);
nppGUI._tbIconInfo._tbColor = colorType;

View File

@ -291,7 +291,7 @@ bool TreeView::setImageList(const std::vector<int>& imageIds, int imgSize)
int dpiImgSize = DPIManagerV2::scale(imgSize, _hParent);
NppParameters& nppParam = NppParameters::getInstance();
const bool useStdIcons = nppParam.getNppGUI()._toolBarStatus == TB_STANDARD;
const bool useStdIcons = nppParam.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD;
if (_hImaLst != nullptr)
{
@ -334,7 +334,7 @@ bool TreeView::setImageList(const std::vector<int>& imageIds, int imgSize)
std::vector<int> TreeView::getImageIds(std::vector<int> stdIds, std::vector<int> darkIds, std::vector<int> lightIds)
{
NppParameters& nppParam = NppParameters::getInstance();
const bool useStdIcons = nppParam.getNppGUI()._toolBarStatus == TB_STANDARD;
const bool useStdIcons = nppParam.getNppGUI()._tbIconInfo._tbIconSet == TB_STANDARD;
if (useStdIcons)
{
return stdIds;