Edge Enhancement

Make changing edge color dynamic.
Apply color on docking panels caption, color button.
Add status bar separators.

Fix #10166, close #10167
This commit is contained in:
ozone10 2021-07-15 21:29:27 +02:00 committed by Don Ho
parent 93d91c3ee2
commit 33fa3b6198
6 changed files with 94 additions and 58 deletions

View File

@ -42,9 +42,9 @@ namespace NppDarkMode
void change(const Colors& colors) void change(const Colors& colors)
{ {
::DeleteObject(background); ::DeleteObject(background);
::DeleteObject(softerBackground); ::DeleteObject(softerBackground);
::DeleteObject(hotBackground); ::DeleteObject(hotBackground);
::DeleteObject(pureBackground); ::DeleteObject(pureBackground);
::DeleteObject(errorBackground); ::DeleteObject(errorBackground);
@ -56,6 +56,28 @@ namespace NppDarkMode
} }
}; };
struct Pens
{
HPEN edgePen = nullptr;
Pens(const Colors& colors)
: edgePen(::CreatePen(PS_SOLID, 1, colors.edge))
{}
~Pens()
{
::DeleteObject(edgePen); edgePen = nullptr;
}
void change(const Colors& colors)
{
::DeleteObject(edgePen);
edgePen = ::CreatePen(PS_SOLID, 1, colors.edge);
}
};
// black (default) // black (default)
static const Colors darkColors{ static const Colors darkColors{
HEXRGB(0x202020), // background HEXRGB(0x202020), // background
@ -172,16 +194,19 @@ namespace NppDarkMode
{ {
Colors _colors; Colors _colors;
Brushes _brushes; Brushes _brushes;
Pens _pens;
Theme(const Colors& colors) Theme(const Colors& colors)
: _colors(colors) : _colors(colors)
, _brushes(colors) , _brushes(colors)
, _pens(colors)
{} {}
void change(const Colors& colors) void change(const Colors& colors)
{ {
_colors = colors; _colors = colors;
_brushes.change(colors); _brushes.change(colors);
_pens.change(colors);
} }
}; };
@ -345,6 +370,8 @@ namespace NppDarkMode
HBRUSH getDarkerBackgroundBrush() { return getTheme()._brushes.pureBackground; } HBRUSH getDarkerBackgroundBrush() { return getTheme()._brushes.pureBackground; }
HBRUSH getErrorBackgroundBrush() { return getTheme()._brushes.errorBackground; } HBRUSH getErrorBackgroundBrush() { return getTheme()._brushes.errorBackground; }
HPEN getEdgePen() { return getTheme()._pens.edgePen; }
void setBackgroundColor(COLORREF c) void setBackgroundColor(COLORREF c)
{ {
Colors clrs = getTheme()._colors; Colors clrs = getTheme()._colors;
@ -1100,9 +1127,7 @@ namespace NppDarkMode
HDC hdc = BeginPaint(hWnd, &ps); HDC hdc = BeginPaint(hWnd, &ps);
FillRect(hdc, &ps.rcPaint, NppDarkMode::getBackgroundBrush()); FillRect(hdc, &ps.rcPaint, NppDarkMode::getBackgroundBrush());
static HPEN g_hpen = CreatePen(PS_SOLID, 1, NppDarkMode::getEdgeColor()); auto holdPen = static_cast<HPEN>(::SelectObject(hdc, NppDarkMode::getEdgePen()));
HPEN holdPen = (HPEN)SelectObject(hdc, g_hpen);
HRGN holdClip = CreateRectRgn(0, 0, 0, 0); HRGN holdClip = CreateRectRgn(0, 0, 0, 0);
if (1 != GetClipRgn(hdc, holdClip)) if (1 != GetClipRgn(hdc, holdClip))

View File

@ -81,6 +81,8 @@ namespace NppDarkMode
HBRUSH getHotBackgroundBrush(); HBRUSH getHotBackgroundBrush();
HBRUSH getErrorBackgroundBrush(); HBRUSH getErrorBackgroundBrush();
HPEN getEdgePen();
void setBackgroundColor(COLORREF c); void setBackgroundColor(COLORREF c);
void setSofterBackgroundColor(COLORREF c); void setSofterBackgroundColor(COLORREF c);
void setHotBackgroundColor(COLORREF c); void setHotBackgroundColor(COLORREF c);

View File

@ -13,13 +13,12 @@
// //
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>
#include "ColourPicker.h" #include "ColourPicker.h"
#include "ColourPopup.h" #include "ColourPopup.h"
#include "NppDarkMode.h"
void ColourPicker::init(HINSTANCE hInst, HWND parent) void ColourPicker::init(HINSTANCE hInst, HWND parent)
{ {
@ -60,7 +59,9 @@ void ColourPicker::drawBackground(HDC hDC)
getClientRect(rc); getClientRect(rc);
hbrush = ::CreateSolidBrush(_currentColour); hbrush = ::CreateSolidBrush(_currentColour);
HGDIOBJ oldObj = ::SelectObject(hDC, hbrush); HGDIOBJ oldObj = ::SelectObject(hDC, hbrush);
auto holdPen = static_cast<HPEN>(::SelectObject(hDC, NppDarkMode::getEdgePen()));
::Rectangle(hDC, 0, 0, rc.right, rc.bottom); ::Rectangle(hDC, 0, 0, rc.right, rc.bottom);
::SelectObject(hDC, holdPen);
::SelectObject(hDC, oldObj); ::SelectObject(hDC, oldObj);
//FillRect(hDC, &rc, hbrush); //FillRect(hDC, &rc, hbrush);
::DeleteObject(hbrush); ::DeleteObject(hbrush);

View File

@ -20,7 +20,6 @@
#include "SplitterContainer.h" #include "SplitterContainer.h"
#include "ToolTip.h" #include "ToolTip.h"
#include "Parameters.h" #include "Parameters.h"
#include "NppDarkMode.h"
#include "localization.h" #include "localization.h"
using namespace std; using namespace std;
@ -138,7 +137,7 @@ tTbData* DockingCont::createToolbar(tTbData data)
} }
// set attached child window // set attached child window
::SetParent(pTbData->hClient, ::GetDlgItem(_hSelf, IDC_CLIENT_TAB)); ::SetParent(pTbData->hClient, ::GetDlgItem(_hSelf, IDC_CLIENT_TAB));
// set names for captions and view toolbar // set names for captions and view toolbar
viewToolbar(pTbData); viewToolbar(pTbData);
@ -345,21 +344,21 @@ LRESULT DockingCont::runProcCaption(HWND hwnd, UINT Message, WPARAM wParam, LPAR
{ {
if (_isMouseClose == FALSE) if (_isMouseClose == FALSE)
{ {
// keep sure that button is still down and within caption // keep sure that button is still down and within caption
if ((wParam == MK_LBUTTON) && (isInRect(hwnd, pt.x, pt.y) == posCaption)) if ((wParam == MK_LBUTTON) && (isInRect(hwnd, pt.x, pt.y) == posCaption))
{ {
_dragFromTab = FALSE; _dragFromTab = FALSE;
NotifyParent(DMM_MOVE); NotifyParent(DMM_MOVE);
_isMouseDown = FALSE; _isMouseDown = FALSE;
} }
else else
{ {
_isMouseDown = FALSE; _isMouseDown = FALSE;
} }
} }
else else
{ {
BOOL isMouseOver = _isMouseOver; BOOL isMouseOver = _isMouseOver;
_isMouseOver = (isInRect(hwnd, pt.x, pt.y) == posClose ? TRUE : FALSE); _isMouseOver = (isInRect(hwnd, pt.x, pt.y) == posClose ? TRUE : FALSE);
// if state is changed draw new // if state is changed draw new
@ -456,7 +455,9 @@ void DockingCont::drawCaptionItem(DRAWITEMSTRUCT *pDrawItemStruct)
// begin with paint // begin with paint
::SetBkMode(hDc, TRANSPARENT); ::SetBkMode(hDc, TRANSPARENT);
if (NppDarkMode::isEnabled()) auto holdPen = static_cast<HPEN>(::SelectObject(hDc, NppDarkMode::isEnabled() ? NppDarkMode::getEdgePen() : hPen));
if (NppDarkMode::isEnabled())
{ {
bgbrush = ::CreateSolidBrush(_isActive ? NppDarkMode::getSofterBackgroundColor() : NppDarkMode::getBackgroundColor()); bgbrush = ::CreateSolidBrush(_isActive ? NppDarkMode::getSofterBackgroundColor() : NppDarkMode::getBackgroundColor());
SetTextColor(hDc, NppDarkMode::getTextColor()); SetTextColor(hDc, NppDarkMode::getTextColor());
@ -566,6 +567,7 @@ void DockingCont::drawCaptionItem(DRAWITEMSTRUCT *pDrawItemStruct)
::SelectObject(hDc, hOldFont); ::SelectObject(hDc, hOldFont);
::DeleteObject(hFont); ::DeleteObject(hFont);
} }
::SelectObject(hDc, holdPen);
::DeleteObject(hPen); ::DeleteObject(hPen);
::DeleteObject(bgbrush); ::DeleteObject(bgbrush);
@ -700,9 +702,7 @@ LRESULT DockingCont::runProcTab(HWND hwnd, UINT Message, WPARAM wParam, LPARAM l
UINT id = ::GetDlgCtrlID(hwnd); UINT id = ::GetDlgCtrlID(hwnd);
static HPEN g_hpen = CreatePen(PS_SOLID, 1, NppDarkMode::getEdgeColor()); auto holdPen = static_cast<HPEN>(::SelectObject(hdc, NppDarkMode::getEdgePen()));
HPEN holdPen = (HPEN)SelectObject(hdc, g_hpen);
HRGN holdClip = CreateRectRgn(0, 0, 0, 0); HRGN holdClip = CreateRectRgn(0, 0, 0, 0);
if (1 != GetClipRgn(hdc, holdClip)) if (1 != GetClipRgn(hdc, holdClip))

View File

@ -14,7 +14,6 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
#include <stdexcept> #include <stdexcept>
#include <windows.h> #include <windows.h>
#include <commctrl.h> #include <commctrl.h>
@ -29,15 +28,12 @@
//#define IDC_STATUSBAR 789 //#define IDC_STATUSBAR 789
enum enum
{ {
defaultPartWidth = 5, defaultPartWidth = 5,
}; };
StatusBar::~StatusBar() StatusBar::~StatusBar()
{ {
delete[] _lpParts; delete[] _lpParts;
@ -49,6 +45,7 @@ void StatusBar::init(HINSTANCE, HWND)
assert(false and "should never be called"); assert(false and "should never be called");
} }
struct StatusBarSubclassInfo struct StatusBarSubclassInfo
{ {
HTHEME hTheme = nullptr; HTHEME hTheme = nullptr;
@ -77,8 +74,10 @@ struct StatusBarSubclassInfo
} }
}; };
constexpr UINT_PTR g_statusBarSubclassID = 42; constexpr UINT_PTR g_statusBarSubclassID = 42;
LRESULT CALLBACK StatusBarSubclass(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) LRESULT CALLBACK StatusBarSubclass(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{ {
UNREFERENCED_PARAMETER(uIdSubclass); UNREFERENCED_PARAMETER(uIdSubclass);
@ -121,6 +120,8 @@ LRESULT CALLBACK StatusBarSubclass(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
PAINTSTRUCT ps; PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps); HDC hdc = BeginPaint(hWnd, &ps);
auto holdPen = static_cast<HPEN>(::SelectObject(hdc, NppDarkMode::getEdgePen()));
HFONT holdFont = (HFONT)::SelectObject(hdc, NppParameters::getInstance().getDefaultUIFont()); HFONT holdFont = (HFONT)::SelectObject(hdc, NppParameters::getInstance().getDefaultUIFont());
RECT rcClient; RECT rcClient;
@ -140,6 +141,15 @@ LRESULT CALLBACK StatusBarSubclass(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
continue; continue;
} }
if (nParts > 2) //to not apply on status bar in find dialog
{
POINT edges[] = {
{rcPart.right - 2, rcPart.top + 1},
{rcPart.right - 2, rcPart.bottom - 3}
};
Polyline(hdc, edges, _countof(edges));
}
RECT rcDivider = { rcPart.right - borders.vertical, rcPart.top, rcPart.right, rcPart.bottom }; RECT rcDivider = { rcPart.right - borders.vertical, rcPart.top, rcPart.right, rcPart.bottom };
DWORD cchText = 0; DWORD cchText = 0;
@ -198,6 +208,7 @@ LRESULT CALLBACK StatusBarSubclass(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
} }
::SelectObject(hdc, holdFont); ::SelectObject(hdc, holdFont);
::SelectObject(hdc, holdPen);
EndPaint(hWnd, &ps); EndPaint(hWnd, &ps);
return FALSE; return FALSE;
@ -214,10 +225,11 @@ LRESULT CALLBACK StatusBarSubclass(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
return DefSubclassProc(hWnd, uMsg, wParam, lParam); return DefSubclassProc(hWnd, uMsg, wParam, lParam);
} }
void StatusBar::init(HINSTANCE hInst, HWND hPere, int nbParts) void StatusBar::init(HINSTANCE hInst, HWND hPere, int nbParts)
{ {
Window::init(hInst, hPere); Window::init(hInst, hPere);
InitCommonControls(); InitCommonControls();
// _hSelf = CreateStatusWindow(WS_CHILD | WS_CLIPSIBLINGS, NULL, _hParent, IDC_STATUSBAR); // _hSelf = CreateStatusWindow(WS_CHILD | WS_CLIPSIBLINGS, NULL, _hParent, IDC_STATUSBAR);
_hSelf = ::CreateWindowEx( _hSelf = ::CreateWindowEx(
@ -240,7 +252,7 @@ void StatusBar::init(HINSTANCE hInst, HWND hPere, int nbParts)
if (nbParts > 0) if (nbParts > 0)
_partWidthArray.resize(nbParts, defaultPartWidth); _partWidthArray.resize(nbParts, defaultPartWidth);
// Allocate an array for holding the right edge coordinates. // Allocate an array for holding the right edge coordinates.
if (_partWidthArray.size()) if (_partWidthArray.size())
_lpParts = new int[_partWidthArray.size()]; _lpParts = new int[_partWidthArray.size()];
@ -285,17 +297,17 @@ int StatusBar::getHeight() const
void StatusBar::adjustParts(int clientWidth) void StatusBar::adjustParts(int clientWidth)
{ {
// Calculate the right edge coordinate for each part, and // Calculate the right edge coordinate for each part, and
// copy the coordinates to the array. // copy the coordinates to the array.
int nWidth = std::max<int>(clientWidth - 20, 0); int nWidth = std::max<int>(clientWidth - 20, 0);
for (int i = static_cast<int>(_partWidthArray.size()) - 1; i >= 0; i--) for (int i = static_cast<int>(_partWidthArray.size()) - 1; i >= 0; i--)
{ {
_lpParts[i] = nWidth; _lpParts[i] = nWidth;
nWidth -= _partWidthArray[i]; nWidth -= _partWidthArray[i];
} }
// Tell the status bar to create the window parts. // Tell the status bar to create the window parts.
::SendMessage(_hSelf, SB_SETPARTS, _partWidthArray.size(), reinterpret_cast<LPARAM>(_lpParts)); ::SendMessage(_hSelf, SB_SETPARTS, _partWidthArray.size(), reinterpret_cast<LPARAM>(_lpParts));
} }

View File

@ -14,8 +14,6 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
#include <stdexcept> #include <stdexcept>
#include "TabBar.h" #include "TabBar.h"
#include "Parameters.h" #include "Parameters.h"
@ -58,7 +56,7 @@ void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLin
int multiLine = isMultiLine ? TCS_MULTILINE : 0; int multiLine = isMultiLine ? TCS_MULTILINE : 0;
int style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE |\ int style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE |\
TCS_FOCUSNEVER | TCS_TABS | WS_TABSTOP | vertical | multiLine; TCS_FOCUSNEVER | TCS_TABS | WS_TABSTOP | vertical | multiLine;
_hSelf = ::CreateWindowEx( _hSelf = ::CreateWindowEx(
0, 0,
@ -127,12 +125,12 @@ void TabBar::setFont(const TCHAR *fontName, int fontSize)
::DeleteObject(_hFont); ::DeleteObject(_hFont);
_hFont = ::CreateFont( fontSize, 0, _hFont = ::CreateFont( fontSize, 0,
(_isVertical) ? 900:0, (_isVertical) ? 900:0,
(_isVertical) ? 900:0, (_isVertical) ? 900:0,
FW_NORMAL, FW_NORMAL,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
fontName); fontName);
if (_hFont) if (_hFont)
::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast<WPARAM>(_hFont), 0); ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast<WPARAM>(_hFont), 0);
} }
@ -606,20 +604,20 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara
} }
} }
::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam);
int currentTabOn = static_cast<int32_t>(::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0)); int currentTabOn = static_cast<int32_t>(::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0));
if (wParam == 2) if (wParam == 2)
return TRUE; return TRUE;
if (_doDragNDrop) if (_doDragNDrop)
{ {
_mightBeDragging = true; _mightBeDragging = true;
} }
notify(NM_CLICK, currentTabOn); notify(NM_CLICK, currentTabOn);
return TRUE; return TRUE;
} }
case WM_RBUTTONDOWN : //rightclick selects tab aswell case WM_RBUTTONDOWN : //rightclick selects tab aswell
@ -673,13 +671,13 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara
if (_isDragging) if (_isDragging)
{ {
exchangeItemData(p); exchangeItemData(p);
// Get cursor position of "Screen" // Get cursor position of "Screen"
// For using the function "WindowFromPoint" afterward!!! // For using the function "WindowFromPoint" afterward!!!
::GetCursorPos(&_draggingPoint); ::GetCursorPos(&_draggingPoint);
draggingCursor(_draggingPoint); draggingCursor(_draggingPoint);
return TRUE; return TRUE;
} }
else else
{ {
@ -898,9 +896,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara
UINT id = ::GetDlgCtrlID(hwnd); UINT id = ::GetDlgCtrlID(hwnd);
static HPEN g_hpen = CreatePen(PS_SOLID, 1, NppDarkMode::getEdgeColor()); auto holdPen = static_cast<HPEN>(::SelectObject(hdc, NppDarkMode::getEdgePen()));
HPEN holdPen = (HPEN)SelectObject(hdc, g_hpen);
HRGN holdClip = CreateRectRgn(0, 0, 0, 0); HRGN holdClip = CreateRectRgn(0, 0, 0, 0);
if (1 != GetClipRgn(hdc, holdClip)) if (1 != GetClipRgn(hdc, holdClip))
@ -1276,8 +1272,8 @@ void TabBarPlus::draggingCursor(POINT screenPoint)
} }
else if (isPointInParentZone(screenPoint)) else if (isPointInParentZone(screenPoint))
::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_INTERDIT_TAB))); ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_INTERDIT_TAB)));
else // drag out of application else // drag out of application
::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_OUT_TAB))); ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_OUT_TAB)));
} }
} }