diff --git a/BeefLibs/Beefy2D/src/theme/dark/DarkButton.bf b/BeefLibs/Beefy2D/src/theme/dark/DarkButton.bf index bf614a01..fba05cc0 100644 --- a/BeefLibs/Beefy2D/src/theme/dark/DarkButton.bf +++ b/BeefLibs/Beefy2D/src/theme/dark/DarkButton.bf @@ -35,7 +35,7 @@ namespace Beefy.theme.dark if (DarkTheme.CheckUnderlineKeyCode(mLabel, keyCode)) { mDrawDownPct = 1.0f; - MouseClicked(0, 0, 3); + MouseClicked(0, 0, 0, 0, 3); return true; } return false; diff --git a/BeefLibs/Beefy2D/src/theme/dark/DarkTabbedView.bf b/BeefLibs/Beefy2D/src/theme/dark/DarkTabbedView.bf index fe7c5680..14882ee1 100644 --- a/BeefLibs/Beefy2D/src/theme/dark/DarkTabbedView.bf +++ b/BeefLibs/Beefy2D/src/theme/dark/DarkTabbedView.bf @@ -30,9 +30,9 @@ namespace Beefy.theme.dark g.Draw(DarkTheme.sDarkTheme.GetImage(DarkTheme.ImageIdx.Close), GS!(-4), GS!(-4)); } - public override void MouseClicked(float x, float y, int32 btn) + public override void MouseClicked(float x, float y, float origX, float origY, int32 btn) { - base.MouseClicked(x, y, btn); + base.MouseClicked(x, y, origX, origY, btn); var tabButton = (DarkTabButton)mParent; if (tabButton.mCloseClickedEvent.HasListeners) @@ -312,7 +312,7 @@ namespace Beefy.theme.dark { if (mMenuClosedTick != mUpdateCnt) { - ShowMenu(mMenuButton.mX + GS!(14), mMenuButton.mY + GS!(6)); + ShowMenu(mMenuButton.mX + GS!(14), mMenuButton.mY + GS!(14)); } } diff --git a/BeefLibs/Beefy2D/src/widgets/ButtonWidget.bf b/BeefLibs/Beefy2D/src/widgets/ButtonWidget.bf index 6dbac60e..b7fc15be 100644 --- a/BeefLibs/Beefy2D/src/widgets/ButtonWidget.bf +++ b/BeefLibs/Beefy2D/src/widgets/ButtonWidget.bf @@ -19,7 +19,10 @@ namespace Beefy.widgets base.KeyDown(keyCode, isRepeat); if ((keyCode == KeyCode.Return) || (keyCode == KeyCode.Space)) - MouseDown(0, 0, 3, 1); + { + MouseDown(0, 0, 3, 1); + MouseClicked(0, 0, 0, 0, 3); + } else mParent.KeyDown(keyCode, isRepeat); } diff --git a/BeefLibs/Beefy2D/src/widgets/Dialog.bf b/BeefLibs/Beefy2D/src/widgets/Dialog.bf index 3c84cf26..1dad129b 100644 --- a/BeefLibs/Beefy2D/src/widgets/Dialog.bf +++ b/BeefLibs/Beefy2D/src/widgets/Dialog.bf @@ -184,7 +184,7 @@ namespace Beefy.widgets protected void EditCancelHandler(EditEvent theEvent) { if (mEscButton != null) - mEscButton.MouseClicked(0, 0, 3); + mEscButton.MouseClicked(0, 0, 0, 0, 3); } public virtual void AddCloseButton(DialogEventHandler closeHandler, int32 theDefault = -1) @@ -310,13 +310,13 @@ namespace Beefy.widgets public virtual void Escape() { - mEscButton.MouseClicked(0, 0, 3); + mEscButton.MouseClicked(0, 0, 0, 0, 3); } public virtual void Submit() { if ((mDefaultButton != null) && (!mDefaultButton.mDisabled)) - mDefaultButton.MouseClicked(0, 0, 3); + mDefaultButton.MouseClicked(0, 0, 0, 0, 3); } void WindowKeyDown(KeyDownEvent evt) diff --git a/BeefLibs/Beefy2D/src/widgets/ListView.bf b/BeefLibs/Beefy2D/src/widgets/ListView.bf index 366b6a50..8e0c6ddb 100644 --- a/BeefLibs/Beefy2D/src/widgets/ListView.bf +++ b/BeefLibs/Beefy2D/src/widgets/ListView.bf @@ -637,9 +637,9 @@ namespace Beefy.widgets } - public override void MouseClicked(float x, float y, int32 btn) + public override void MouseClicked(float x, float y, float origX, float origY, int32 btn) { - base.MouseClicked(x, y, btn); + base.MouseClicked(x, y, origX, origY, btn); if (mParentItem != null) // Don't notify for root mListView.mOnItemMouseClicked(this, x, y, btn); } diff --git a/BeefLibs/Beefy2D/src/widgets/Widget.bf b/BeefLibs/Beefy2D/src/widgets/Widget.bf index b1128e9b..025c42ff 100644 --- a/BeefLibs/Beefy2D/src/widgets/Widget.bf +++ b/BeefLibs/Beefy2D/src/widgets/Widget.bf @@ -695,7 +695,7 @@ namespace Beefy.widgets } } - public virtual void MouseClicked(float x, float y, int32 btn) + public virtual void MouseClicked(float x, float y, float origX, float origY, int32 btn) { if (mOnMouseClick.HasListeners) { @@ -734,9 +734,6 @@ namespace Beefy.widgets if ((hadPhysMouseDown) && (!hasPhysMouseDown)) ReleaseMouseCapture(); - if ((mMouseOver) || (btn == 3)) - MouseClicked(x, y, btn); - if (mOnMouseUp.HasListeners) { MouseEvent mouseEvent = scope MouseEvent(); diff --git a/BeefLibs/Beefy2D/src/widgets/WidgetWindow.bf b/BeefLibs/Beefy2D/src/widgets/WidgetWindow.bf index 405e8dc9..93f64465 100644 --- a/BeefLibs/Beefy2D/src/widgets/WidgetWindow.bf +++ b/BeefLibs/Beefy2D/src/widgets/WidgetWindow.bf @@ -52,6 +52,8 @@ namespace Beefy.widgets public int32 mClientMouseY; public float mMouseX; public float mMouseY; + public float mMouseDownX; + public float mMouseDownY; public bool mIsMouseMoving; public bool mHasMouseInside; public bool mHasProxyMouseInside; @@ -623,6 +625,8 @@ namespace Beefy.widgets public override void MouseDown(int32 inX, int32 inY, int32 btn, int32 btnCount) { + let oldFlags = mMouseFlags; + mMouseFlags |= (MouseFlag)(1 << btn); if ((!mHasFocus) && (mParent == null)) { @@ -637,6 +641,12 @@ namespace Beefy.widgets MouseMove(inX, inY); + if (oldFlags == default) + { + mMouseDownX = mMouseX; + mMouseDownY = mMouseY; + } + if ((mOnMouseDown.HasListeners) || (sOnMouseDown.HasListeners)) { MouseEvent anEvent = scope MouseEvent(); @@ -672,11 +682,22 @@ namespace Beefy.widgets Widget aWidget = mCaptureWidget ?? mOverWidget; if (aWidget != null) { - float childX; - float childY; - aWidget.RootToSelfTranslate(mMouseX, mMouseY, out childX, out childY); - aWidget.MouseUp(childX, childY, btn); + float origX; + float origY; + aWidget.RootToSelfTranslate(mMouseDownX, mMouseDownY, out origX, out origY); + aWidget.MouseUp(origX, origY, btn); + + float childX; + float childY; + aWidget.RootToSelfTranslate(mMouseX, mMouseY, out childX, out childY); + aWidget.MouseUp(childX, childY, btn); + + if (aWidget.mMouseOver) + { + aWidget.MouseClicked(childX, childY, origX, origY, btn); + } } + } public void ReleaseMouseCaptures() diff --git a/IDE/src/ScriptManager.bf b/IDE/src/ScriptManager.bf index 7460ec9b..30a2d839 100644 --- a/IDE/src/ScriptManager.bf +++ b/IDE/src/ScriptManager.bf @@ -1396,7 +1396,7 @@ namespace IDE { if (button.Label == buttonName) { - button.MouseClicked(0, 0, 0); + button.MouseClicked(0, 0, 0, 0, 0); return; } } diff --git a/IDE/src/ui/DisassemblyPanel.bf b/IDE/src/ui/DisassemblyPanel.bf index abd66ef6..fdb5c3de 100644 --- a/IDE/src/ui/DisassemblyPanel.bf +++ b/IDE/src/ui/DisassemblyPanel.bf @@ -23,9 +23,9 @@ namespace IDE.ui public float mJmpIconY; public int mJmpState = -1; - public override void MouseClicked(float x, float y, int32 btn) + public override void MouseClicked(float x, float y, float origX, float origY, int32 btn) { - base.MouseClicked(x, y, btn); + base.MouseClicked(x, y, origX, origY, btn); if (btn == 1) { diff --git a/IDE/src/ui/MemoryPanel.bf b/IDE/src/ui/MemoryPanel.bf index c534d7b5..cc09ea65 100644 --- a/IDE/src/ui/MemoryPanel.bf +++ b/IDE/src/ui/MemoryPanel.bf @@ -1217,9 +1217,9 @@ namespace IDE.ui base.DrawAll(g); } - public override void MouseClicked(float x, float y, int32 btn) + public override void MouseClicked(float x, float y, float origX, float origY, int32 btn) { - base.MouseClicked(x, y, btn); + base.MouseClicked(x, y, origX, origY, btn); if (btn == 1) // { diff --git a/IDE/src/ui/OutputWidget.bf b/IDE/src/ui/OutputWidget.bf index f4f3735b..da291687 100644 --- a/IDE/src/ui/OutputWidget.bf +++ b/IDE/src/ui/OutputWidget.bf @@ -195,9 +195,9 @@ namespace IDE.ui return false; } - public override void MouseClicked(float x, float y, int32 btn) + public override void MouseClicked(float x, float y, float origX, float origY, int32 btn) { - base.MouseClicked(x, y, btn); + base.MouseClicked(x, y, origX, origY, btn); if (btn == 1) { @@ -241,7 +241,7 @@ namespace IDE.ui if (keyCode == .Apps) { GetTextCoordAtCursor(var x, var y); - MouseClicked(x, y, 1); + MouseClicked(x, y, x, y, 1); } } } diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index 7ae6c3b4..09f852c2 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/IDE/src/ui/SourceEditWidgetContent.bf @@ -2762,7 +2762,7 @@ namespace IDE.ui if (keyCode == KeyCode.Apps) { GetTextCoordAtCursor(var x, var y); - MouseClicked(x, y, 1); + MouseClicked(x, y, x, y, 1); return; } @@ -2957,14 +2957,14 @@ namespace IDE.ui IDEUtils.ClampMenuCoords(ref x, ref y, mEditWidget, scope .(0, 0, GetLineHeight(0), GS!(32))); } - public override void MouseClicked(float x, float y, int32 btn) + public override void MouseClicked(float x, float y, float origX, float origY, int32 btn) { - base.MouseClicked(x, y, btn); + base.MouseClicked(x, y, origX, origY, btn); var useX = x; var useY = y; - if ((btn == 0) && (mWidgetWindow.IsKeyDown(.Control))) + if ((btn == 0) && (mWidgetWindow.IsKeyDown(.Control)) && (x == origX) && (y == origY)) { gApp.GoToDefinition(); return; diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index 06930452..1ecc2d08 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/IDE/src/ui/SourceViewPanel.bf @@ -6175,9 +6175,9 @@ namespace IDE.ui return true; } - public override void MouseClicked(float x, float y, int32 btn) + public override void MouseClicked(float x, float y, float origX, float origY, int32 btn) { - base.MouseClicked(x, y, btn); + base.MouseClicked(x, y, origX, origY, btn); if (btn == 0) { @@ -6277,5 +6277,26 @@ namespace IDE.ui idx++; } } + + public bool HasTextAtCursor() + { + let ewc = mEditWidget.mEditWidgetContent; + int textPos = mEditWidget.mEditWidgetContent.CursorTextPos; + if (textPos >= ewc.mData.mTextLength) + return false; + + for (int offset = -1; offset <= 0; offset++) + { + int checkPos = textPos + offset; + if (checkPos < 0) + continue; + + let c = ewc.mData.mText[checkPos].mChar; + if ((c.IsLetterOrDigit) || (c == '_') || (c == '@')) + return true; + } + + return false; + } } } diff --git a/IDE/src/ui/WelcomePanel.bf b/IDE/src/ui/WelcomePanel.bf index 9665e5a2..8ec896d4 100644 --- a/IDE/src/ui/WelcomePanel.bf +++ b/IDE/src/ui/WelcomePanel.bf @@ -36,9 +36,9 @@ namespace IDE.ui gApp.SetCursor(.Pointer); } - public override void MouseClicked(float x, float y, int32 btn) + public override void MouseClicked(float x, float y, float origX, float origY, int32 btn) { - base.MouseClicked(x, y, btn); + base.MouseClicked(x, y, origX, origY, btn); gApp.[Friend]mDeferredOpen = .Workspace; String.NewOrSet!(gApp.[Friend]mDeferredOpenFileName, mPath);