From d5b5e5e1076658212f379e2ce1c2832579e657c0 Mon Sep 17 00:00:00 2001 From: ozone10 Date: Wed, 16 Apr 2025 18:47:20 +0200 Subject: [PATCH] Refactor fluent icon color feature code - fix visual glitches when toggling dark mode - make english names consistent Close #16435 --- PowerEditor/src/Notepad_plus.cpp | 72 +++--- PowerEditor/src/NppBigSwitch.cpp | 7 +- PowerEditor/src/NppDarkMode.cpp | 216 +----------------- PowerEditor/src/NppDarkMode.h | 54 +---- PowerEditor/src/Parameters.cpp | 76 ++++-- PowerEditor/src/Parameters.h | 55 ++++- .../src/ScintillaComponent/FindReplaceDlg.cpp | 16 +- .../WinControls/ImageListSet/ImageListSet.cpp | 205 ++++++++++++++++- .../WinControls/ImageListSet/ImageListSet.h | 4 +- .../WinControls/Preference/preferenceDlg.cpp | 125 +++++----- .../src/WinControls/TreeView/TreeView.cpp | 4 +- 11 files changed, 439 insertions(+), 395 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 5a1f3ffed..15fc3caf6 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -688,12 +688,9 @@ LRESULT Notepad_plus::init(HWND hwnd) //-- Tool Bar Section --// - - const NppDarkMode::TbIconInfo toolbarIconInfo = NppDarkMode::getToolbarIconInfo(); - nppGUI._tbIconInfo = toolbarIconInfo; - nppGUI._toolBarStatus = static_cast(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 & 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(nppGUITbInfo._tbIconSet); + nppGUITbInfo = NppDarkMode::getToolbarIconInfo(); - switch (state) + switch (nppGUITbInfo._tbIconSet) { case TB_SMALL: _toolBar.reduce(); diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp index cdd7d1e57..f9baa3c43 100644 --- a/PowerEditor/src/NppBigSwitch.cpp +++ b/PowerEditor/src/NppBigSwitch.cpp @@ -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(nppGUITbInfo._tbIconSet); + nppGUITbInfo = NppDarkMode::getToolbarIconInfo(); - switch (state) + switch (nppGUITbInfo._tbIconSet) { case TB_SMALL: _toolBar.reduce(); diff --git a/PowerEditor/src/NppDarkMode.cpp b/PowerEditor/src/NppDarkMode.cpp index 4ea02cd87..287022564 100644 --- a/PowerEditor/src/NppDarkMode.cpp +++ b/PowerEditor/src/NppDarkMode.cpp @@ -34,7 +34,6 @@ #ifdef __GNUC__ #include -#include #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(state2Set); else - g_advOptions._lightDefaults._tbIconInfo._tbIconSet = state2Set; + g_advOptions._lightDefaults._tbIconInfo._tbIconSet = static_cast(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>& colorMappings, int tolerance) - { - if (!*phIcon) - { - return false; - } - - HDC hdcScreen = nullptr; - HDC hdcBitmap = nullptr; - BITMAP bm{}; - ICONINFO ii{}; - HBITMAP hbmNew = nullptr; - std::unique_ptr 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(static_cast(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> 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); - } } diff --git a/PowerEditor/src/NppDarkMode.h b/PowerEditor/src/NppDarkMode.h index 18a99c3b1..5c6104c78 100644 --- a/PowerEditor/src/NppDarkMode.h +++ b/PowerEditor/src/NppDarkMode.h @@ -17,9 +17,11 @@ #pragma once #include -#include #include +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>& colorMappings, int tolerance = 3); - bool changeFluentIconColor(HICON* phIcon); } diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 00bc7a1af..0d50ef3db 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -4803,7 +4803,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) if (val) { auto& tbColor = _nppGUI._tbIconInfo._tbColor; - tbColor = static_cast(i); + tbColor = static_cast(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(NppDarkMode::FluentColor::maxValue) - 1; + constexpr int fluentColorMaxValue = static_cast(FluentColor::maxValue) - 1; + constexpr int tbStdIcoSet = static_cast(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(parseMinMaxAttribute(L"darkTbFluentColor", 0, fluentColorMaxValue)); + darkTbInfo._tbIconSet = static_cast(parseMinMaxAttribute(L"darkToolBarIconSet", static_cast(TB_SMALL), tbStdIcoSet)); + darkTbInfo._tbColor = static_cast(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(parseMinMaxAttribute(L"lightTbFluentColor", 0, fluentColorMaxValue)); + lightTbInfo._tbIconSet = static_cast(parseMinMaxAttribute(L"lightToolBarIconSet", tbStdIcoSet, tbStdIcoSet)); + lightTbInfo._tbColor = static_cast(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() // standard { 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"; + const wchar_t* pStr = (_nppGUI._toolbarShow) ? L"yes" : L"no"; GUIConfigElement->SetAttribute(L"visible", pStr); - GUIConfigElement->SetAttribute(L"fluentColor", static_cast(_nppGUI._tbIconInfo._tbColor)); - GUIConfigElement->SetAttribute(L"fluentCustomColor", _nppGUI._tbIconInfo._tbCustomColor); - pStr = (_nppGUI._tbIconInfo._tbUseMono) ? L"yes" : L"no"; + GUIConfigElement->SetAttribute(L"fluentColor", static_cast(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) - pStr = L"small"; - else if (_nppGUI._toolBarStatus == TB_LARGE) - pStr = L"large"; - else if (_nppGUI._toolBarStatus == TB_SMALL2) - pStr = L"small2"; - else if (_nppGUI._toolBarStatus == TB_LARGE2) - pStr = L"large2"; - else //if (_nppGUI._toolBarStatus == TB_STANDARD) - pStr = L"standard"; + switch (nppGUITbInfo._tbIconSet) + { + case TB_SMALL: + { + pStr = L"small"; + break; + } + + case TB_LARGE: + { + pStr = L"large"; + break; + } + + case TB_SMALL2: + { + pStr = L"small2"; + break; + } + + case TB_LARGE2: + { + pStr = L"large2"; + break; + } + + case TB_STANDARD: + default: + { + pStr = L"standard"; + break; + } + } GUIConfigElement->InsertEndChild(TiXmlText(pStr)); } diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index eabe6f48c..ba0614681 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -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; diff --git a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp index 76ecee919..68e3cc574 100644 --- a/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScintillaComponent/FindReplaceDlg.cpp @@ -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); diff --git a/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp index 6f811ed7d..030d56b42 100644 --- a/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp +++ b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp @@ -18,6 +18,7 @@ #include #include #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>& colorMappings, int tolerance) const +{ + if (!*phIcon) + { + return false; + } + + HDC hdcScreen = nullptr; + HDC hdcBitmap = nullptr; + BITMAP bm{}; + ICONINFO ii{}; + HBITMAP hbmNew = nullptr; + std::unique_ptr 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(static_cast(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> 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& moreCmds) { for (int i = 0 ; i < arraySize ; ++i) diff --git a/PowerEditor/src/WinControls/ImageListSet/ImageListSet.h b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.h index 4236aa666..ff1cec807 100644 --- a/PowerEditor/src/WinControls/ImageListSet/ImageListSet.h +++ b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.h @@ -50,6 +50,9 @@ private : int *_pIconIDArray = nullptr; int _iconIDArraySize = 0; int _iconSize = 0; + + bool changeFluentIconColor(HICON* phIcon, const std::vector>& colorMappings, int tolerance = 3) const; + bool changeFluentIconColor(HICON* phIcon) const; }; struct ToolBarButtonUnit @@ -158,4 +161,3 @@ private : std::vector _iconListVector; }; - diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp index 1c53136a7..7f0aafbbd 100644 --- a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp @@ -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(wParam)); - nppGUITbInfo = toolbarIconInfo; - nppGUI._toolBarStatus = static_cast(nppGUITbInfo._tbIconSet); + nppGUITbInfo = NppDarkMode::getToolbarIconInfo(static_cast(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(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(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(lParam) == _pIconColorPicker->getHSelf()) { - NppDarkMode::FluentColor colorType = NppDarkMode::FluentColor::custom; + FluentColor colorType = FluentColor::custom; NppDarkMode::setToolbarFluentColor(colorType); nppGUI._tbIconInfo._tbColor = colorType; diff --git a/PowerEditor/src/WinControls/TreeView/TreeView.cpp b/PowerEditor/src/WinControls/TreeView/TreeView.cpp index 52a8f2cb4..8a279e60f 100644 --- a/PowerEditor/src/WinControls/TreeView/TreeView.cpp +++ b/PowerEditor/src/WinControls/TreeView/TreeView.cpp @@ -291,7 +291,7 @@ bool TreeView::setImageList(const std::vector& 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& imageIds, int imgSize) std::vector TreeView::getImageIds(std::vector stdIds, std::vector darkIds, std::vector 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;