From 50244bf4000525e9659b7127e19589d898c497d4 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 16 May 2020 10:11:04 -0700 Subject: [PATCH] Triple-click to select line --- BeefLibs/Beefy2D/src/widgets/EditWidget.bf | 7 ++- BeefySysLib/BFWindow.cpp | 5 ++ BeefySysLib/BFWindow.h | 10 ++++ BeefySysLib/platform/win/WinBFApp.cpp | 63 +++++++++++----------- 4 files changed, 52 insertions(+), 33 deletions(-) diff --git a/BeefLibs/Beefy2D/src/widgets/EditWidget.bf b/BeefLibs/Beefy2D/src/widgets/EditWidget.bf index 40865ae6..c32590fe 100644 --- a/BeefLibs/Beefy2D/src/widgets/EditWidget.bf +++ b/BeefLibs/Beefy2D/src/widgets/EditWidget.bf @@ -743,7 +743,12 @@ namespace Beefy.widgets //PrintF("~TestStruct() %d\n", mInner.mVal1); - if ((btnCount > 1) && (!mWidgetWindow.IsKeyDown(KeyCode.Shift))) + if ((btn == 0) && (btnCount >= 3) && (!mWidgetWindow.IsKeyDown(KeyCode.Shift))) + { + GetLinePosition(CursorLineAndColumn.mLine, var lineStart, var lineEnd); + mSelection = EditSelection(lineStart, lineEnd); + } + else if ((btn == 0) && (btnCount >= 2) && (!mWidgetWindow.IsKeyDown(KeyCode.Shift))) { // Select word StartSelection(); diff --git a/BeefySysLib/BFWindow.cpp b/BeefySysLib/BFWindow.cpp index a816d0eb..e892a418 100644 --- a/BeefySysLib/BFWindow.cpp +++ b/BeefySysLib/BFWindow.cpp @@ -160,7 +160,12 @@ BFWindow::BFWindow() for (int i = 0; i < KEYCODE_MAX; i++) mIsKeyDown[i] = false; for (int i = 0; i < MOUSEBUTTON_MAX; i++) + { mIsMouseDown[i] = false; + mMouseClickCount[i] = 0; + mMouseDownTicks[i] = 0; + mMouseDownCoords[i] = { -1, -1 }; + } } BFWindow::~BFWindow() diff --git a/BeefySysLib/BFWindow.h b/BeefySysLib/BFWindow.h index 22a1de46..af04f1ba 100644 --- a/BeefySysLib/BFWindow.h +++ b/BeefySysLib/BFWindow.h @@ -84,6 +84,12 @@ class BFSysBitmap; class BFWindow; +struct BFCoord +{ + int mX; + int mY; +}; + class BFWindow { public: @@ -92,6 +98,10 @@ public: int mFlags; bool mIsKeyDown[KEYCODE_MAX]; bool mIsMouseDown[MOUSEBUTTON_MAX]; + BFCoord mMouseDownCoords[MOUSEBUTTON_MAX]; + int mMouseClickCount[MOUSEBUTTON_MAX]; + uint32 mMouseDownTicks[MOUSEBUTTON_MAX]; + BFMenu* mMenu; RenderWindow* mRenderWindow; bool mNonExclusiveMouseCapture; diff --git a/BeefySysLib/platform/win/WinBFApp.cpp b/BeefySysLib/platform/win/WinBFApp.cpp index 1af8a47b..05068f1c 100644 --- a/BeefySysLib/platform/win/WinBFApp.cpp +++ b/BeefySysLib/platform/win/WinBFApp.cpp @@ -83,7 +83,7 @@ WinBFWindow::WinBFWindow(BFWindow* parent, const StringImpl& title, int x, int y mMinHeight = 128; WNDCLASSW wc; - wc.style = CS_DBLCLKS; + wc.style = 0; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = NULL; @@ -567,51 +567,50 @@ LRESULT WinBFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar bool checkNonTransparentMousePosition = mNonExclusiveMouseCapture; + auto _BtnDown = [&](int btn) + { + DWORD tickNow = BFTickCount(); + + SetCapture(hWnd); + mIsMouseDown[btn] = true; + BFCoord mouseCoords = { x, y }; + if ((mouseCoords.mX != mMouseDownCoords[btn].mX) || (mouseCoords.mY != mMouseDownCoords[btn].mY) || + (tickNow - mMouseDownTicks[btn] > ::GetDoubleClickTime())) + mMouseClickCount[btn] = 0; + mMouseDownCoords[btn] = mouseCoords; + mMouseClickCount[btn]++; + mMouseDownTicks[btn] = tickNow; + mMouseDownFunc(this, x, y, btn, mMouseClickCount[btn]); + }; + + auto _BtnUp = [&](int btn) + { + releaseCapture = true; + mIsMouseDown[btn] = false; + mMouseUpFunc(this, x, y, btn); + }; + switch (uMsg) { case WM_LBUTTONDOWN: //OutputDebugStrF("WM_LBUTTONDOWN Capture HWnd: %X\n", hWnd); - SetCapture(hWnd); - mIsMouseDown[0] = true; - mMouseDownFunc(this, x, y, 0, 1); + _BtnDown(0); break; case WM_RBUTTONDOWN: //OutputDebugStrF("WM_RBUTTONDOWN Capture HWnd: %X\n", hWnd); - SetCapture(hWnd); - mIsMouseDown[1] = true; - mMouseDownFunc(this, x, y, 1, 1); + _BtnDown(1); break; case WM_MBUTTONDOWN: - SetCapture(hWnd); - mIsMouseDown[2] = true; - mMouseDownFunc(this, x, y, 2, 1); - break; - case WM_LBUTTONDBLCLK: - SetCapture(hWnd); - mMouseDownFunc(this, x, y, 0, 2); - break; - case WM_RBUTTONDBLCLK: - SetCapture(hWnd); - mMouseDownFunc(this, x, y, 1, 2); - break; - case WM_MBUTTONDBLCLK: - SetCapture(hWnd); - mMouseDownFunc(this, x, y, 2, 2); - break; + _BtnDown(2); + break; case WM_LBUTTONUP: - releaseCapture = true; - mIsMouseDown[0] = false; - mMouseUpFunc(this, x, y, 0); + _BtnUp(0); break; case WM_RBUTTONUP: - releaseCapture = true; - mIsMouseDown[1] = false; - mMouseUpFunc(this, x, y, 1); + _BtnUp(1); break; case WM_MBUTTONUP: - releaseCapture = true; - mIsMouseDown[2] = false; - mMouseUpFunc(this, x, y, 2); + _BtnUp(2); break; case WM_MOUSEWHEEL: {