#include #include "episodelistview.h" #include "datalistview.h" #include "layout.h" #include "win.h" extern HWND g_hWnd; extern HWND g_hWndStatus; extern EpisodeListView* g_elv; extern DataListView* g_dlv; void UpdateLayout(int w, int h) { if (!g_hWndStatus) return; RECT rc, rrStatus; if (w && h) rc = {0, 0, w, h}; else require(GetClientRect(g_hWnd, &rc)); require(GetRelativeRect(g_hWndStatus, &rrStatus)); SendMessage(g_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); /* Resize status bar parts. */ const int aParts[] = {rc.right-Dpi(55), rc.right}; SendMessage(g_hWndStatus, SB_SETPARTS, (WPARAM)sizeof(aParts), (LPARAM)aParts); SendMessage(g_hWnd, WM_SETREDRAW, TRUE, 0); RedrawWindow(g_hWnd, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN); } bool DlvDragger::InDragArea(const int x, const int y) { RECT rrDlv; require(GetRelativeRect(g_dlv->hWnd, &rrDlv)); const int pad = EBIsThemeActive()? Dpi(6): 0; const int extra = EBIsThemeActive()? 0: Dpi(2); if (x < rrDlv.left || x > rrDlv.right) return false; if (y < rrDlv.top-pad*2-extra*3 || y > rrDlv.top+extra) return false; return true; } void DlvDragger::Drag(const int, const int y) { RECT rrDlv; require(GetRelativeRect(g_dlv->hWnd, &rrDlv)); if (y < Dpi(50) || y > rrDlv.bottom-Dpi(20)) return; int h; h = rrDlv.bottom-y; g_dlv->SetHeight(h); UpdateLayout(); 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()); }