mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-07-24 22:34:54 +02:00
parent
233c697183
commit
42d863dd9f
@ -404,6 +404,12 @@ The comments are here for explanation, it's not necessary to translate them.
|
|||||||
<Item CMID="21" name="Open in Default Viewer"/>
|
<Item CMID="21" name="Open in Default Viewer"/>
|
||||||
<Item CMID="22" name="Close All Unchanged"/>
|
<Item CMID="22" name="Close All Unchanged"/>
|
||||||
<Item CMID="23" name="Open Containing Folder as Workspace"/>
|
<Item CMID="23" name="Open Containing Folder as Workspace"/>
|
||||||
|
<Item CMID="24" name="Apply Color 1"/>
|
||||||
|
<Item CMID="25" name="Apply Color 2"/>
|
||||||
|
<Item CMID="26" name="Apply Color 3"/>
|
||||||
|
<Item CMID="27" name="Apply Color 4"/>
|
||||||
|
<Item CMID="28" name="Apply Color 5"/>
|
||||||
|
<Item CMID="29" name="Remove Color"/>
|
||||||
</TabBar>
|
</TabBar>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
@ -649,6 +655,12 @@ The comments are here for explanation, it's not necessary to translate them.
|
|||||||
<Item id="44107" name="Switch to Folder as Workspace"/>
|
<Item id="44107" name="Switch to Folder as Workspace"/>
|
||||||
<Item id="44109" name="Switch to Document List"/>
|
<Item id="44109" name="Switch to Document List"/>
|
||||||
<Item id="44108" name="Switch to Function List"/>
|
<Item id="44108" name="Switch to Function List"/>
|
||||||
|
<Item id="44110" name="Remove Tab Colour"/>
|
||||||
|
<Item id="44111" name="Apply Tab Colour 1"/>
|
||||||
|
<Item id="44112" name="Apply Tab Colour 2"/>
|
||||||
|
<Item id="44113" name="Apply Tab Colour 3"/>
|
||||||
|
<Item id="44114" name="Apply Tab Colour 4"/>
|
||||||
|
<Item id="44115" name="Apply Tab Colour 5"/>
|
||||||
<Item id="11002" name="Sort By Name A to Z"/>
|
<Item id="11002" name="Sort By Name A to Z"/>
|
||||||
<Item id="11003" name="Sort By Name Z to A"/>
|
<Item id="11003" name="Sort By Name Z to A"/>
|
||||||
<Item id="11004" name="Sort By Path A to Z"/>
|
<Item id="11004" name="Sort By Path A to Z"/>
|
||||||
|
@ -2300,30 +2300,8 @@ void Notepad_plus::setupColorSampleBitmapsOnMainMenuItems()
|
|||||||
const Style * pStyle = NppParameters::getInstance().getMiscStylerArray().findByID(bitmapOnStyleMenuItemsInfo[j].styleIndic);
|
const Style * pStyle = NppParameters::getInstance().getMiscStylerArray().findByID(bitmapOnStyleMenuItemsInfo[j].styleIndic);
|
||||||
if (pStyle)
|
if (pStyle)
|
||||||
{
|
{
|
||||||
|
HBITMAP hNewBitmap = generateSolidColourMenuItemIcon(pStyle->_bgColor);
|
||||||
|
|
||||||
HDC hDC = GetDC(NULL);
|
|
||||||
const int bitmapXYsize = 16;
|
|
||||||
HBITMAP hNewBitmap = CreateCompatibleBitmap(hDC, bitmapXYsize, bitmapXYsize);
|
|
||||||
HDC hDCn = CreateCompatibleDC(hDC);
|
|
||||||
HBITMAP hOldBitmap = static_cast<HBITMAP>(SelectObject(hDCn, hNewBitmap));
|
|
||||||
RECT rc = { 0, 0, bitmapXYsize, bitmapXYsize };
|
|
||||||
|
|
||||||
// paint full-size black square
|
|
||||||
HBRUSH hBlackBrush = CreateSolidBrush(RGB(0,0,0));
|
|
||||||
FillRect(hDCn, &rc, hBlackBrush);
|
|
||||||
DeleteObject(hBlackBrush);
|
|
||||||
|
|
||||||
// overpaint a slightly smaller colored square
|
|
||||||
rc.left = rc.top = 1;
|
|
||||||
rc.right = rc.bottom = bitmapXYsize - 1;
|
|
||||||
HBRUSH hColorBrush = CreateSolidBrush(pStyle->_bgColor);
|
|
||||||
FillRect(hDCn, &rc, hColorBrush);
|
|
||||||
DeleteObject(hColorBrush);
|
|
||||||
|
|
||||||
// restore old bitmap so we can delete it to avoid leak
|
|
||||||
SelectObject(hDCn, hOldBitmap);
|
|
||||||
DeleteDC(hDCn);
|
|
||||||
|
|
||||||
SetMenuItemBitmaps(_mainMenuHandle, bitmapOnStyleMenuItemsInfo[j].firstOfThisColorMenuId, MF_BYCOMMAND, hNewBitmap, hNewBitmap);
|
SetMenuItemBitmaps(_mainMenuHandle, bitmapOnStyleMenuItemsInfo[j].firstOfThisColorMenuId, MF_BYCOMMAND, hNewBitmap, hNewBitmap);
|
||||||
for (int relatedMenuId : bitmapOnStyleMenuItemsInfo[j].sameColorMenuIds)
|
for (int relatedMenuId : bitmapOnStyleMenuItemsInfo[j].sameColorMenuIds)
|
||||||
{
|
{
|
||||||
@ -2331,6 +2309,14 @@ void Notepad_plus::setupColorSampleBitmapsOnMainMenuItems()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adds tab colour icons
|
||||||
|
for (int i = 0; i < 5; ++i)
|
||||||
|
{
|
||||||
|
COLORREF colour = NppDarkMode::getIndividualTabColour(i, NppDarkMode::isDarkMenuEnabled(), true);
|
||||||
|
HBITMAP hBitmap = generateSolidColourMenuItemIcon(colour);
|
||||||
|
SetMenuItemBitmaps(_mainMenuHandle, IDM_VIEW_TAB_COLOUR_1 + i, MF_BYCOMMAND, hBitmap, hBitmap);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool doCheck(HMENU mainHandle, int id)
|
bool doCheck(HMENU mainHandle, int id)
|
||||||
@ -5780,6 +5766,7 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session, bool includUntitledD
|
|||||||
sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getUserReadOnly(), buf->getPosition(editView), buf->getBackupFileName().c_str(), buf->getLastModifiedTimestamp(), buf->getMapPosition());
|
sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getUserReadOnly(), buf->getPosition(editView), buf->getBackupFileName().c_str(), buf->getLastModifiedTimestamp(), buf->getMapPosition());
|
||||||
|
|
||||||
sfi._isMonitoring = buf->isMonitoringOn();
|
sfi._isMonitoring = buf->isMonitoringOn();
|
||||||
|
sfi._individualTabColour = docTab[0]->getIndividualTabColour(static_cast<int>(i));
|
||||||
|
|
||||||
_invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
|
_invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
|
||||||
size_t maxLine = static_cast<size_t>(_invisibleEditView.execute(SCI_GETLINECOUNT));
|
size_t maxLine = static_cast<size_t>(_invisibleEditView.execute(SCI_GETLINECOUNT));
|
||||||
@ -8225,3 +8212,31 @@ void Notepad_plus::updateCommandShortcuts()
|
|||||||
csc.setName(menuName.c_str(), shortcutName.c_str());
|
csc.setName(menuName.c_str(), shortcutName.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HBITMAP Notepad_plus::generateSolidColourMenuItemIcon(COLORREF colour)
|
||||||
|
{
|
||||||
|
HDC hDC = GetDC(NULL);
|
||||||
|
const int bitmapXYsize = 16;
|
||||||
|
HBITMAP hNewBitmap = CreateCompatibleBitmap(hDC, bitmapXYsize, bitmapXYsize);
|
||||||
|
HDC hDCn = CreateCompatibleDC(hDC);
|
||||||
|
HBITMAP hOldBitmap = static_cast<HBITMAP>(SelectObject(hDCn, hNewBitmap));
|
||||||
|
RECT rc = { 0, 0, bitmapXYsize, bitmapXYsize };
|
||||||
|
|
||||||
|
// paint full-size black square
|
||||||
|
HBRUSH hBlackBrush = CreateSolidBrush(RGB(0,0,0));
|
||||||
|
FillRect(hDCn, &rc, hBlackBrush);
|
||||||
|
DeleteObject(hBlackBrush);
|
||||||
|
|
||||||
|
// overpaint a slightly smaller colored square
|
||||||
|
rc.left = rc.top = 1;
|
||||||
|
rc.right = rc.bottom = bitmapXYsize - 1;
|
||||||
|
HBRUSH hColorBrush = CreateSolidBrush(colour);
|
||||||
|
FillRect(hDCn, &rc, hColorBrush);
|
||||||
|
DeleteObject(hColorBrush);
|
||||||
|
|
||||||
|
// restore old bitmap so we can delete it to avoid leak
|
||||||
|
SelectObject(hDCn, hOldBitmap);
|
||||||
|
DeleteDC(hDCn);
|
||||||
|
|
||||||
|
return hNewBitmap;
|
||||||
|
}
|
||||||
|
@ -638,4 +638,6 @@ private:
|
|||||||
void monitoringStartOrStopAndUpdateUI(Buffer* pBuf, bool isStarting);
|
void monitoringStartOrStopAndUpdateUI(Buffer* pBuf, bool isStarting);
|
||||||
void createMonitoringThread(Buffer* pBuf);
|
void createMonitoringThread(Buffer* pBuf);
|
||||||
void updateCommandShortcuts();
|
void updateCommandShortcuts();
|
||||||
|
|
||||||
|
HBITMAP generateSolidColourMenuItemIcon(COLORREF colour);
|
||||||
};
|
};
|
||||||
|
@ -705,6 +705,13 @@ BEGIN
|
|||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "Move Tab Forward", IDM_VIEW_TAB_MOVEFORWARD
|
MENUITEM "Move Tab Forward", IDM_VIEW_TAB_MOVEFORWARD
|
||||||
MENUITEM "Move Tab Backward", IDM_VIEW_TAB_MOVEBACKWARD
|
MENUITEM "Move Tab Backward", IDM_VIEW_TAB_MOVEBACKWARD
|
||||||
|
MENUITEM SEPARATOR
|
||||||
|
MENUITEM "Apply Color 1", IDM_VIEW_TAB_COLOUR_1
|
||||||
|
MENUITEM "Apply Color 2", IDM_VIEW_TAB_COLOUR_2
|
||||||
|
MENUITEM "Apply Color 3", IDM_VIEW_TAB_COLOUR_3
|
||||||
|
MENUITEM "Apply Color 4", IDM_VIEW_TAB_COLOUR_4
|
||||||
|
MENUITEM "Apply Color 5", IDM_VIEW_TAB_COLOUR_5
|
||||||
|
MENUITEM "Remove Color", IDM_VIEW_TAB_COLOUR_NONE
|
||||||
END
|
END
|
||||||
MENUITEM "Word wrap", IDM_VIEW_WRAP
|
MENUITEM "Word wrap", IDM_VIEW_WRAP
|
||||||
MENUITEM "Focus on Another View", IDM_VIEW_SWITCHTO_OTHER_VIEW
|
MENUITEM "Focus on Another View", IDM_VIEW_SWITCHTO_OTHER_VIEW
|
||||||
|
@ -977,6 +977,21 @@ void Notepad_plus::command(int id)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IDM_VIEW_TAB_COLOUR_NONE:
|
||||||
|
case IDM_VIEW_TAB_COLOUR_1:
|
||||||
|
case IDM_VIEW_TAB_COLOUR_2:
|
||||||
|
case IDM_VIEW_TAB_COLOUR_3:
|
||||||
|
case IDM_VIEW_TAB_COLOUR_4:
|
||||||
|
case IDM_VIEW_TAB_COLOUR_5:
|
||||||
|
{
|
||||||
|
const int color_id = (id - IDM_VIEW_TAB_COLOUR_NONE) - 1;
|
||||||
|
const auto current_index = _pDocTab->getCurrentTabIndex();
|
||||||
|
BufferID buffer_id = _pDocTab->getBufferByIndex(current_index);
|
||||||
|
_pDocTab->setIndividualTabColour(buffer_id, color_id);
|
||||||
|
::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case IDM_VIEW_TAB1:
|
case IDM_VIEW_TAB1:
|
||||||
case IDM_VIEW_TAB2:
|
case IDM_VIEW_TAB2:
|
||||||
case IDM_VIEW_TAB3:
|
case IDM_VIEW_TAB3:
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
|
|
||||||
#include <Shlwapi.h>
|
#include <Shlwapi.h>
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#define WINAPI_LAMBDA WINAPI
|
#define WINAPI_LAMBDA WINAPI
|
||||||
@ -2852,4 +2854,69 @@ namespace NppDarkMode
|
|||||||
}
|
}
|
||||||
return static_cast<INT_PTR>(NppDarkMode::onCtlColor(hdc));
|
return static_cast<INT_PTR>(NppDarkMode::onCtlColor(hdc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct HLSColour
|
||||||
|
{
|
||||||
|
WORD _hue;
|
||||||
|
WORD _lightness;
|
||||||
|
WORD _saturation;
|
||||||
|
|
||||||
|
COLORREF toRGB() const { return ColorHLSToRGB(_hue, _lightness, _saturation); }
|
||||||
|
};
|
||||||
|
|
||||||
|
using IndividualTabColours = std::array<HLSColour, 5>;
|
||||||
|
|
||||||
|
static constexpr IndividualTabColours individualTabHuesFor_Dark { { HLSColour{0, 40, 60}, HLSColour{70, 40, 60}, HLSColour{144, 40, 60}, HLSColour{13, 40, 60}, HLSColour{195, 40, 60} } };
|
||||||
|
static constexpr IndividualTabColours individualTabHuesFor_DarkRed { { HLSColour{0, 60, 60}, HLSColour{70, 50, 60}, HLSColour{144, 50, 60}, HLSColour{13, 50, 60}, HLSColour{195, 50, 60} } };
|
||||||
|
static constexpr IndividualTabColours individualTabHuesFor_DarkGreen { { HLSColour{0, 50, 60}, HLSColour{70, 50, 60}, HLSColour{144, 50, 60}, HLSColour{13, 50, 60}, HLSColour{195, 50, 60} } };
|
||||||
|
static constexpr IndividualTabColours individualTabHuesFor_DarkBlue { { HLSColour{0, 50, 60}, HLSColour{70, 50, 60}, HLSColour{144, 50, 60}, HLSColour{13, 50, 60}, HLSColour{195, 50, 60} } };
|
||||||
|
static constexpr IndividualTabColours individualTabHuesFor_DarkPurple{ { HLSColour{0, 50, 60}, HLSColour{70, 50, 60}, HLSColour{144, 50, 60}, HLSColour{13, 50, 60}, HLSColour{195, 60, 60} } };
|
||||||
|
static constexpr IndividualTabColours individualTabHuesFor_DarkCyan { { HLSColour{0, 60, 60}, HLSColour{70, 60, 60}, HLSColour{144, 70, 60}, HLSColour{13, 60, 60}, HLSColour{195, 60, 60} } };
|
||||||
|
static constexpr IndividualTabColours individualTabHuesFor_DarkOlive { { HLSColour{0, 60, 60}, HLSColour{70, 60, 60}, HLSColour{144, 60, 60}, HLSColour{13, 60, 60}, HLSColour{195, 60, 60} } };
|
||||||
|
|
||||||
|
static const IndividualTabColours individualTabHues { { HLSColour{0, 210, 150}, HLSColour{70, 210, 150}, HLSColour{144, 210, 150}, HLSColour{13, 210, 150}, HLSColour{195, 210, 150} } };
|
||||||
|
|
||||||
|
const IndividualTabColours& getIndividualThemeDependantColours()
|
||||||
|
{
|
||||||
|
switch (g_colorToneChoice)
|
||||||
|
{
|
||||||
|
case redTone: return individualTabHuesFor_DarkRed;
|
||||||
|
case greenTone: return individualTabHuesFor_DarkGreen;
|
||||||
|
case blueTone: return individualTabHuesFor_DarkBlue;
|
||||||
|
case purpleTone: return individualTabHuesFor_DarkPurple;
|
||||||
|
case cyanTone: return individualTabHuesFor_DarkCyan;
|
||||||
|
case oliveTone: return individualTabHuesFor_DarkOlive;
|
||||||
|
default: return individualTabHuesFor_Dark;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
COLORREF getIndividualTabColour(int colourIndex, bool themeDependant, bool saturated)
|
||||||
|
{
|
||||||
|
if (colourIndex < 0 || colourIndex > 4) return {};
|
||||||
|
|
||||||
|
HLSColour result;
|
||||||
|
if (themeDependant)
|
||||||
|
{
|
||||||
|
result = getIndividualThemeDependantColours()[colourIndex];
|
||||||
|
|
||||||
|
if (saturated)
|
||||||
|
{
|
||||||
|
result._lightness = 146;
|
||||||
|
result._saturation = min(240, result._saturation + 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = individualTabHues[colourIndex];
|
||||||
|
|
||||||
|
if (saturated)
|
||||||
|
{
|
||||||
|
result._lightness = 140;
|
||||||
|
result._saturation = min(240, result._saturation + 30);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toRGB();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -133,6 +133,8 @@ namespace NppDarkMode
|
|||||||
HPEN getHotEdgePen();
|
HPEN getHotEdgePen();
|
||||||
HPEN getDisabledEdgePen();
|
HPEN getDisabledEdgePen();
|
||||||
|
|
||||||
|
COLORREF getIndividualTabColour(int colourIndex, bool themeDependant, bool saturated);
|
||||||
|
|
||||||
void setBackgroundColor(COLORREF c);
|
void setBackgroundColor(COLORREF c);
|
||||||
void setSofterBackgroundColor(COLORREF c);
|
void setSofterBackgroundColor(COLORREF c);
|
||||||
void setHotBackgroundColor(COLORREF c);
|
void setHotBackgroundColor(COLORREF c);
|
||||||
|
@ -2105,6 +2105,8 @@ bool Notepad_plus::loadSession(Session & session, bool isSnapshotMode, bool shou
|
|||||||
if (isSnapshotMode && session._mainViewFiles[i]._backupFilePath != TEXT("") && PathFileExists(session._mainViewFiles[i]._backupFilePath.c_str()))
|
if (isSnapshotMode && session._mainViewFiles[i]._backupFilePath != TEXT("") && PathFileExists(session._mainViewFiles[i]._backupFilePath.c_str()))
|
||||||
buf->setDirty(true);
|
buf->setDirty(true);
|
||||||
|
|
||||||
|
_mainDocTab.setIndividualTabColour(lastOpened, session._mainViewFiles[i]._individualTabColour);
|
||||||
|
|
||||||
//Force in the document so we can add the markers
|
//Force in the document so we can add the markers
|
||||||
//Don't use default methods because of performance
|
//Don't use default methods because of performance
|
||||||
Document prevDoc = _mainEditView.execute(SCI_GETDOCPOINTER);
|
Document prevDoc = _mainEditView.execute(SCI_GETDOCPOINTER);
|
||||||
|
@ -539,6 +539,13 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||||||
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_RELOAD, TEXT("Reload")));
|
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_RELOAD, TEXT("Reload")));
|
||||||
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, TEXT("Print")));
|
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, TEXT("Print")));
|
||||||
itemUnitArray.push_back(MenuItemUnit(0, NULL));
|
itemUnitArray.push_back(MenuItemUnit(0, NULL));
|
||||||
|
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_1, TEXT("Apply Color 1")));
|
||||||
|
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_2, TEXT("Apply Color 2")));
|
||||||
|
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_3, TEXT("Apply Color 3")));
|
||||||
|
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_4, TEXT("Apply Color 4")));
|
||||||
|
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_5, TEXT("Apply Color 5")));
|
||||||
|
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_NONE, TEXT("Remove Color")));
|
||||||
|
itemUnitArray.push_back(MenuItemUnit(0, NULL));
|
||||||
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_FOLDER, TEXT("Open Containing Folder in Explorer")));
|
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_FOLDER, TEXT("Open Containing Folder in Explorer")));
|
||||||
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_CMD, TEXT("Open Containing Folder in cmd")));
|
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_CMD, TEXT("Open Containing Folder in cmd")));
|
||||||
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CONTAININGFOLDERASWORKSPACE, TEXT("Open Containing Folder as Workspace")));
|
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CONTAININGFOLDERASWORKSPACE, TEXT("Open Containing Folder as Workspace")));
|
||||||
@ -562,6 +569,14 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||||||
_nativeLangSpeaker.changeLangTabContextMenu(_tabPopupMenu.getMenuHandle());
|
_nativeLangSpeaker.changeLangTabContextMenu(_tabPopupMenu.getMenuHandle());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adds colour icons
|
||||||
|
for (int i = 0; i < 5; ++i)
|
||||||
|
{
|
||||||
|
COLORREF colour = NppDarkMode::getIndividualTabColour(i, NppDarkMode::isDarkMenuEnabled(), true);
|
||||||
|
HBITMAP hBitmap = generateSolidColourMenuItemIcon(colour);
|
||||||
|
SetMenuItemBitmaps(_tabPopupMenu.getMenuHandle(), IDM_VIEW_TAB_COLOUR_1 + i, MF_BYCOMMAND, hBitmap, hBitmap);
|
||||||
|
}
|
||||||
|
|
||||||
bool isEnable = ((::GetMenuState(_mainMenuHandle, IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0);
|
bool isEnable = ((::GetMenuState(_mainMenuHandle, IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0);
|
||||||
_tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable);
|
_tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable);
|
||||||
|
|
||||||
|
@ -321,6 +321,12 @@ static const WinMenuKeyDefinition winKeyDefs[] =
|
|||||||
{ VK_NULL, IDM_VIEW_SWITCHTO_FILEBROWSER, false, false, false, TEXT("Switch to Folder as Workspace") },
|
{ VK_NULL, IDM_VIEW_SWITCHTO_FILEBROWSER, false, false, false, TEXT("Switch to Folder as Workspace") },
|
||||||
{ VK_NULL, IDM_VIEW_SWITCHTO_FUNC_LIST, false, false, false, TEXT("Switch to Function List") },
|
{ VK_NULL, IDM_VIEW_SWITCHTO_FUNC_LIST, false, false, false, TEXT("Switch to Function List") },
|
||||||
{ VK_NULL, IDM_VIEW_SWITCHTO_DOCLIST, false, false, false, TEXT("Switch to Document List") },
|
{ VK_NULL, IDM_VIEW_SWITCHTO_DOCLIST, false, false, false, TEXT("Switch to Document List") },
|
||||||
|
{ VK_NULL, IDM_VIEW_TAB_COLOUR_NONE, false, false, false, TEXT("Remove Tab Colour") },
|
||||||
|
{ VK_NULL, IDM_VIEW_TAB_COLOUR_1, false, false, false, TEXT("Apply Tab Colour 1") },
|
||||||
|
{ VK_NULL, IDM_VIEW_TAB_COLOUR_2, false, false, false, TEXT("Apply Tab Colour 2") },
|
||||||
|
{ VK_NULL, IDM_VIEW_TAB_COLOUR_3, false, false, false, TEXT("Apply Tab Colour 3") },
|
||||||
|
{ VK_NULL, IDM_VIEW_TAB_COLOUR_4, false, false, false, TEXT("Apply Tab Colour 4") },
|
||||||
|
{ VK_NULL, IDM_VIEW_TAB_COLOUR_5, false, false, false, TEXT("Apply Tab Colour 5") },
|
||||||
{ VK_NULL, IDM_VIEW_SYNSCROLLV, false, false, false, nullptr },
|
{ VK_NULL, IDM_VIEW_SYNSCROLLV, false, false, false, nullptr },
|
||||||
{ VK_NULL, IDM_VIEW_SYNSCROLLH, false, false, false, nullptr },
|
{ VK_NULL, IDM_VIEW_SYNSCROLLH, false, false, false, nullptr },
|
||||||
{ VK_R, IDM_EDIT_RTL, true, true, false, nullptr },
|
{ VK_R, IDM_EDIT_RTL, true, true, false, nullptr },
|
||||||
@ -2280,6 +2286,12 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session& s
|
|||||||
|
|
||||||
sessionFileInfo sfi(fileName, langName, encStr ? encoding : -1, isUserReadOnly, position, backupFilePath, fileModifiedTimestamp, mapPosition);
|
sessionFileInfo sfi(fileName, langName, encStr ? encoding : -1, isUserReadOnly, position, backupFilePath, fileModifiedTimestamp, mapPosition);
|
||||||
|
|
||||||
|
const TCHAR* intStrTabColour = (childNode->ToElement())->Attribute(TEXT("tabColourId"));
|
||||||
|
if (intStrTabColour)
|
||||||
|
{
|
||||||
|
sfi._individualTabColour = generic_atoi(intStrTabColour);
|
||||||
|
}
|
||||||
|
|
||||||
for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark"));
|
for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark"));
|
||||||
markNode;
|
markNode;
|
||||||
markNode = markNode->NextSibling(TEXT("Mark")))
|
markNode = markNode->NextSibling(TEXT("Mark")))
|
||||||
@ -3348,6 +3360,7 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName)
|
|||||||
(fileNameNode->ToElement())->SetAttribute(TEXT("backupFilePath"), viewSessionFiles[i]._backupFilePath.c_str());
|
(fileNameNode->ToElement())->SetAttribute(TEXT("backupFilePath"), viewSessionFiles[i]._backupFilePath.c_str());
|
||||||
(fileNameNode->ToElement())->SetAttribute(TEXT("originalFileLastModifTimestamp"), static_cast<int32_t>(viewSessionFiles[i]._originalFileLastModifTimestamp.dwLowDateTime));
|
(fileNameNode->ToElement())->SetAttribute(TEXT("originalFileLastModifTimestamp"), static_cast<int32_t>(viewSessionFiles[i]._originalFileLastModifTimestamp.dwLowDateTime));
|
||||||
(fileNameNode->ToElement())->SetAttribute(TEXT("originalFileLastModifTimestampHigh"), static_cast<int32_t>(viewSessionFiles[i]._originalFileLastModifTimestamp.dwHighDateTime));
|
(fileNameNode->ToElement())->SetAttribute(TEXT("originalFileLastModifTimestampHigh"), static_cast<int32_t>(viewSessionFiles[i]._originalFileLastModifTimestamp.dwHighDateTime));
|
||||||
|
(fileNameNode->ToElement())->SetAttribute(TEXT("tabColourId"), static_cast<int32_t>(viewSessionFiles[i]._individualTabColour));
|
||||||
|
|
||||||
// docMap
|
// docMap
|
||||||
(fileNameNode->ToElement())->SetAttribute(TEXT("mapFirstVisibleDisplayLine"), _i64tot(static_cast<LONGLONG>(viewSessionFiles[i]._mapPos._firstVisibleDisplayLine), szInt64, 10));
|
(fileNameNode->ToElement())->SetAttribute(TEXT("mapFirstVisibleDisplayLine"), _i64tot(static_cast<LONGLONG>(viewSessionFiles[i]._mapPos._firstVisibleDisplayLine), szInt64, 10));
|
||||||
|
@ -201,6 +201,7 @@ struct sessionFileInfo : public Position
|
|||||||
int _encoding = -1;
|
int _encoding = -1;
|
||||||
bool _isUserReadOnly = false;
|
bool _isUserReadOnly = false;
|
||||||
bool _isMonitoring = false;
|
bool _isMonitoring = false;
|
||||||
|
int _individualTabColour = -1;
|
||||||
|
|
||||||
generic_string _backupFilePath;
|
generic_string _backupFilePath;
|
||||||
FILETIME _originalFileLastModifTimestamp = {};
|
FILETIME _originalFileLastModifTimestamp = {};
|
||||||
|
@ -56,6 +56,18 @@ void DocTabView::closeBuffer(BufferID buffer)
|
|||||||
::SendMessage(_hParent, WM_SIZE, 0, 0);
|
::SendMessage(_hParent, WM_SIZE, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DocTabView::setIndividualTabColour(BufferID bufferId, int colorId)
|
||||||
|
{
|
||||||
|
_tabIndexToColour[bufferId] = colorId;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DocTabView::getIndividualTabColour(int tabIndex)
|
||||||
|
{
|
||||||
|
BufferID bufferId = getBufferByIndex(tabIndex);
|
||||||
|
auto it = _tabIndexToColour.find(bufferId);
|
||||||
|
if (it != _tabIndexToColour.end()) return it->second;
|
||||||
|
else return -1;
|
||||||
|
}
|
||||||
|
|
||||||
bool DocTabView::activateBuffer(BufferID buffer)
|
bool DocTabView::activateBuffer(BufferID buffer)
|
||||||
{
|
{
|
||||||
|
@ -90,10 +90,14 @@ public :
|
|||||||
return _pView;
|
return _pView;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void setIndividualTabColour(BufferID bufferId, int colorId);
|
||||||
|
int getIndividualTabColour(int tabIndex) override;
|
||||||
|
|
||||||
private :
|
private :
|
||||||
ScintillaEditView *_pView = nullptr;
|
ScintillaEditView *_pView = nullptr;
|
||||||
static bool _hideTabBarStatus;
|
static bool _hideTabBarStatus;
|
||||||
|
|
||||||
|
std::map<BufferID, int> _tabIndexToColour;
|
||||||
std::vector<IconList *> _pIconListVector;
|
std::vector<IconList *> _pIconListVector;
|
||||||
int _iconListIndexChoice = -1;
|
int _iconListIndexChoice = -1;
|
||||||
};
|
};
|
||||||
|
@ -1002,7 +1002,6 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara
|
|||||||
return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam);
|
return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
|
void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
|
||||||
{
|
{
|
||||||
RECT rect = pDrawItemStruct->rcItem;
|
RECT rect = pDrawItemStruct->rcItem;
|
||||||
@ -1032,7 +1031,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
|
|||||||
HBRUSH hBrush = ::CreateSolidBrush(!isDarkMode ? ::GetSysColor(COLOR_BTNFACE) : NppDarkMode::getBackgroundColor());
|
HBRUSH hBrush = ::CreateSolidBrush(!isDarkMode ? ::GetSysColor(COLOR_BTNFACE) : NppDarkMode::getBackgroundColor());
|
||||||
::FillRect(hDC, &rect, hBrush);
|
::FillRect(hDC, &rect, hBrush);
|
||||||
::DeleteObject((HGDIOBJ)hBrush);
|
::DeleteObject((HGDIOBJ)hBrush);
|
||||||
|
|
||||||
// equalize drawing areas of active and inactive tabs
|
// equalize drawing areas of active and inactive tabs
|
||||||
int paddingDynamicTwoX = NppParameters::getInstance()._dpiManager.scaleX(2);
|
int paddingDynamicTwoX = NppParameters::getInstance()._dpiManager.scaleX(2);
|
||||||
int paddingDynamicTwoY = NppParameters::getInstance()._dpiManager.scaleY(2);
|
int paddingDynamicTwoY = NppParameters::getInstance()._dpiManager.scaleY(2);
|
||||||
@ -1072,7 +1071,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
|
|||||||
rect.bottom += paddingDynamicTwoY;
|
rect.bottom += paddingDynamicTwoY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// the active tab's text with TCS_BUTTONS is lower than normal and gets clipped
|
// the active tab's text with TCS_BUTTONS is lower than normal and gets clipped
|
||||||
if (::GetWindowLongPtr(_hSelf, GWL_STYLE) & TCS_BUTTONS)
|
if (::GetWindowLongPtr(_hSelf, GWL_STYLE) & TCS_BUTTONS)
|
||||||
{
|
{
|
||||||
@ -1086,6 +1085,8 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int individualColourId = getIndividualTabColour(nTab);
|
||||||
|
|
||||||
// draw highlights on tabs (top bar for active tab / darkened background for inactive tab)
|
// draw highlights on tabs (top bar for active tab / darkened background for inactive tab)
|
||||||
RECT barRect = rect;
|
RECT barRect = rect;
|
||||||
if (isSelected)
|
if (isSelected)
|
||||||
@ -1109,7 +1110,14 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (::SendMessage(_hParent, NPPM_INTERNAL_ISFOCUSEDTAB, 0, reinterpret_cast<LPARAM>(_hSelf)))
|
if (::SendMessage(_hParent, NPPM_INTERNAL_ISFOCUSEDTAB, 0, reinterpret_cast<LPARAM>(_hSelf)))
|
||||||
hBrush = ::CreateSolidBrush(_activeTopBarFocusedColour); // #FAAA3C
|
{
|
||||||
|
COLORREF topBarColour = _activeTopBarFocusedColour; // #FAAA3C
|
||||||
|
if (individualColourId != -1)
|
||||||
|
{
|
||||||
|
topBarColour = NppDarkMode::getIndividualTabColour(individualColourId, isDarkMode, true);
|
||||||
|
}
|
||||||
|
hBrush = ::CreateSolidBrush(topBarColour);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
hBrush = ::CreateSolidBrush(_activeTopBarUnfocusedColour); // #FAD296
|
hBrush = ::CreateSolidBrush(_activeTopBarUnfocusedColour); // #FAD296
|
||||||
|
|
||||||
@ -1117,12 +1125,27 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
|
|||||||
::DeleteObject((HGDIOBJ)hBrush);
|
::DeleteObject((HGDIOBJ)hBrush);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else // inactive tabs
|
||||||
{
|
{
|
||||||
if (_drawInactiveTab)
|
bool draw = false;
|
||||||
|
RECT rect = _isCtrlMultiLine ? pDrawItemStruct->rcItem : barRect;
|
||||||
|
COLORREF brushColour{};
|
||||||
|
|
||||||
|
if (_drawInactiveTab && individualColourId == -1 && !isDarkMode)
|
||||||
{
|
{
|
||||||
hBrush = ::CreateSolidBrush(!isDarkMode ? _inactiveBgColour : NppDarkMode::getBackgroundColor());
|
brushColour = _inactiveBgColour;
|
||||||
::FillRect(hDC, &barRect, hBrush);
|
draw = true;
|
||||||
|
}
|
||||||
|
else if (individualColourId != -1)
|
||||||
|
{
|
||||||
|
brushColour = NppDarkMode::getIndividualTabColour(individualColourId, isDarkMode, false);
|
||||||
|
draw = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (draw)
|
||||||
|
{
|
||||||
|
hBrush = ::CreateSolidBrush(brushColour);
|
||||||
|
::FillRect(hDC, &rect, hBrush);
|
||||||
::DeleteObject((HGDIOBJ)hBrush);
|
::DeleteObject((HGDIOBJ)hBrush);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,6 +208,8 @@ public :
|
|||||||
|
|
||||||
static void setColour(COLORREF colour2Set, tabColourIndex i);
|
static void setColour(COLORREF colour2Set, tabColourIndex i);
|
||||||
|
|
||||||
|
virtual int getIndividualTabColour(int tabIndex) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// it's the boss to decide if we do the drag N drop
|
// it's the boss to decide if we do the drag N drop
|
||||||
static bool _doDragNDrop;
|
static bool _doDragNDrop;
|
||||||
|
@ -379,35 +379,41 @@ void NativeLangSpeaker::changeMenuLang(HMENU menuHandle)
|
|||||||
|
|
||||||
static const int tabContextMenuItemPos[] =
|
static const int tabContextMenuItemPos[] =
|
||||||
{
|
{
|
||||||
// +-------------- The order in tab menu (NppNotification.cpp : if (!_tabPopupMenu.isCreated())
|
// +-------------- The item position in tab context menu
|
||||||
// |
|
// |
|
||||||
// | +------ Number in english.xml (<language>.xml) : <TabBar>
|
// | +------ Index order (CMDID) in <TabBar> of english.xml
|
||||||
// | |
|
// | |
|
||||||
0, // 0: Close
|
0, // 0: Close
|
||||||
1, // 1: Close ALL BUT This
|
1, // 1: Close ALL BUT This
|
||||||
5, // 2: Save
|
5, // 2: Save
|
||||||
6, // 3: Save As
|
6, // 3: Save As
|
||||||
10, // 4: Print
|
10, // 4: Print
|
||||||
25, // 5: Move to Other View
|
32, // 5: Move to Other View
|
||||||
26, // 6: Clone to Other View
|
33, // 6: Clone to Other View
|
||||||
21, // 7: Full File Path to Clipboard
|
28, // 7: Full File Path to Clipboard
|
||||||
22, // 8: Filename to Clipboard
|
29, // 8: Filename to Clipboard
|
||||||
23, // 9: Current Dir. Path to Clipboard
|
30, // 9: Current Dir. Path to Clipboard
|
||||||
7, // 10: Rename
|
7, // 10: Rename
|
||||||
8, // 11: Move to Recycle Bin
|
8, // 11: Move to Recycle Bin
|
||||||
18, // 12: Read-Only
|
25, // 12: Read-Only
|
||||||
19, // 13: Clear Read-Only Flag
|
24, // 13: Clear Read-Only Flag
|
||||||
27, // 14: Move to New Instance
|
34, // 14: Move to New Instance
|
||||||
28, // 15: Open to New Instance
|
35, // 15: Open to New Instance
|
||||||
9, // 16: Reload
|
9, // 16: Reload
|
||||||
2, // 17: Close ALL to the Left
|
2, // 17: Close ALL to the Left
|
||||||
3, // 18: Close ALL to the Right
|
3, // 18: Close ALL to the Right
|
||||||
12, // 19: Open Containing Folder in Explorer
|
19, // 19: Open Containing Folder in Explorer
|
||||||
13, // 20: Open Containing Folder in cmd
|
20, // 20: Open Containing Folder in cmd
|
||||||
16, // 21: Open in Default Viewer
|
23, // 21: Open in Default Viewer
|
||||||
4, // 22: Close ALL Unchanged
|
4, // 22: Close ALL Unchanged
|
||||||
14, // 23: Open Containing Folder as Workspace
|
21, // 23: Open Containing Folder as Workspace
|
||||||
-1 //-------End
|
12, // 24: Apply Color
|
||||||
|
13, // 25: Apply Color
|
||||||
|
14, // 26: Apply Color
|
||||||
|
15, // 27: Apply Color
|
||||||
|
16, // 28: Apply Color
|
||||||
|
17, // 29: Remove Color
|
||||||
|
-1 //-------End
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -367,6 +367,13 @@
|
|||||||
#define IDM_VIEW_SWITCHTO_FUNC_LIST (IDM_VIEW + 108)
|
#define IDM_VIEW_SWITCHTO_FUNC_LIST (IDM_VIEW + 108)
|
||||||
#define IDM_VIEW_SWITCHTO_DOCLIST (IDM_VIEW + 109)
|
#define IDM_VIEW_SWITCHTO_DOCLIST (IDM_VIEW + 109)
|
||||||
|
|
||||||
|
#define IDM_VIEW_TAB_COLOUR_NONE (IDM_VIEW + 110)
|
||||||
|
#define IDM_VIEW_TAB_COLOUR_1 (IDM_VIEW + 111)
|
||||||
|
#define IDM_VIEW_TAB_COLOUR_2 (IDM_VIEW + 112)
|
||||||
|
#define IDM_VIEW_TAB_COLOUR_3 (IDM_VIEW + 113)
|
||||||
|
#define IDM_VIEW_TAB_COLOUR_4 (IDM_VIEW + 114)
|
||||||
|
#define IDM_VIEW_TAB_COLOUR_5 (IDM_VIEW + 115)
|
||||||
|
|
||||||
#define IDM_VIEW_GOTO_ANOTHER_VIEW 10001
|
#define IDM_VIEW_GOTO_ANOTHER_VIEW 10001
|
||||||
#define IDM_VIEW_CLONE_TO_ANOTHER_VIEW 10002
|
#define IDM_VIEW_CLONE_TO_ANOTHER_VIEW 10002
|
||||||
#define IDM_VIEW_GOTO_NEW_INSTANCE 10003
|
#define IDM_VIEW_GOTO_NEW_INSTANCE 10003
|
||||||
|
Loading…
x
Reference in New Issue
Block a user