From fddc8be13616348a57910661bac667711b91aacc Mon Sep 17 00:00:00 2001 From: SinghRajenM Date: Mon, 11 Nov 2024 11:25:02 +0530 Subject: [PATCH 1/7] Add zoom feature for treeview on ctrl+mouse scroll --- src/NppJsonViewer/JsonViewDlg.cpp | 46 +++++++++++++++++++++++++++++++ src/NppJsonViewer/JsonViewDlg.h | 6 ++++ 2 files changed, 52 insertions(+) diff --git a/src/NppJsonViewer/JsonViewDlg.cpp b/src/NppJsonViewer/JsonViewDlg.cpp index d0a66b6..51cc12c 100644 --- a/src/NppJsonViewer/JsonViewDlg.cpp +++ b/src/NppJsonViewer/JsonViewDlg.cpp @@ -895,6 +895,42 @@ void JsonViewDlg::EnableControls(const std::vector& ids, bool enable) EnableWindow(GetDlgItem(getHSelf(), id), enable ? TRUE : FALSE); } +void JsonViewDlg::SetTreeViewZoom(double dwZoomFactor) +{ + HWND hTreeView = GetDlgItem(getHSelf(), IDC_TREE); + static HFONT hCurrentFont = reinterpret_cast(SendMessage(hTreeView, WM_GETFONT, 0, 0)); + + LOGFONT logFont {}; + GetObject(hCurrentFont, sizeof(LOGFONT), &logFont); + logFont.lfHeight = static_cast(logFont.lfHeight * dwZoomFactor); + + static HFONT hTreeFont = nullptr; + if (hTreeFont) + { + DeleteObject(hTreeFont); + } + hTreeFont = CreateFontIndirect(&logFont); + + SendMessage(hTreeView, WM_SETFONT, reinterpret_cast(hTreeFont), TRUE); + InvalidateRect(hTreeView, nullptr, TRUE); +} + +void JsonViewDlg::HandleZoom(bool zoomIn) +{ + static double zoomLevel = 1.0; // Start at 100% zoom (Max 300% and min 80%) + + if (zoomIn && zoomLevel < 3.0) + { + zoomLevel += 0.1; // Zoom in (max 300%) + } + else if (!zoomIn && zoomLevel > 0.8) + { + zoomLevel -= 0.1; // Zoom out (min 80%) + } + + SetTreeViewZoom(zoomLevel); +} + void JsonViewDlg::HandleTreeEvents(LPARAM lParam) const { LPNMHDR lpnmh = reinterpret_cast(lParam); @@ -1107,6 +1143,16 @@ INT_PTR JsonViewDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) return TRUE; } + case WM_MOUSEWHEEL: + { + if (GetKeyState(VK_CONTROL) & 0x8000) + { + HandleZoom(GET_WHEEL_DELTA_WPARAM(wParam) > 0); + return TRUE; + } + return FALSE; + } + default: return DockingDlgInterface::run_dlgProc(message, wParam, lParam); } diff --git a/src/NppJsonViewer/JsonViewDlg.h b/src/NppJsonViewer/JsonViewDlg.h index 3fb2a32..1a02042 100644 --- a/src/NppJsonViewer/JsonViewDlg.h +++ b/src/NppJsonViewer/JsonViewDlg.h @@ -89,6 +89,12 @@ class JsonViewDlg void ShowControls(const std::vector& ids, bool show); void EnableControls(const std::vector& ids, bool enable); + auto GetZoomLevel() const -> int; + void SetZoomLevel(int pos) const; + void SetTreeViewZoom(double dwZoomFactor) const; + void UpdateUIOnZoom(int zoomPercentage) const; + void HandleZoomOnScroll(WPARAM wParam) const; + void HandleTreeEvents(LPARAM lParam) const; auto GetFormatSetting() const -> std::tuple; From 0222285f463d9d55747b4c8509a4bad7efb23736 Mon Sep 17 00:00:00 2001 From: SinghRajenM Date: Mon, 11 Nov 2024 11:25:39 +0530 Subject: [PATCH 2/7] Add zoom feature using slider --- src/NppJsonViewer/JsonViewDlg.cpp | 77 +++++++++++++++++++++++++++---- src/NppJsonViewer/resource.h | 4 +- src/NppJsonViewer/resource.rc | 4 +- 3 files changed, 75 insertions(+), 10 deletions(-) diff --git a/src/NppJsonViewer/JsonViewDlg.cpp b/src/NppJsonViewer/JsonViewDlg.cpp index 51cc12c..763c0d1 100644 --- a/src/NppJsonViewer/JsonViewDlg.cpp +++ b/src/NppJsonViewer/JsonViewDlg.cpp @@ -12,6 +12,13 @@ constexpr int FILENAME_LEN_IN_TITLE = 16; +namespace SliderPercent +{ + constexpr const int nDefault = 100; + constexpr const int nMinZoom = 80; + constexpr const int nMaxZoom = 250; +}; // namespace SliderPercent + JsonViewDlg::JsonViewDlg(HINSTANCE hInstance, const NppData& nppData, const bool& isReady, int nCmdId, std::shared_ptr& pSetting) : DockingDlgInterface(IDD_TREEDLG) , m_NppData(nppData) @@ -895,6 +902,27 @@ void JsonViewDlg::EnableControls(const std::vector& ids, bool enable) EnableWindow(GetDlgItem(getHSelf(), id), enable ? TRUE : FALSE); } +auto JsonViewDlg::GetSliderPosition() const -> int +{ + HWND hSlider = GetDlgItem(getHSelf(), IDC_ZOOM_SLIDER); + int pos = static_cast(SendMessage(hSlider, TBM_GETPOS, 0, 0)); + + return pos; +} + +void JsonViewDlg::SetSliderPosition(int pos) const +{ + // Set slider position + HWND hSlider = GetDlgItem(getHSelf(), IDC_ZOOM_SLIDER); + SendMessage(hSlider, TBM_SETPOS, TRUE, pos); + + // Set slider position in text value + HWND hZoomPercent = GetDlgItem(getHSelf(), IDC_ZOOM_PERCENT); + wchar_t zoomText[16] {}; + wsprintf(zoomText, L"%d%%", pos); + SetWindowText(hZoomPercent, zoomText); +} + void JsonViewDlg::SetTreeViewZoom(double dwZoomFactor) { HWND hTreeView = GetDlgItem(getHSelf(), IDC_TREE); @@ -915,20 +943,32 @@ void JsonViewDlg::SetTreeViewZoom(double dwZoomFactor) InvalidateRect(hTreeView, nullptr, TRUE); } -void JsonViewDlg::HandleZoom(bool zoomIn) +void JsonViewDlg::UpdateUIOnZoom(int zoomPercentage) +{ + // Update slider + SetSliderPosition(zoomPercentage); + + // Update the Tree view + double zoomFactor = zoomPercentage / 100.0; + SetTreeViewZoom(zoomFactor); +} + +void JsonViewDlg::HandleZoomOnScroll(WPARAM wParam) { - static double zoomLevel = 1.0; // Start at 100% zoom (Max 300% and min 80%) + int pos = GetSliderPosition(); // Current slider position + int delta = GET_WHEEL_DELTA_WPARAM(wParam); - if (zoomIn && zoomLevel < 3.0) + // Adjust zoom based on scroll direction + if (delta > 0 && pos < SliderPercent::nMaxZoom) { - zoomLevel += 0.1; // Zoom in (max 300%) + pos += 10; // Zoom in } - else if (!zoomIn && zoomLevel > 0.8) + else if (delta < 0 && pos > SliderPercent::nMinZoom) { - zoomLevel -= 0.1; // Zoom out (min 80%) + pos -= 10; // Zoom out } - SetTreeViewZoom(zoomLevel); + UpdateUIOnZoom(pos); } void JsonViewDlg::HandleTreeEvents(LPARAM lParam) const @@ -1072,6 +1112,12 @@ INT_PTR JsonViewDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) // Set default node path as JSON SetDlgItemText(_hSelf, IDC_EDT_NODEPATH, JSON_ROOT); + // Set slider range from 80% to 200% + // Set initial position to 100% (no zoom) + HWND hSlider = GetDlgItem(getHSelf(), IDC_ZOOM_SLIDER); + SendMessage(hSlider, TBM_SETRANGE, TRUE, MAKELPARAM(SliderPercent::nMinZoom, SliderPercent::nMaxZoom)); + SendMessage(hSlider, TBM_SETPOS, TRUE, SliderPercent::nDefault); + return TRUE; } @@ -1147,12 +1193,27 @@ INT_PTR JsonViewDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { if (GetKeyState(VK_CONTROL) & 0x8000) { - HandleZoom(GET_WHEEL_DELTA_WPARAM(wParam) > 0); + HandleZoomOnScroll(wParam); + return TRUE; + } + return FALSE; + } + + case WM_HSCROLL: + { + HWND hSlider = GetDlgItem(getHSelf(), IDC_ZOOM_SLIDER); + + if (reinterpret_cast(lParam) == hSlider) + { + int pos = GetSliderPosition(); + UpdateUIOnZoom(pos); + return TRUE; } return FALSE; } + default: return DockingDlgInterface::run_dlgProc(message, wParam, lParam); } diff --git a/src/NppJsonViewer/resource.h b/src/NppJsonViewer/resource.h index 23a0b03..13d1e52 100644 --- a/src/NppJsonViewer/resource.h +++ b/src/NppJsonViewer/resource.h @@ -42,6 +42,8 @@ #define IDC_CHK_IGNORE_COMMENT 1031 #define IDC_CHK_JSON_HIGHLIGHT 1032 #define IDC_CHK_REPLACE_UNDEFINED 1033 +#define IDC_ZOOM_SLIDER 1034 +#define IDC_ZOOM_PERCENT 1035 #define IDM_COPY_TREEITEM 40001 #define IDM_COPY_NODENAME 40002 #define IDM_COPY_NODEVALUE 40003 @@ -55,7 +57,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 110 #define _APS_NEXT_COMMAND_VALUE 40007 -#define _APS_NEXT_CONTROL_VALUE 1034 +#define _APS_NEXT_CONTROL_VALUE 1036 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/src/NppJsonViewer/resource.rc b/src/NppJsonViewer/resource.rc index 9064ec1..0d9df2d 100644 --- a/src/NppJsonViewer/resource.rc +++ b/src/NppJsonViewer/resource.rc @@ -88,7 +88,9 @@ BEGIN CONTROL "",IDC_DIVIDER,"Static",SS_ETCHEDVERT,56,1,2,16 EDITTEXT IDC_EDT_SEARCH,60,2,99,12,ES_AUTOHSCROLL PUSHBUTTON "",IDC_BTN_SEARCH,160,2,16,12,BS_ICON - CONTROL "",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_HSCROLL | WS_TABSTOP,2,18,173,274,WS_EX_CLIENTEDGE + CONTROL "",IDC_ZOOM_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_NOTICKS,2,16,58,12 + RTEXT "100%",IDC_ZOOM_PERCENT,60,16,22,12,NOT WS_GROUP,WS_EX_RIGHT + CONTROL "",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_HSCROLL | WS_TABSTOP,2,30,173,264,WS_EX_CLIENTEDGE EDITTEXT IDC_EDT_NODEPATH,2,296,173,12,ES_AUTOHSCROLL | ES_READONLY END From d74c5bded44a1f25435055b0f55f6a983e67cf11 Mon Sep 17 00:00:00 2001 From: SinghRajenM Date: Mon, 11 Nov 2024 11:26:59 +0530 Subject: [PATCH 3/7] Const functions --- src/NppJsonViewer/JsonViewDlg.cpp | 6 +++--- src/NppJsonViewer/JsonViewDlg.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NppJsonViewer/JsonViewDlg.cpp b/src/NppJsonViewer/JsonViewDlg.cpp index 763c0d1..1c863d4 100644 --- a/src/NppJsonViewer/JsonViewDlg.cpp +++ b/src/NppJsonViewer/JsonViewDlg.cpp @@ -923,7 +923,7 @@ void JsonViewDlg::SetSliderPosition(int pos) const SetWindowText(hZoomPercent, zoomText); } -void JsonViewDlg::SetTreeViewZoom(double dwZoomFactor) +void JsonViewDlg::SetTreeViewZoom(double dwZoomFactor) const { HWND hTreeView = GetDlgItem(getHSelf(), IDC_TREE); static HFONT hCurrentFont = reinterpret_cast(SendMessage(hTreeView, WM_GETFONT, 0, 0)); @@ -943,7 +943,7 @@ void JsonViewDlg::SetTreeViewZoom(double dwZoomFactor) InvalidateRect(hTreeView, nullptr, TRUE); } -void JsonViewDlg::UpdateUIOnZoom(int zoomPercentage) +void JsonViewDlg::UpdateUIOnZoom(int zoomPercentage) const { // Update slider SetSliderPosition(zoomPercentage); @@ -953,7 +953,7 @@ void JsonViewDlg::UpdateUIOnZoom(int zoomPercentage) SetTreeViewZoom(zoomFactor); } -void JsonViewDlg::HandleZoomOnScroll(WPARAM wParam) +void JsonViewDlg::HandleZoomOnScroll(WPARAM wParam) const { int pos = GetSliderPosition(); // Current slider position int delta = GET_WHEEL_DELTA_WPARAM(wParam); diff --git a/src/NppJsonViewer/JsonViewDlg.h b/src/NppJsonViewer/JsonViewDlg.h index 1a02042..3b5b759 100644 --- a/src/NppJsonViewer/JsonViewDlg.h +++ b/src/NppJsonViewer/JsonViewDlg.h @@ -89,8 +89,8 @@ class JsonViewDlg void ShowControls(const std::vector& ids, bool show); void EnableControls(const std::vector& ids, bool enable); - auto GetZoomLevel() const -> int; - void SetZoomLevel(int pos) const; + auto GetSliderPosition() const -> int; + void SetSliderPosition(int pos) const; void SetTreeViewZoom(double dwZoomFactor) const; void UpdateUIOnZoom(int zoomPercentage) const; void HandleZoomOnScroll(WPARAM wParam) const; From 13ac71416470b35df529dd8080e3bbfc0390aa30 Mon Sep 17 00:00:00 2001 From: SinghRajenM Date: Mon, 11 Nov 2024 11:29:03 +0530 Subject: [PATCH 4/7] Implement reset on double click on the zoomer value --- src/NppJsonViewer/JsonViewDlg.cpp | 50 ++++--------- src/NppJsonViewer/JsonViewDlg.h | 6 +- src/NppJsonViewer/NPPJSONViewer.vcxproj | 2 + .../NPPJSONViewer.vcxproj.filters | 6 ++ src/NppJsonViewer/SliderCtrl.cpp | 75 +++++++++++++++++++ src/NppJsonViewer/SliderCtrl.h | 52 +++++++++++++ src/NppJsonViewer/resource.rc | 2 +- 7 files changed, 155 insertions(+), 38 deletions(-) create mode 100644 src/NppJsonViewer/SliderCtrl.cpp create mode 100644 src/NppJsonViewer/SliderCtrl.h diff --git a/src/NppJsonViewer/JsonViewDlg.cpp b/src/NppJsonViewer/JsonViewDlg.cpp index 1c863d4..47dc8df 100644 --- a/src/NppJsonViewer/JsonViewDlg.cpp +++ b/src/NppJsonViewer/JsonViewDlg.cpp @@ -12,13 +12,6 @@ constexpr int FILENAME_LEN_IN_TITLE = 16; -namespace SliderPercent -{ - constexpr const int nDefault = 100; - constexpr const int nMinZoom = 80; - constexpr const int nMaxZoom = 250; -}; // namespace SliderPercent - JsonViewDlg::JsonViewDlg(HINSTANCE hInstance, const NppData& nppData, const bool& isReady, int nCmdId, std::shared_ptr& pSetting) : DockingDlgInterface(IDD_TREEDLG) , m_NppData(nppData) @@ -26,6 +19,7 @@ JsonViewDlg::JsonViewDlg(HINSTANCE hInstance, const NppData& nppData, const bool , m_nDlgId(nCmdId) , m_pEditor(std::make_unique(nppData)) , m_pTreeView(std::make_unique()) + , m_pTreeViewZoom(std::make_unique()) , m_pSetting(pSetting) , m_pCurrFileName(std::make_unique(FILENAME_LEN_IN_TITLE)) { @@ -902,25 +896,14 @@ void JsonViewDlg::EnableControls(const std::vector& ids, bool enable) EnableWindow(GetDlgItem(getHSelf(), id), enable ? TRUE : FALSE); } -auto JsonViewDlg::GetSliderPosition() const -> int +auto JsonViewDlg::GetZoomLevel() const -> int { - HWND hSlider = GetDlgItem(getHSelf(), IDC_ZOOM_SLIDER); - int pos = static_cast(SendMessage(hSlider, TBM_GETPOS, 0, 0)); - - return pos; + return m_pTreeViewZoom->GetPosition(); } -void JsonViewDlg::SetSliderPosition(int pos) const +void JsonViewDlg::SetZoomLevel(int pos) const { - // Set slider position - HWND hSlider = GetDlgItem(getHSelf(), IDC_ZOOM_SLIDER); - SendMessage(hSlider, TBM_SETPOS, TRUE, pos); - - // Set slider position in text value - HWND hZoomPercent = GetDlgItem(getHSelf(), IDC_ZOOM_PERCENT); - wchar_t zoomText[16] {}; - wsprintf(zoomText, L"%d%%", pos); - SetWindowText(hZoomPercent, zoomText); + m_pTreeViewZoom->SetPosition(pos); } void JsonViewDlg::SetTreeViewZoom(double dwZoomFactor) const @@ -945,8 +928,8 @@ void JsonViewDlg::SetTreeViewZoom(double dwZoomFactor) const void JsonViewDlg::UpdateUIOnZoom(int zoomPercentage) const { - // Update slider - SetSliderPosition(zoomPercentage); + // Update zoom level on slider + SetZoomLevel(zoomPercentage); // Update the Tree view double zoomFactor = zoomPercentage / 100.0; @@ -955,15 +938,17 @@ void JsonViewDlg::UpdateUIOnZoom(int zoomPercentage) const void JsonViewDlg::HandleZoomOnScroll(WPARAM wParam) const { - int pos = GetSliderPosition(); // Current slider position + int pos = GetZoomLevel(); // Current zoom level int delta = GET_WHEEL_DELTA_WPARAM(wParam); - // Adjust zoom based on scroll direction - if (delta > 0 && pos < SliderPercent::nMaxZoom) + const auto& zoomRange = m_pTreeViewZoom->GetRange(); + const bool isZoom = delta > 0; + + if (isZoom && pos < zoomRange.m_nMaxZoom) { pos += 10; // Zoom in } - else if (delta < 0 && pos > SliderPercent::nMinZoom) + else if (!isZoom && pos > zoomRange.m_nMinZoom) { pos -= 10; // Zoom out } @@ -1106,18 +1091,13 @@ INT_PTR JsonViewDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) ::SetWindowLongPtr(getHSelf(), GWLP_USERDATA, reinterpret_cast(this)); m_pTreeView->OnInit(getHSelf(), IDC_TREE); + m_pTreeViewZoom->OnInit(getHSelf(), IDC_ZOOM_SLIDER, IDC_ZOOM_PERCENT); PrepareButtons(); // Set default node path as JSON SetDlgItemText(_hSelf, IDC_EDT_NODEPATH, JSON_ROOT); - // Set slider range from 80% to 200% - // Set initial position to 100% (no zoom) - HWND hSlider = GetDlgItem(getHSelf(), IDC_ZOOM_SLIDER); - SendMessage(hSlider, TBM_SETRANGE, TRUE, MAKELPARAM(SliderPercent::nMinZoom, SliderPercent::nMaxZoom)); - SendMessage(hSlider, TBM_SETPOS, TRUE, SliderPercent::nDefault); - return TRUE; } @@ -1205,7 +1185,7 @@ INT_PTR JsonViewDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) if (reinterpret_cast(lParam) == hSlider) { - int pos = GetSliderPosition(); + int pos = m_pTreeViewZoom->GetPosition(); UpdateUIOnZoom(pos); return TRUE; diff --git a/src/NppJsonViewer/JsonViewDlg.h b/src/NppJsonViewer/JsonViewDlg.h index 3b5b759..2599520 100644 --- a/src/NppJsonViewer/JsonViewDlg.h +++ b/src/NppJsonViewer/JsonViewDlg.h @@ -9,6 +9,7 @@ #include "PluginInterface.h" #include "resource.h" #include "TreeViewCtrl.h" +#include "SliderCtrl.h" #include "ScintillaEditor.h" #include "JsonHandler.h" #include "JsonNode.h" @@ -89,8 +90,8 @@ class JsonViewDlg void ShowControls(const std::vector& ids, bool show); void EnableControls(const std::vector& ids, bool enable); - auto GetSliderPosition() const -> int; - void SetSliderPosition(int pos) const; + auto GetZoomLevel() const -> int; + void SetZoomLevel(int pos) const; void SetTreeViewZoom(double dwZoomFactor) const; void UpdateUIOnZoom(int zoomPercentage) const; void HandleZoomOnScroll(WPARAM wParam) const; @@ -124,5 +125,6 @@ class JsonViewDlg std::unique_ptr m_pCurrFileName; std::unique_ptr m_pEditor = nullptr; std::unique_ptr m_pTreeView = nullptr; + std::unique_ptr m_pTreeViewZoom = nullptr; std::shared_ptr m_pSetting = nullptr; }; diff --git a/src/NppJsonViewer/NPPJSONViewer.vcxproj b/src/NppJsonViewer/NPPJSONViewer.vcxproj index 5e23da4..ee23ea4 100644 --- a/src/NppJsonViewer/NPPJSONViewer.vcxproj +++ b/src/NppJsonViewer/NPPJSONViewer.vcxproj @@ -197,6 +197,7 @@ + @@ -221,6 +222,7 @@ + diff --git a/src/NppJsonViewer/NPPJSONViewer.vcxproj.filters b/src/NppJsonViewer/NPPJSONViewer.vcxproj.filters index e3a4ea1..b94df99 100644 --- a/src/NppJsonViewer/NPPJSONViewer.vcxproj.filters +++ b/src/NppJsonViewer/NPPJSONViewer.vcxproj.filters @@ -60,6 +60,9 @@ Header Files + + Source Files + @@ -134,6 +137,9 @@ Header Files + + Header Files + diff --git a/src/NppJsonViewer/SliderCtrl.cpp b/src/NppJsonViewer/SliderCtrl.cpp new file mode 100644 index 0000000..2f6a7af --- /dev/null +++ b/src/NppJsonViewer/SliderCtrl.cpp @@ -0,0 +1,75 @@ +#include "SliderCtrl.h" + +#include + +SliderCtrl::SliderCtrl(const SliderRange& sliderRange) + : m_sliderRange(sliderRange) +{ +} + +SliderCtrl::~SliderCtrl() +{ + // Restore the original window procedure on cleanup + SetWindowLongPtr(m_hSelf, GWLP_WNDPROC, (LONG_PTR)m_oldSliderProc); +} + +void SliderCtrl::OnInit(HWND hParent, int sliderID, int sliderInfoID) +{ + m_hParent = hParent; + m_hSelf = GetDlgItem(m_hParent, sliderID); + m_hSelfInfo = GetDlgItem(m_hParent, sliderInfoID); + + // Set slider range and initial position + SendMessage(m_hSelf, TBM_SETRANGE, TRUE, MAKELPARAM(m_sliderRange.m_nMinZoom, m_sliderRange.m_nMaxZoom)); + SendMessage(m_hSelf, TBM_SETPOS, TRUE, m_sliderRange.m_nDefault); + + UpdateInfo(m_sliderRange.m_nDefault); + + // Subclass the slider control to handle double-click events + m_oldSliderProc = reinterpret_cast(SetWindowLongPtr(m_hSelfInfo, GWLP_WNDPROC, reinterpret_cast(runWinProc))); + + // Save this instance for access in the static window procedure + SetWindowLongPtr(m_hSelfInfo, GWLP_USERDATA, reinterpret_cast(this)); +} + +auto SliderCtrl::GetPosition() const -> int +{ + int pos = static_cast(SendMessage(m_hSelf, TBM_GETPOS, 0, 0)); + return pos; +} + +void SliderCtrl::SetPosition(int pos) const +{ + // Set slider position + SendMessage(m_hSelf, TBM_SETPOS, TRUE, pos); + + // Set slider position in text value + UpdateInfo(pos); +} + +void SliderCtrl::UpdateInfo(int zoomPercentage) const +{ + std::wstring sliderInfoText = std::to_wstring(zoomPercentage) + L"%"; + SetWindowText(m_hSelfInfo, sliderInfoText.c_str()); +} + +LRESULT SliderCtrl::runWinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + SliderCtrl* pThis = reinterpret_cast(GetWindowLongPtr(hWnd, GWLP_USERDATA)); + + if (pThis) + { + if (message == WM_LBUTTONDBLCLK) + { + // Reset slider to 100% on double-click + // Also notify its parent to adjust tree view as well + pThis->SetPosition(100); + SendMessage(pThis->m_hParent, WM_HSCROLL, NULL, reinterpret_cast(pThis->m_hSelf)); + } + + // Call the original window procedure for other messages + return CallWindowProc(pThis->m_oldSliderProc, hWnd, message, wParam, lParam); + } + + return FALSE; +} diff --git a/src/NppJsonViewer/SliderCtrl.h b/src/NppJsonViewer/SliderCtrl.h new file mode 100644 index 0000000..a9ebc9d --- /dev/null +++ b/src/NppJsonViewer/SliderCtrl.h @@ -0,0 +1,52 @@ +#pragma once + + +#include +#include + +struct SliderRange +{ + int m_nDefault = 100; + int m_nMinZoom = 80; + int m_nMaxZoom = 250; +}; // namespace SliderRange + +class SliderCtrl +{ + HWND m_hParent = nullptr; + HWND m_hSelf = nullptr; + HWND m_hSelfInfo = nullptr; + HWND m_hTreeView = nullptr; + WNDPROC m_oldSliderProc = nullptr; + const SliderRange m_sliderRange {}; + +public: + explicit SliderCtrl(const SliderRange& sliderRange = {}); + + ~SliderCtrl(); + + void OnInit(HWND hParent, int sliderID, int sliderInfoID); + + HWND GetSliderHandle() const + { + return m_hSelf; + } + + HWND GetSliderInfoHandle() const + { + return m_hSelfInfo; + } + + auto GetRange() const -> const SliderRange& + { + return m_sliderRange; + } + + auto GetPosition() const -> int; + void SetPosition(int pos) const; + void UpdateInfo(int zoomPercentage) const; + +private: + // Static window procedure for the slider + static INT_PTR CALLBACK runWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); +}; diff --git a/src/NppJsonViewer/resource.rc b/src/NppJsonViewer/resource.rc index 0d9df2d..e7e454c 100644 --- a/src/NppJsonViewer/resource.rc +++ b/src/NppJsonViewer/resource.rc @@ -89,7 +89,7 @@ BEGIN EDITTEXT IDC_EDT_SEARCH,60,2,99,12,ES_AUTOHSCROLL PUSHBUTTON "",IDC_BTN_SEARCH,160,2,16,12,BS_ICON CONTROL "",IDC_ZOOM_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_NOTICKS,2,16,58,12 - RTEXT "100%",IDC_ZOOM_PERCENT,60,16,22,12,NOT WS_GROUP,WS_EX_RIGHT + RTEXT "100%",IDC_ZOOM_PERCENT,60,16,22,12,SS_NOTIFY | NOT WS_GROUP,WS_EX_RIGHT CONTROL "",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_HSCROLL | WS_TABSTOP,2,30,173,264,WS_EX_CLIENTEDGE EDITTEXT IDC_EDT_NODEPATH,2,296,173,12,ES_AUTOHSCROLL | ES_READONLY END From 0e37e5b7c0f6f03d967fc1a72ca174393f54085c Mon Sep 17 00:00:00 2001 From: SinghRajenM Date: Mon, 11 Nov 2024 11:36:03 +0530 Subject: [PATCH 5/7] Rename variable --- src/NppJsonViewer/JsonViewDlg.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NppJsonViewer/JsonViewDlg.cpp b/src/NppJsonViewer/JsonViewDlg.cpp index 47dc8df..3896f0d 100644 --- a/src/NppJsonViewer/JsonViewDlg.cpp +++ b/src/NppJsonViewer/JsonViewDlg.cpp @@ -942,13 +942,13 @@ void JsonViewDlg::HandleZoomOnScroll(WPARAM wParam) const int delta = GET_WHEEL_DELTA_WPARAM(wParam); const auto& zoomRange = m_pTreeViewZoom->GetRange(); - const bool isZoom = delta > 0; + const bool isZoomIn = delta > 0; - if (isZoom && pos < zoomRange.m_nMaxZoom) + if (isZoomIn && pos < zoomRange.m_nMaxZoom) { pos += 10; // Zoom in } - else if (!isZoom && pos > zoomRange.m_nMinZoom) + else if (!isZoomIn && pos > zoomRange.m_nMinZoom) { pos -= 10; // Zoom out } From 14e0f816838d107ca01ff51aaa1d9591ae37a71d Mon Sep 17 00:00:00 2001 From: SinghRajenM Date: Thu, 14 Nov 2024 09:08:33 +0530 Subject: [PATCH 6/7] FIx x86 compilation --- src/NppJsonViewer/SliderCtrl.cpp | 2 +- src/NppJsonViewer/SliderCtrl.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NppJsonViewer/SliderCtrl.cpp b/src/NppJsonViewer/SliderCtrl.cpp index 2f6a7af..91103ba 100644 --- a/src/NppJsonViewer/SliderCtrl.cpp +++ b/src/NppJsonViewer/SliderCtrl.cpp @@ -10,7 +10,7 @@ SliderCtrl::SliderCtrl(const SliderRange& sliderRange) SliderCtrl::~SliderCtrl() { // Restore the original window procedure on cleanup - SetWindowLongPtr(m_hSelf, GWLP_WNDPROC, (LONG_PTR)m_oldSliderProc); + SetWindowLongPtr(m_hSelf, GWLP_WNDPROC, reinterpret_cast(m_oldSliderProc)); } void SliderCtrl::OnInit(HWND hParent, int sliderID, int sliderInfoID) diff --git a/src/NppJsonViewer/SliderCtrl.h b/src/NppJsonViewer/SliderCtrl.h index a9ebc9d..c1f3e66 100644 --- a/src/NppJsonViewer/SliderCtrl.h +++ b/src/NppJsonViewer/SliderCtrl.h @@ -48,5 +48,5 @@ class SliderCtrl private: // Static window procedure for the slider - static INT_PTR CALLBACK runWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK runWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); }; From 9f7e5b92759dd3b4f3d36d0488a18a0c75eda208 Mon Sep 17 00:00:00 2001 From: SinghRajenM Date: Thu, 14 Nov 2024 10:08:02 +0530 Subject: [PATCH 7/7] Fix ui fluctuations --- src/NppJsonViewer/JsonViewDlg.cpp | 14 +++++++++++--- src/NppJsonViewer/SliderCtrl.cpp | 1 + src/NppJsonViewer/SliderCtrl.h | 1 + src/NppJsonViewer/resource.rc | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/NppJsonViewer/JsonViewDlg.cpp b/src/NppJsonViewer/JsonViewDlg.cpp index 3896f0d..4080af0 100644 --- a/src/NppJsonViewer/JsonViewDlg.cpp +++ b/src/NppJsonViewer/JsonViewDlg.cpp @@ -941,8 +941,9 @@ void JsonViewDlg::HandleZoomOnScroll(WPARAM wParam) const int pos = GetZoomLevel(); // Current zoom level int delta = GET_WHEEL_DELTA_WPARAM(wParam); - const auto& zoomRange = m_pTreeViewZoom->GetRange(); - const bool isZoomIn = delta > 0; + const auto& zoomRange = m_pTreeViewZoom->GetRange(); + const bool isZoomIn = delta > 0; + bool bRefreshUI = true; if (isZoomIn && pos < zoomRange.m_nMaxZoom) { @@ -952,8 +953,15 @@ void JsonViewDlg::HandleZoomOnScroll(WPARAM wParam) const { pos -= 10; // Zoom out } + else + { + bRefreshUI = false; + } - UpdateUIOnZoom(pos); + if (bRefreshUI) + { + UpdateUIOnZoom(pos); + } } void JsonViewDlg::HandleTreeEvents(LPARAM lParam) const diff --git a/src/NppJsonViewer/SliderCtrl.cpp b/src/NppJsonViewer/SliderCtrl.cpp index 91103ba..e041f7e 100644 --- a/src/NppJsonViewer/SliderCtrl.cpp +++ b/src/NppJsonViewer/SliderCtrl.cpp @@ -22,6 +22,7 @@ void SliderCtrl::OnInit(HWND hParent, int sliderID, int sliderInfoID) // Set slider range and initial position SendMessage(m_hSelf, TBM_SETRANGE, TRUE, MAKELPARAM(m_sliderRange.m_nMinZoom, m_sliderRange.m_nMaxZoom)); SendMessage(m_hSelf, TBM_SETPOS, TRUE, m_sliderRange.m_nDefault); + SendMessage(m_hSelf, TBM_SETPAGESIZE, 0, m_sliderRange.m_nSteps); UpdateInfo(m_sliderRange.m_nDefault); diff --git a/src/NppJsonViewer/SliderCtrl.h b/src/NppJsonViewer/SliderCtrl.h index c1f3e66..e8e3c74 100644 --- a/src/NppJsonViewer/SliderCtrl.h +++ b/src/NppJsonViewer/SliderCtrl.h @@ -9,6 +9,7 @@ struct SliderRange int m_nDefault = 100; int m_nMinZoom = 80; int m_nMaxZoom = 250; + int m_nSteps = 10; }; // namespace SliderRange class SliderCtrl diff --git a/src/NppJsonViewer/resource.rc b/src/NppJsonViewer/resource.rc index e7e454c..0222e52 100644 --- a/src/NppJsonViewer/resource.rc +++ b/src/NppJsonViewer/resource.rc @@ -88,7 +88,7 @@ BEGIN CONTROL "",IDC_DIVIDER,"Static",SS_ETCHEDVERT,56,1,2,16 EDITTEXT IDC_EDT_SEARCH,60,2,99,12,ES_AUTOHSCROLL PUSHBUTTON "",IDC_BTN_SEARCH,160,2,16,12,BS_ICON - CONTROL "",IDC_ZOOM_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_NOTICKS,2,16,58,12 + CONTROL "",IDC_ZOOM_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,2,16,58,12 RTEXT "100%",IDC_ZOOM_PERCENT,60,16,22,12,SS_NOTIFY | NOT WS_GROUP,WS_EX_RIGHT CONTROL "",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_HSCROLL | WS_TABSTOP,2,30,173,264,WS_EX_CLIENTEDGE EDITTEXT IDC_EDT_NODEPATH,2,296,173,12,ES_AUTOHSCROLL | ES_READONLY