diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 32104c4d..a426707f 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -1324,7 +1324,7 @@ namespace IDE #endif if (mWakaTime != null) - mWakaTime.QueueFile(path, projectSource.mProject.mProjectName, true); + mWakaTime.QueueFile(path, projectSource.mProject.mProjectName, true); } } return true; @@ -1489,6 +1489,11 @@ namespace IDE { if ((sourceViewPanel.HasUnsavedChanges()) || (forcePath != null)) { + if (gApp.mSettings.mEditorSettings.mFormatOnSave) + { + sourceViewPanel.ReformatDocument(true); + } + if ((forcePath == null) && (sourceViewPanel.mFilePath == null)) { return SaveFileAs(sourceViewPanel); diff --git a/IDE/src/Settings.bf b/IDE/src/Settings.bf index 0327611d..f4342258 100644 --- a/IDE/src/Settings.bf +++ b/IDE/src/Settings.bf @@ -598,6 +598,7 @@ namespace IDE public bool mShowLineNumbers = true; public bool mFreeCursorMovement; public FileRecoveryKind mEnableFileRecovery = .Yes; + public bool mFormatOnSave = false; public void Serialize(StructuredData sd) { @@ -621,6 +622,7 @@ namespace IDE sd.Add("ShowLineNumbers", mShowLineNumbers); sd.Add("FreeCursorMovement", mFreeCursorMovement); sd.Add("EnableFileRecovery", mEnableFileRecovery); + sd.Add("FormatOnSave", mFormatOnSave); } public void Deserialize(StructuredData sd) @@ -648,6 +650,7 @@ namespace IDE sd.Get("ShowLineNumbers", ref mShowLineNumbers); sd.Get("FreeCursorMovement", ref mFreeCursorMovement); sd.GetEnum("EnableFileRecovery", ref mEnableFileRecovery); + sd.Get("FormatOnSave", ref mFormatOnSave); } public void SetDefaults() diff --git a/IDE/src/ui/SettingsDialog.bf b/IDE/src/ui/SettingsDialog.bf index 7c60909f..1ea37e26 100644 --- a/IDE/src/ui/SettingsDialog.bf +++ b/IDE/src/ui/SettingsDialog.bf @@ -123,6 +123,7 @@ namespace IDE.ui AddPropertiesItem(category, "Show Line Numbers", "mShowLineNumbers"); AddPropertiesItem(category, "Free Cursor Movement", "mFreeCursorMovement"); AddPropertiesItem(category, "Enable File Recovery", "mEnableFileRecovery"); + AddPropertiesItem(category, "Format on Save", "mFormatOnSave"); category.Open(true, true); } diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index 98dabf84..38089c74 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/IDE/src/ui/SourceEditWidgetContent.bf @@ -21,6 +21,7 @@ namespace IDE.ui UndoBatchStart mUndoBatchStart; PersistentTextPosition mTrackedCursorPosition; + EditWidgetContent.LineAndColumn? mVirtualCursorPos; PersistentTextPosition mSelStartPostion; PersistentTextPosition mSelEndPostion; @@ -35,6 +36,7 @@ namespace IDE.ui editWidgetContent.mData.mUndoManager.Add(firstUndoAction); editWidgetContent.mData.mUndoManager.Add(new EditWidgetContent.SetCursorAction(editWidgetContent)); + mVirtualCursorPos = editWidgetContent.mVirtualCursorPos; mTrackedCursorPosition = new PersistentTextPosition((int32)editWidgetContent.CursorTextPos); editWidgetContent.PersistentTextPositions.Add(mTrackedCursorPosition); @@ -54,6 +56,10 @@ namespace IDE.ui var editWidgetContent = (SourceEditWidgetContent)mEditWidget.Content; editWidgetContent.CursorTextPos = mTrackedCursorPosition.mIndex; editWidgetContent.PersistentTextPositions.Remove(mTrackedCursorPosition); + + if ((mVirtualCursorPos != null) && (editWidgetContent.CursorLineAndColumn.mColumn == 0)) + editWidgetContent.CursorLineAndColumn = .(editWidgetContent.CursorLineAndColumn.mLine, mVirtualCursorPos.Value.mColumn); + delete mTrackedCursorPosition; if (mSelStartPostion != null) diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index b122f1a2..455fae62 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/IDE/src/ui/SourceViewPanel.bf @@ -4389,7 +4389,7 @@ namespace IDE.ui base.FindNext(dir); } - public void ReformatDocument() + public void ReformatDocument(bool ignoreSelection = false) { if (!mIsBeefSource) return; @@ -4442,7 +4442,7 @@ namespace IDE.ui } } - if (mEditWidget.Content.HasSelection()) + if ((mEditWidget.Content.HasSelection()) && (!ignoreSelection)) parser.ReformatInto(mEditWidget, mEditWidget.Content.mSelection.Value.MinPos, mEditWidget.Content.mSelection.Value.MaxPos); else parser.ReformatInto(mEditWidget, 0, text.Length);