diff --git a/BeefLibs/Beefy2D/src/theme/dark/DarkEditWidget.bf b/BeefLibs/Beefy2D/src/theme/dark/DarkEditWidget.bf index 847e969e..41cd7c18 100644 --- a/BeefLibs/Beefy2D/src/theme/dark/DarkEditWidget.bf +++ b/BeefLibs/Beefy2D/src/theme/dark/DarkEditWidget.bf @@ -759,7 +759,7 @@ namespace Beefy.theme.dark return val; } - public void CheckRecordScrollTop() + public void CheckRecordScrollTop(bool force = false) { if (mWantsCheckScrollPosition) { @@ -784,7 +784,7 @@ namespace Beefy.theme.dark mWantsCheckScrollPosition = false; } - if (mEditWidget.mHasFocus) + if ((mEditWidget.mHasFocus) && (!force)) { mTopCharId = -1; } diff --git a/BeefLibs/Beefy2D/src/widgets/EditWidget.bf b/BeefLibs/Beefy2D/src/widgets/EditWidget.bf index fc9c5a97..e2251120 100644 --- a/BeefLibs/Beefy2D/src/widgets/EditWidget.bf +++ b/BeefLibs/Beefy2D/src/widgets/EditWidget.bf @@ -941,8 +941,8 @@ namespace Beefy.widgets { #unwarn int cursorPos = CursorTextPos; - if (mCursorTextPos >= index) - mCursorTextPos = Math.Clamp(mCursorTextPos + (int32)ofs, 0, mData.mTextLength + 1); + if (cursorPos >= index) + CursorTextPos = Math.Clamp(mCursorTextPos + (int32)ofs, 0, mData.mTextLength + 1); if (HasSelection()) { if (((ofs > 0) && (mSelection.Value.mStartPos >= index)) || diff --git a/IDE/src/ui/AutoComplete.bf b/IDE/src/ui/AutoComplete.bf index 9af94002..d5cfe23e 100644 --- a/IDE/src/ui/AutoComplete.bf +++ b/IDE/src/ui/AutoComplete.bf @@ -2287,17 +2287,22 @@ namespace IDE.ui return; } + var targetSourceEditWidgetContent = mTargetEditWidget.Content as SourceEditWidgetContent; + var sourceEditWidgetContent = targetSourceEditWidgetContent; + var prevCursorPosition = sourceEditWidgetContent.CursorTextPos; + var prevScrollPos = mTargetEditWidget.mVertPos.mDest; + UndoBatchStart undoBatchStart = null; var parts = String.StackSplit!(data, '|'); + String fixitKind = parts[0]; String fixitFileName = parts[1]; SourceViewPanel sourceViewPanel = IDEApp.sApp.ShowSourceFile(fixitFileName); + bool focusChange = !fixitKind.StartsWith("."); - var targetSourceEditWidgetContent = mTargetEditWidget.Content as SourceEditWidgetContent; var historyEntry = targetSourceEditWidgetContent.RecordHistoryLocation(); historyEntry.mNoMerge = true; - var sourceEditWidgetContent = targetSourceEditWidgetContent; if (sourceEditWidgetContent.mSourceViewPanel != sourceViewPanel) { sourceEditWidgetContent = (SourceEditWidgetContent)sourceViewPanel.GetActivePanel().EditWidget.mEditWidgetContent; @@ -2305,6 +2310,11 @@ namespace IDE.ui sourceEditWidgetContent.mData.mUndoManager.Add(undoBatchStart); } + if (!focusChange) + { + sourceEditWidgetContent.CheckRecordScrollTop(true); + } + int32 fixitIdx = 0; int32 fixitLen = 0; StringView fixitLocStr = parts[2]; @@ -2325,6 +2335,8 @@ namespace IDE.ui else fixitIdx = int32.Parse(fixitLocStr).GetValueOrDefault(); + int prevTextLength = sourceEditWidgetContent.mData.mTextLength; + int insertCount = 0; int dataIdx = 3; @@ -2358,7 +2370,8 @@ namespace IDE.ui } sourceEditWidgetContent.CursorTextPos = fixitIdx; - sourceEditWidgetContent.EnsureCursorVisible(true, true); + if (focusChange) + sourceEditWidgetContent.EnsureCursorVisible(true, true); if (fixitLen > 0) { @@ -2377,6 +2390,14 @@ namespace IDE.ui } } + if (!focusChange) + { + mTargetEditWidget.VertScrollTo(prevScrollPos, true); + sourceEditWidgetContent.CursorTextPos = prevCursorPosition; + int addedSize = sourceEditWidgetContent.mData.mTextLength - prevTextLength; + sourceEditWidgetContent.[Friend]AdjustCursorsAfterExternalEdit(fixitIdx, addedSize); + } + if (historyEntry != null) { // Make sure when we go back that we'll go back to the insert position diff --git a/IDEHelper/Compiler/BfAutoComplete.cpp b/IDEHelper/Compiler/BfAutoComplete.cpp index beadbcf9..68e248a2 100644 --- a/IDEHelper/Compiler/BfAutoComplete.cpp +++ b/IDEHelper/Compiler/BfAutoComplete.cpp @@ -3267,7 +3267,7 @@ void BfAutoComplete::FixitAddNamespace(BfAstNode* refNode, const StringImpl& nam BfUsingFinder usingFinder; usingFinder.VisitMembers(refNode->GetSourceData()->mRootNode); - AddEntry(AutoCompleteEntry("fixit", StrFormat("using %s;\tusing|%s|%d||using %s;", namespaceStr.c_str(), parserData->mFileName.c_str(), + AddEntry(AutoCompleteEntry("fixit", StrFormat("using %s;\t.using|%s|%d||using %s;", namespaceStr.c_str(), parserData->mFileName.c_str(), usingFinder.mLastIdx, namespaceStr.c_str()).c_str())); } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index a72b1817..c9ba6660 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -2888,7 +2888,7 @@ BfError* BfModule::Warn(int warningNum, const StringImpl& warning, BfAstNode* re if (warningNum != 0) { - mCompiler->mResolvePassData->mAutoComplete->AddEntry(AutoCompleteEntry("fixit", StrFormat("#pragma warning disable %d\tusing|%s|%d||#pragma warning disable %d", + mCompiler->mResolvePassData->mAutoComplete->AddEntry(AutoCompleteEntry("fixit", StrFormat("#pragma warning disable %d\t.pragma|%s|%d||#pragma warning disable %d", warningNum, parser->mFileName.c_str(), 0, warningNum).c_str())); } } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 60c6346a..82f8f909 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -7356,7 +7356,7 @@ void BfModule::CheckTypeRefFixit(BfAstNode* typeRef, const char* appendName) { BfParserData* parser = typeRef->GetSourceData()->ToParserData(); if (parser != NULL) - mCompiler->mResolvePassData->mAutoComplete->AddEntry(AutoCompleteEntry("fixit", StrFormat("using %s;\tusing|%s|%d||using %s;", namespaceStr.c_str(), parser->mFileName.c_str(), usingFinder.mLastIdx, namespaceStr.c_str()).c_str())); + mCompiler->mResolvePassData->mAutoComplete->AddEntry(AutoCompleteEntry("fixit", StrFormat("using %s;\t.using|%s|%d||using %s;", namespaceStr.c_str(), parser->mFileName.c_str(), usingFinder.mLastIdx, namespaceStr.c_str()).c_str())); } } }