From dee3a413f072e5779fc5ba80692f895ba43815c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Wed, 3 Aug 2022 19:22:40 +0200 Subject: Clean up Dragger. --- c/layout.cpp | 16 ++++++++++++++-- c/layout.h | 43 +++++++++++++++++++++++++++++++------------ c/listview.cpp | 2 +- c/main.cpp | 2 +- 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/c/layout.cpp b/c/layout.cpp index 4da7cd8..94978bb 100644 --- a/c/layout.cpp +++ b/c/layout.cpp @@ -38,7 +38,7 @@ void UpdateLayout(int w, int h) RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN); } -bool Dragger::InDragArea(const int x, const int y) +bool DlvDragger::InDragArea(const int x, const int y) { RECT rrDlv; require(GetRelativeRect(g_dlv->hWnd, &rrDlv)); @@ -50,7 +50,7 @@ bool Dragger::InDragArea(const int x, const int y) return true; } -void Dragger::Drag(const int, const int y) +void DlvDragger::Drag(const int, const int y) { RECT rrDlv; require(GetRelativeRect(g_dlv->hWnd, &rrDlv)); @@ -64,3 +64,15 @@ void Dragger::Drag(const int, const int y) RedrawWindow(g_hWnd, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN|RDW_UPDATENOW); } + +void DlvDragger::Reset() +{ + g_dlv->SetHeight(0); + Pl("cfg","set_dlv_height",0); + UpdateLayout(); +} + +void DlvDragger::Done() +{ + Pl("cfg","set_dlv_height",g_dlv->Height()); +} diff --git a/c/layout.h b/c/layout.h index 1b78945..47702c4 100644 --- a/c/layout.h +++ b/c/layout.h @@ -9,19 +9,39 @@ void UpdateLayout(int w = 0, int h = 0); +/* Draggable portions of the client area, such as the split between + * two list views, are implemented in Dragger singletons. + * + * HandleDown and HandleMove are called by the relevant window + * procedures for WM_(NC)LBUTTONDOWN and WM_SETCURSOR. */ + struct Dragger { bool HandleDown(); bool HandleMove(); -private: - bool InDragArea(int x, int y); +protected: bool IsDown(); bool IsDouble(); - void Drag(int x, int y); + virtual bool InDragArea(int x, int y); + virtual void Drag(int x, int y); + virtual void Reset(); + virtual void Done(); +private: bool m_bActive = false; long m_time = 0; }; +/* Dragger for data list view (upper border). */ + +struct DlvDragger : public Dragger +{ +private: + bool InDragArea(int x, int y) override; + void Drag(int x, int y) override; + void Reset() override; + void Done() override; +}; + inline bool Dragger::IsDouble() { const long time = GetMessageTime(); @@ -43,13 +63,12 @@ inline bool Dragger::HandleDown() if (!InDragArea(pt.x, pt.y)) return false; if (IsDouble()) { - extern DataListView* g_dlv; - g_dlv->SetHeight(0); - Pl("cfg","set_dlv_height",0); - UpdateLayout(); - return false; + m_bActive = false; + Reset(); } else - return m_bActive = true; + m_bActive = true; + + return m_bActive; } inline bool Dragger::HandleMove() @@ -64,12 +83,12 @@ inline bool Dragger::HandleMove() SetCursor(g_hcSizeNs); else r = false; - if (!m_bActive) return r; + if (!m_bActive) + return r; Drag(pt.x, pt.y); if (!IsDown()) { - extern DataListView* g_dlv; m_bActive = false; - Pl("cfg","set_dlv_height",g_dlv->Height()); + Done(); } return r; } diff --git a/c/listview.cpp b/c/listview.cpp index e5d22b2..531e9dd 100644 --- a/c/listview.cpp +++ b/c/listview.cpp @@ -67,7 +67,7 @@ void ListView::UpdateTheme(const BOOL bThemeActive) LRESULT CALLBACK ListView::WndProc(const HWND hWnd, const UINT uMsg, const WPARAM wParam, const LPARAM lParam) { - extern Dragger g_dragDlv; + extern DlvDragger g_dragDlv; switch (uMsg) { case WM_NOTIFY: switch (((NMHDR*)lParam)->code) { diff --git a/c/main.cpp b/c/main.cpp index d73a08a..79fb8eb 100644 --- a/c/main.cpp +++ b/c/main.cpp @@ -36,7 +36,7 @@ DataListView* g_dlv; EpisodeListView* g_elv; /* Layout handlers. */ -Dragger g_dragDlv; +DlvDragger g_dragDlv; /* View settings. */ int g_bViewWatched = 1; -- cgit v1.2.3