diff --git a/IDE/src/FileWatcher.bf b/IDE/src/FileWatcher.bf index 6a29dd96..ae68031b 100644 --- a/IDE/src/FileWatcher.bf +++ b/IDE/src/FileWatcher.bf @@ -614,9 +614,29 @@ namespace IDE { using (mMonitor.Enter()) { - mChangeList.Add(changeRecord); - bool added = mChangeMap.TryAdd(changeRecord.mPath, changeRecord); - Debug.Assert(added); + bool added = mChangeMap.TryAdd(changeRecord.mPath, var keyPtr, var valuePtr); + if (added) + { + *keyPtr = changeRecord.mPath; + *valuePtr = changeRecord; + mChangeList.Add(changeRecord); + } + else + { + delete changeRecord; + } + } + } + + public void RemoveChangedFile(String str) + { + using (mMonitor.Enter()) + { + if (mChangeMap.GetAndRemove(str) case .Ok(let kv)) + { + mChangeList.Remove(kv.value); + delete kv.value; + } } } diff --git a/IDE/src/Project.bf b/IDE/src/Project.bf index ba53025c..1a04aee7 100644 --- a/IDE/src/Project.bf +++ b/IDE/src/Project.bf @@ -249,7 +249,8 @@ namespace IDE { mParentFolder.mChildMap.Remove(mName); mName.Set(newName); - mParentFolder.mChildMap.Add(mName, this); + bool added = mParentFolder.mChildMap.TryAdd(mName, this); + Debug.Assert(added); } if ((didNameMatch) && (changePath)) diff --git a/IDE/src/ui/FileChangedDialog.bf b/IDE/src/ui/FileChangedDialog.bf index 0cd98092..c60bb52a 100644 --- a/IDE/src/ui/FileChangedDialog.bf +++ b/IDE/src/ui/FileChangedDialog.bf @@ -18,7 +18,7 @@ namespace IDE.ui COUNT } - List mFileNames = new List() ~ DeleteContainerAndItems!(_); + public List mFileNames = new List() ~ DeleteContainerAndItems!(_); public bool?[(int)DialogKind.COUNT] mApplyAllResult; public DialogKind mDialogKind; diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index 804f415d..029ce8d1 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -1173,7 +1173,7 @@ namespace IDE.ui if ((sourceViewPanel != null) && (sourceViewPanel.mProjectSource == projectSource)) { if (isRemovingProjectSource) - sourceViewPanel.DetachFromProjectItem(); + sourceViewPanel.DetachFromProjectItem(true); else sourceViewPanel.QueueFullRefresh(true); } @@ -1217,7 +1217,7 @@ namespace IDE.ui (sourceViewPanel.mProjectSource != null) && (sourceViewPanel.mProjectSource.mProject == project)) { - sourceViewPanel.DetachFromProjectItem(); + sourceViewPanel.DetachFromProjectItem(true); } }); @@ -1228,7 +1228,7 @@ namespace IDE.ui if (listItem.mChildItems != null) { for (int childIdx = listItem.mChildItems.Count - 1; childIdx >= 0; childIdx--) - DoDeleteItem(listItem.mChildItems[childIdx], deletePathFunc); + DoDeleteItem(listItem.mChildItems[childIdx], deletePathFunc, true); } if (projectItem == null) diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index b7a03a57..a1a129a2 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/IDE/src/ui/SourceViewPanel.bf @@ -842,6 +842,7 @@ namespace IDE.ui { mEditData.mLastFileTextVersion = mEditWidget.Content.mData.mCurTextVersionId; mEditData.mHadRefusedFileChange = false; + mEditData.mFileDeleted = false; var editText = scope String(); mEditWidget.GetText(editText); @@ -2120,16 +2121,29 @@ namespace IDE.ui mEditData.Ref(); mProjectSource.mEditData = mEditData; mEditData.mProjectSources.Add(mProjectSource); + // Rehup mFileDeleted if necessary + if (mEditData.mFileDeleted) + mEditData.IsFileDeleted(); } } QueueFullRefresh(true); } - public void DetachFromProjectItem() + public void DetachFromProjectItem(bool fileDeleted) { if (mProjectSource == null) return; + if (fileDeleted) + { + // We manually add this change record because it may not get caught since the watch dep may be gone + // This will allow the "File Deleted" dialog to show. + var changeRecord = new FileWatcher.ChangeRecord(); + changeRecord.mChangeType = .Deleted; + changeRecord.mPath = new String(mFilePath); + gApp.mFileWatcher.AddChangedFile(changeRecord); + } + ProcessDeferredResolveResults(-1); //Debug.Assert(mEditData != null); @@ -2140,9 +2154,9 @@ namespace IDE.ui QueueFullRefresh(true); if (mOldVersionPanel != null) - mOldVersionPanel.DetachFromProjectItem(); + mOldVersionPanel.DetachFromProjectItem(false); if (mSplitTopPanel != null) - mSplitTopPanel.DetachFromProjectItem(); + mSplitTopPanel.DetachFromProjectItem(false); } public void CloseEdit()