diff options
Diffstat (limited to 'c/layout.cpp')
-rw-r--r-- | c/layout.cpp | 90 |
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(); } |