aboutsummaryrefslogtreecommitdiff
path: root/c/drag.cpp
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2022-09-02 20:16:04 +0200
committerJohn Ankarström <john@ankarstrom.se>2022-09-02 20:16:18 +0200
commitbc4cef92d8efbf97a9215122abc2d7247c287f12 (patch)
treea5ca307281c4f143b5f172428c9fd2b629d6b426 /c/drag.cpp
parent5c1c2ce2bdbf9735ad8a4d162609a8c22a4f0954 (diff)
downloadEpisodeBrowser-bc4cef92d8efbf97a9215122abc2d7247c287f12.tar.gz
Improve Window object.
Diffstat (limited to 'c/drag.cpp')
-rw-r--r--c/drag.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/c/drag.cpp b/c/drag.cpp
new file mode 100644
index 0000000..b92429a
--- /dev/null
+++ b/c/drag.cpp
@@ -0,0 +1,97 @@
+#include <windows.h>
+
+#include "datalistview.h"
+#include "drag.h"
+#include "episodelistview.h"
+#include "win32.h"
+#include "window.h"
+
+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(parent.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) const
+{
+ RECT rrDlv;
+ Require(GetRelativeRect(parent.dlv.hWnd, &rrDlv));
+
+ if (y < Dpi(50) || y > rrDlv.bottom-Dpi(20)) return;
+
+ int h;
+ h = rrDlv.bottom-y;
+ parent.dlv.SetHeight(h);
+ parent.UpdateLayout();
+ RedrawWindow(parent.hWnd, nullptr, nullptr,
+ RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN|RDW_UPDATENOW);
+}
+
+void DlvDragger::Reset() const
+{
+ parent.dlv.SetHeight(0);
+ parent.cfg.heightDlv = 0;
+ parent.UpdateLayout();
+}
+
+void DlvDragger::Done() const
+{
+ parent.cfg.heightDlv = parent.dlv.Height();
+}