aboutsummaryrefslogtreecommitdiff
path: root/c/layout.cpp
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2022-09-02 02:11:49 +0200
committerJohn Ankarström <john@ankarstrom.se>2022-09-02 02:14:11 +0200
commit90c7bc237c9cf964c16f0cb48c308a92a8193a5c (patch)
tree53f165056dffa061a9dfe39b76913edab87056f4 /c/layout.cpp
parentbb9280267bfb78a8d69adea02f5ed7894833b19d (diff)
downloadEpisodeBrowser-90c7bc237c9cf964c16f0cb48c308a92a8193a5c.tar.gz
Use global Window object.
This makes it easier to control initialization and maintain RAII.
Diffstat (limited to 'c/layout.cpp')
-rw-r--r--c/layout.cpp90
1 files changed, 69 insertions, 21 deletions
diff --git a/c/layout.cpp b/c/layout.cpp
index 23ee490..e817b23 100644
--- a/c/layout.cpp
+++ b/c/layout.cpp
@@ -3,12 +3,11 @@
#include "episodelistview.h"
#include "datalistview.h"
#include "layout.h"
+#include "main.h"
#include "win.h"
-extern HWND g_hWnd;
+extern Window* g_window;
extern HWND g_hWndStatus;
-extern EpisodeListView* g_elv;
-extern DataListView* g_dlv;
void UpdateLayout(int w, int h)
{
@@ -16,33 +15,84 @@ void UpdateLayout(int w, int h)
RECT rc, rrStatus;
if (w && h) rc = {0, 0, w, h};
- else Require(GetClientRect(g_hWnd, &rc));
+ else Require(GetClientRect(g_window->hWnd, &rc));
Require(GetRelativeRect(g_hWndStatus, &rrStatus));
- SendMessageW(g_hWnd, WM_SETREDRAW, FALSE, 0);
+ SendMessageW(g_window->hWnd, WM_SETREDRAW, FALSE, 0);
/* Resize list views. */
const long pad = EBIsThemeActive()? Dpi(6): 0; /* Add padding in modern themes. */
- const long cyDlv = rrStatus.top-g_dlv->Height()-pad;
- Require(SetWindowRect(g_dlv->hWnd, pad, cyDlv, rc.right-pad, rrStatus.top-pad));
- Require(SetWindowRect(g_elv->hWnd, pad, pad, rc.right-pad, cyDlv-pad));
- g_dlv->ResizeColumns(rc.right-pad-pad);
- g_elv->ResizeColumns(rc.right-pad-pad);
+ const long cyDlv = rrStatus.top-g_window->dlv.Height()-pad;
+ Require(SetWindowRect(g_window->dlv.hWnd, pad, cyDlv, rc.right-pad, rrStatus.top-pad));
+ Require(SetWindowRect(g_window->elv.hWnd, pad, pad, rc.right-pad, cyDlv-pad));
+ g_window->dlv.ResizeColumns(rc.right-pad-pad);
+ g_window->elv.ResizeColumns(rc.right-pad-pad);
/* Resize status bar parts. */
const int aParts[] = {rc.right-Dpi(55), rc.right};
SendMessageW(g_hWndStatus, SB_SETPARTS,
sizeof(aParts), reinterpret_cast<LPARAM>(aParts));
- SendMessageW(g_hWnd, WM_SETREDRAW, TRUE, 0);
- RedrawWindow(g_hWnd, nullptr, nullptr,
+ SendMessageW(g_window->hWnd, WM_SETREDRAW, TRUE, 0);
+ RedrawWindow(g_window->hWnd, nullptr, nullptr,
RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN);
}
+bool Dragger::IsDouble(const long time, const POINT& pt)
+{
+ const bool dbl = time-m_time0 <= static_cast<long>(GetDoubleClickTime())
+ && abs(pt.x-m_pt0.x) <= Metric<SM_CXDOUBLECLK>
+ && abs(pt.y-m_pt0.y) <= Metric<SM_CYDOUBLECLK>;
+ m_time0 = time;
+ m_pt0 = std::move(pt);
+ return dbl;
+}
+
+bool Dragger::IsDown() const
+{
+ return GetKeyState(VK_LBUTTON) & 0x8000;
+}
+
+bool Dragger::HandleLButtonDown()
+{
+ POINT pt;
+ Require(GetRelativeCursorPos(parent.hWnd, &pt));
+ if (!InDragArea(pt.x, pt.y)) return false;
+
+ if (IsDouble(GetMessageTime(), pt)) {
+ m_bActive = false;
+ Reset();
+ } else
+ m_bActive = true;
+
+ return m_bActive;
+}
+
+bool Dragger::HandleSetCursor()
+{
+ POINT pt;
+ Require(GetRelativeCursorPos(parent.hWnd, &pt));
+
+ extern HCURSOR g_hcSizeNs;
+ bool r = true;
+ if (InDragArea(pt.x, pt.y))
+ SetCursor(g_hcSizeNs);
+ else
+ r = false;
+ if (!m_bActive)
+ return r;
+ Drag(pt.x, pt.y);
+ if (!IsDown()) {
+ m_bActive = false;
+ Done();
+ }
+ return r;
+}
+
bool DlvDragger::InDragArea(const int x, const int y) const
{
RECT rrDlv;
- Require(GetRelativeRect(g_dlv->hWnd, &rrDlv));
+ Require(GetRelativeRect(g_window->dlv.hWnd, &rrDlv));
const int pad = EBIsThemeActive()? Dpi(6): 0;
const int extra = EBIsThemeActive()? 0: Dpi(2);
@@ -54,28 +104,26 @@ bool DlvDragger::InDragArea(const int x, const int y) const
void DlvDragger::Drag(const int, const int y) const
{
RECT rrDlv;
- Require(GetRelativeRect(g_dlv->hWnd, &rrDlv));
+ Require(GetRelativeRect(g_window->dlv.hWnd, &rrDlv));
if (y < Dpi(50) || y > rrDlv.bottom-Dpi(20)) return;
int h;
h = rrDlv.bottom-y;
- g_dlv->SetHeight(h);
+ g_window->dlv.SetHeight(h);
UpdateLayout();
- RedrawWindow(g_hWnd, nullptr, nullptr,
+ RedrawWindow(g_window->hWnd, nullptr, nullptr,
RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN|RDW_UPDATENOW);
}
void DlvDragger::Reset() const
{
- extern CfgA& g_cfg;
- g_dlv->SetHeight(0);
- g_cfg.heightDlv = 0;
+ g_window->dlv.SetHeight(0);
+ g_window->cfg.heightDlv = 0;
UpdateLayout();
}
void DlvDragger::Done() const
{
- extern CfgA& g_cfg;
- g_cfg.heightDlv = g_dlv->Height();
+ g_window->cfg.heightDlv = g_window->dlv.Height();
}