From ae3225a4e7ef86d159fdf27834c453ffcd4da76c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Tue, 2 Aug 2022 20:10:35 +0200 Subject: Implement draggable split. Next step is to allow a double click to reset the split to be automatically resized. --- c/layout.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 c/layout.h (limited to 'c/layout.h') diff --git a/c/layout.h b/c/layout.h new file mode 100644 index 0000000..82189fb --- /dev/null +++ b/c/layout.h @@ -0,0 +1,54 @@ +#ifndef LAYOUT_H +#define LAYOUT_H + +#include + +#include "common.h" + +void UpdateLayout(int w = 0, int h = 0); + +struct Dragger +{ + bool HandleDown(); + bool HandleMove(); +private: + bool InDragArea(int x, int y); + bool IsDown(); + void Drag(int x, int y); + bool m_bActive = false; +}; + +inline bool Dragger::HandleDown() +{ + extern HWND g_hWnd; + POINT pt; + require(GetRelativeCursorPos(g_hWnd, &pt)); + if (!InDragArea(pt.x, pt.y)) return false; + return m_bActive = true; +} + +inline bool Dragger::IsDown() +{ + return GetKeyState(VK_LBUTTON) & 0x8000; +} + +inline bool Dragger::HandleMove() +{ + extern HWND g_hWnd; + POINT pt; + require(GetRelativeCursorPos(g_hWnd, &pt)); + + extern HCURSOR g_hcSizeNs; + bool r = true; + if (InDragArea(pt.x, pt.y)) + SetCursor(g_hcSizeNs); + else + r = false; + if (m_bActive) + Drag(pt.x, pt.y); + if (!IsDown()) + m_bActive = false; + return r; +} + +#endif -- cgit v1.2.3