From 9e009b134c3be2b2fb36abefaf068f04fbedcd19 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 23 Jun 2020 15:24:50 -0700 Subject: [PATCH] Scope Prev/Next, other minor improvements --- BeefLibs/Beefy2D/src/widgets/EditWidget.bf | 27 +++++++-- BeefLibs/Beefy2D/src/widgets/Widget.bf | 2 + IDE/src/IDEApp.bf | 14 +++++ IDE/src/Settings.bf | 2 + IDE/src/ui/NavigationBar.bf | 1 + IDE/src/ui/RenameSymbolDialog.bf | 9 +++ IDE/src/ui/SourceEditWidgetContent.bf | 64 ++++++++++++++++++++++ 7 files changed, 115 insertions(+), 4 deletions(-) diff --git a/BeefLibs/Beefy2D/src/widgets/EditWidget.bf b/BeefLibs/Beefy2D/src/widgets/EditWidget.bf index 65325720..d8034c36 100644 --- a/BeefLibs/Beefy2D/src/widgets/EditWidget.bf +++ b/BeefLibs/Beefy2D/src/widgets/EditWidget.bf @@ -519,6 +519,13 @@ namespace Beefy.widgets } } + public enum DragSelectionKind + { + None, + Dragging, + ClickedInside + } + public Data mData ~ _.Deref(this); public Insets mTextInsets = new Insets() ~ delete _; @@ -539,7 +546,8 @@ namespace Beefy.widgets public bool mCursorImplicitlyMoved; public bool mJustInsertedCharPair; // Pressing backspace will delete last char8, even though cursor is between char8 pairs (ie: for brace pairs 'speculatively' inserted) public EditSelection? mSelection; - public EditSelection? mDragSelectionUnion; // For double-clicking a word and then "dragging" the selection + public EditSelection? mDragSelectionUnion; // For double-clicking a word and then "dragging" the selection + public DragSelectionKind mDragSelectionKind; public bool mIsReadOnly = false; public bool mWantsUndo = true; public bool mIsMultiline = false; @@ -730,6 +738,8 @@ namespace Beefy.widgets public override void MouseDown(float x, float y, int32 btn, int32 btnCount) { + bool hadSelection = HasSelection(); + base.MouseDown(x, y, btn, btnCount); mEditWidget.SetFocus(); @@ -786,9 +796,13 @@ namespace Beefy.widgets } else if (!mWidgetWindow.IsKeyDown(KeyCode.Shift)) { - if ((btn != 0) && (mSelection != null) && (CursorTextPos >= mSelection.Value.MinPos) && (CursorTextPos <= mSelection.Value.MaxPos)) + if ((mSelection != null) && (CursorTextPos >= mSelection.Value.MinPos) && (CursorTextPos <= mSelection.Value.MaxPos)) { - // Leave selection + if (hadSelection) + { + // Leave selection + mDragSelectionKind = .ClickedInside; + } } else StartSelection(); @@ -804,6 +818,9 @@ namespace Beefy.widgets if (mMouseFlags == 0) { mDragSelectionUnion = null; + if (mDragSelectionKind == .ClickedInside) + mSelection = EditSelection(); + mDragSelectionKind = .None; } } @@ -815,7 +832,8 @@ namespace Beefy.widgets { MoveCursorToCoord(x, y); ClampCursor(); - SelectToCursor(); + if (mDragSelectionKind == .Dragging) + SelectToCursor(); } } @@ -2866,6 +2884,7 @@ namespace Beefy.widgets public void StartSelection() { + mDragSelectionKind = .Dragging; mSelection = EditSelection(); int textPos; TryGetCursorTextPos(out textPos); diff --git a/BeefLibs/Beefy2D/src/widgets/Widget.bf b/BeefLibs/Beefy2D/src/widgets/Widget.bf index f0c6b9a6..47383c54 100644 --- a/BeefLibs/Beefy2D/src/widgets/Widget.bf +++ b/BeefLibs/Beefy2D/src/widgets/Widget.bf @@ -70,6 +70,7 @@ namespace Beefy.widgets [DesignEditable(SortName="0name")] public String Id { get { return mIdStr; } set { mIdStr = value; } } + public Event mOnGotFocus ~ _.Dispose(); public Event mOnLostFocus ~ _.Dispose(); //public event MouseEventHandler mMouseMoveHandler; public Event mOnMouseDown ~ _.Dispose(); @@ -390,6 +391,7 @@ namespace Beefy.widgets { Debug.Assert(!mHasFocus); mHasFocus = true; + mOnGotFocus(this); } public virtual void LostFocus() diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 97d273c9..ac1d2e37 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -4808,6 +4808,20 @@ namespace IDE mHistoryManager.NextHistory(); } + void ScopePrev() + { + var sewc = GetActiveSourceEditWidgetContent(); + if (sewc != null) + sewc.ScopePrev(); + } + + void ScopeNext() + { + var sewc = GetActiveSourceEditWidgetContent(); + if (sewc != null) + sewc.ScopeNext(); + } + void ExitTest() { sExitTest = true; diff --git a/IDE/src/Settings.bf b/IDE/src/Settings.bf index 7dc442d2..00374e83 100644 --- a/IDE/src/Settings.bf +++ b/IDE/src/Settings.bf @@ -485,6 +485,8 @@ namespace IDE Add("Run Without Compiling", "Ctrl+Shift+F5"); Add("Save All", "Ctrl+Shift+S"); Add("Save File", "Ctrl+S"); + Add("Scope Prev", "Alt+Up"); + Add("Scope Next", "Alt+Down"); Add("Set Next Statement", "Ctrl+Shift+F10"); Add("Show Auto Watches", "Ctrl+Alt+A"); Add("Show Autocomplete Panel", "Ctrl+Alt+U"); diff --git a/IDE/src/ui/NavigationBar.bf b/IDE/src/ui/NavigationBar.bf index 73b9b303..cc54cc66 100644 --- a/IDE/src/ui/NavigationBar.bf +++ b/IDE/src/ui/NavigationBar.bf @@ -52,6 +52,7 @@ namespace IDE.ui MakeEditable(); mEditWidget.mOnContentChanged.Add(new => NavigationBarChanged); mEditWidget.mOnKeyDown.Add(new => EditKeyDownHandler); + mEditWidget.mOnGotFocus.Add(new (widget) => mEditWidget.mEditWidgetContent.SelectAll()); mEditWidget.mEditWidgetContent.mWantsUndo = false; mFocusDropdown = false; } diff --git a/IDE/src/ui/RenameSymbolDialog.bf b/IDE/src/ui/RenameSymbolDialog.bf index f8261b1f..a99d6592 100644 --- a/IDE/src/ui/RenameSymbolDialog.bf +++ b/IDE/src/ui/RenameSymbolDialog.bf @@ -383,6 +383,13 @@ namespace IDE.ui var bfSystem = IDEApp.sApp.mBfResolveSystem; var bfCompiler = IDEApp.sApp.mBfResolveCompiler; + if (mGettingSymbolInfo) + { + gApp.Fail("Cannot rename symbols here"); + mGettingSymbolInfo = false; + return; + } + Debug.Assert(!mGettingSymbolInfo); StopWork(); @@ -855,7 +862,9 @@ namespace IDE.ui if (mSourceViewPanel.[Friend]mWantsFullClassify) hasWorkLeft = true; if (mSourceViewPanel.HasDeferredResolveResults()) + { hasWorkLeft = true; + } if (!hasWorkLeft) { StartWork(); diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index defa5810..2d9da242 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/IDE/src/ui/SourceEditWidgetContent.bf @@ -1521,6 +1521,70 @@ namespace IDE.ui return; } + public void ScopePrev() + { + int pos = CursorTextPos - 1; + int openCount = 0; + + while (pos >= 0) + { + let c = mData.mText[pos].mChar; + let displayType = (SourceElementType)mData.mText[pos].mDisplayTypeId; + + if (displayType == .Normal) + { + if (c == '{') + { + openCount--; + if (openCount <= 0) + { + CursorTextPos = pos; + EnsureCursorVisible(); + break; + } + } + else if (c == '}') + { + openCount++; + } + } + + pos--; + } + } + + public void ScopeNext() + { + int pos = CursorTextPos; + int openCount = 0; + + while (pos < mData.mTextLength) + { + let c = mData.mText[pos].mChar; + let displayType = (SourceElementType)mData.mText[pos].mDisplayTypeId; + + if (displayType == .Normal) + { + if (c == '}') + { + openCount--; + if (openCount <= 0) + { + CursorTextPos = pos + 1; + EnsureCursorVisible(); + break; + } + } + else if (c == '{') + { + openCount++; + } + } + + pos++; + } + } + bool IsTextSpanEmpty(int32 start, int32 length) { for (int32 i = start; i < start + length; i++)