diff options
Diffstat (limited to 'c/layout.h')
-rw-r--r-- | c/layout.h | 61 |
1 files changed, 5 insertions, 56 deletions
@@ -14,10 +14,14 @@ void UpdateLayout(int w = 0, int h = 0); * HandleSetCursor are called by relevant window procedures upon * WM_(NC)LBUTTONDOWN and WM_SETCURSOR. */ +struct Window; + struct Dragger { + Window& parent; bool HandleLButtonDown(); bool HandleSetCursor(); + inline Dragger(Window& parent) : parent(parent) {} protected: bool IsDown() const; bool IsDouble(const long time, const POINT& pt); @@ -39,6 +43,7 @@ private: struct DlvDragger : public Dragger { + inline DlvDragger(Window& parent) : Dragger(parent) {} private: bool InDragArea(int x, int y) const override; void Drag(int x, int y) const override; @@ -46,60 +51,4 @@ private: void Done() const override; }; -/* Below follows the implementation of the non-virtual member - * functions of Dragger, on which derived objects rely. */ - -inline 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; -} - -inline bool Dragger::IsDown() const -{ - return GetKeyState(VK_LBUTTON) & 0x8000; -} - -inline bool Dragger::HandleLButtonDown() -{ - extern HWND g_hWnd; - POINT pt; - Require(GetRelativeCursorPos(g_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; -} - -inline bool Dragger::HandleSetCursor() -{ - 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) - return r; - Drag(pt.x, pt.y); - if (!IsDown()) { - m_bActive = false; - Done(); - } - return r; -} - #endif |