From 92655cb55435348fc7beeafe6ed6438e0939236f Mon Sep 17 00:00:00 2001 From: YuuKamegai Date: Thu, 21 May 2026 11:08:59 +0900 Subject: [PATCH 1/4] Add function that to delete from current projct. --- .../Model/Core/MainWindowModel.cs | 64 ++++++++++++++++--- .../MsdialGuiApp/View/Core/MainWindow.xaml | 13 +++- .../ViewModel/Core/MainWindowVM.cs | 6 +- 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs b/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs index f1c8ad78a..361c13aa1 100644 --- a/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs +++ b/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs @@ -35,8 +35,8 @@ public MainWindowModel(IMessageBroker broker) { _settings.PreviousProjects = new List(); _settings.Save(); } - _previousProjects = _settings.PreviousProjects; - PreviousProjects = _previousProjects.AsReadOnly(); + _previousProjects = new ObservableCollection(_settings.PreviousProjects); + PreviousProjects = new ReadOnlyObservableCollection(_previousProjects); //InternalMsfinderSettingModel = new InternalMsfinderSettingModel(IonMode.Negative); } @@ -61,19 +61,25 @@ public ProjectSettingModel ProjectSetting { } private ProjectSettingModel projectSetting; - public ReadOnlyCollection PreviousProjects { get; } - private readonly List _previousProjects; + public ReadOnlyObservableCollection PreviousProjects { get; } + private readonly ObservableCollection _previousProjects; private Task SetNewProject(IProjectModel project) { CurrentProject = project; ProjectSetting = new ProjectSettingModel(SetNewProject, _broker); var currentCrumb = new ProjectCrumb(project.Storage.ProjectParameter); if (_previousProjects.Any(currentCrumb.MaybeSame)) { - _previousProjects.RemoveAll(currentCrumb.MaybeSame); + var resembleProjects = _previousProjects.Where(currentCrumb.MaybeSame).ToList(); + foreach (var resembleProject in resembleProjects) + { + _previousProjects.Remove(resembleProject); + } } _previousProjects.Insert(0, currentCrumb); if (_previousProjects.Count > 50) { - _previousProjects.RemoveRange(50, _previousProjects.Count - 50); + while (_previousProjects.Count > 50) { + _previousProjects.RemoveAt(_previousProjects.Count - 1); + } } return Task.CompletedTask; } @@ -123,11 +129,17 @@ public async Task LoadAsync() { CurrentProject = loadedProject; var currentCrumb = new ProjectCrumb(loadedProject.Storage.ProjectParameter); if (_previousProjects.Any(currentCrumb.MaybeSame)) { - _previousProjects.RemoveAll(currentCrumb.MaybeSame); + var resembleProjects = _previousProjects.Where(currentCrumb.MaybeSame).ToList(); + foreach (var resembleProject in resembleProjects) + { + _previousProjects.Remove(resembleProject); + } } _previousProjects.Insert(0, currentCrumb); if (_previousProjects.Count > 50) { - _previousProjects.RemoveRange(50, _previousProjects.Count - 50); + while (_previousProjects.Count > 50) { + _previousProjects.RemoveAt(_previousProjects.Count - 1); + } } } catch { @@ -153,11 +165,17 @@ public async Task LoadProjectAsync(ProjectCrumb projectCrumb) { CurrentProject = loadedProject; var currentCrumb = new ProjectCrumb(loadedProject.Storage.ProjectParameter); if (_previousProjects.Any(currentCrumb.MaybeSame)) { - _previousProjects.RemoveAll(currentCrumb.MaybeSame); + var resembleProjects = _previousProjects.Where(currentCrumb.MaybeSame).ToList(); + foreach (var resembleProject in resembleProjects) + { + _previousProjects.Remove(resembleProject); + } } _previousProjects.Insert(0, currentCrumb); if (_previousProjects.Count > 50) { - _previousProjects.RemoveRange(50, _previousProjects.Count - 50); + while (_previousProjects.Count > 50) { + _previousProjects.RemoveAt(_previousProjects.Count - 1); + } } } catch { @@ -168,5 +186,31 @@ await Application.Current.Dispatcher.InvokeAsync(() => { } } } + + public async Task DeleteProjectAsync(ProjectCrumb projectCrumb){ + using (nowLoading.ProcessStart()){ + try + { + if (projectCrumb.FilePath is null || !File.Exists(projectCrumb.FilePath)) + { + return; + } + var resembleProjects = _previousProjects.Where(projectCrumb.MaybeSame).ToList(); + foreach (var resembleProject in resembleProjects) + { + _previousProjects.Remove(resembleProject); + } + _settings.PreviousProjects = PreviousProjects.ToList(); + _settings.Save(); + } + catch + { + await Application.Current.Dispatcher.InvokeAsync(() => { + MessageBox.Show("Failed to delete project.\nPlease check your project."); + return Task.CompletedTask; + }); + } + } + } } } diff --git a/src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml b/src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml index b227afab4..a5dbdc487 100644 --- a/src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml +++ b/src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml @@ -8,6 +8,7 @@ xmlns:properties="clr-namespace:CompMs.App.Msdial.Properties" xmlns:util="clr-namespace:CompMs.App.Msdial.Utility" xmlns:progressbar="clr-namespace:CompMs.Graphics.UI.ProgressBar;assembly=ChartDrawing" + xmlns:mvvm="clr-namespace:CompMs.CommonMVVM;assembly=CommonMVVM" mc:Ignorable="d" Icon="/Resources/msdial_icon.ico" d:DataContext="{d:DesignInstance Type={x:Type vm:MainWindowVM}}" @@ -138,6 +139,9 @@ + + + + + + + + + diff --git a/src/MSDIAL5/MsdialGuiApp/ViewModel/Core/MainWindowVM.cs b/src/MSDIAL5/MsdialGuiApp/ViewModel/Core/MainWindowVM.cs index b5ca081fa..ca3d14648 100644 --- a/src/MSDIAL5/MsdialGuiApp/ViewModel/Core/MainWindowVM.cs +++ b/src/MSDIAL5/MsdialGuiApp/ViewModel/Core/MainWindowVM.cs @@ -80,6 +80,9 @@ public MainWindowVM(IWindowService peakSpotTableServ OpenPreviousProjectCommand = new AsyncReactiveCommand() .WithSubscribe(Model.LoadProjectAsync) .AddTo(Disposables); + DeletePreviousProjectCommand = new AsyncReactiveCommand() + .WithSubscribe(Model.DeleteProjectAsync) + .AddTo(Disposables); _taskProgressCollection = new TaskProgressCollection(); _taskProgressCollection.ShowWhileSwitchOn(Model.NowSaving, "Saving...").AddTo(Disposables); @@ -177,7 +180,8 @@ private async Task ExecuteAlignmentMethodProcess() { public AsyncReactiveCommand OpenProjectCommand { get; } public AsyncReactiveCommand OpenPreviousProjectCommand { get; } - public ReadOnlyCollection PreviousProjects => Model.PreviousProjects; + public AsyncReactiveCommand DeletePreviousProjectCommand { get; } + public ReadOnlyObservableCollection PreviousProjects => Model.PreviousProjects; public AsyncReactiveCommand SaveProjectCommand { get; } public AsyncReactiveCommand SaveAsProjectCommand { get; } From d725ed27cda08e21a9d47599b9a2522cb53b312f Mon Sep 17 00:00:00 2001 From: YuuKamegai Date: Thu, 21 May 2026 16:50:13 +0900 Subject: [PATCH 2/4] fix the save timing; current projects show the last edeted time of themselves on time --- .../MsdialGuiApp/Model/Core/MainWindowModel.cs | 16 +++++++++++++++- .../MsdialGuiApp/Model/Core/ProjectModel.cs | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs b/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs index 361c13aa1..04d1aa5d9 100644 --- a/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs +++ b/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs @@ -89,7 +89,21 @@ public async Task SaveAsync() { return; } using (nowSaving.ProcessStart()) { - await CurrentProject.SaveAsync().ConfigureAwait(false); + await CurrentProject.SaveAsync().ConfigureAwait(true); + var currentCrumb = new ProjectCrumb(CurrentProject.Storage.ProjectParameter); + if (_previousProjects.Any(currentCrumb.MaybeSame)) + { + _previousProjects.Remove(_previousProjects.First(currentCrumb.MaybeSame)); + } + _previousProjects.Insert(0, currentCrumb); + if (_previousProjects.Count > 50) + { + while (_previousProjects.Count > 50) + { + _previousProjects.RemoveAt(_previousProjects.Count - 1); + } + } + _settings.PreviousProjects = PreviousProjects.ToList(); _settings.Save(); } } diff --git a/src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs b/src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs index b59c2fb20..570b032cf 100644 --- a/src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs +++ b/src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs @@ -19,6 +19,8 @@ namespace CompMs.App.Msdial.Model.Core { internal sealed class ProjectModel : BindableBase, IProjectModel { + + public ProjectModel(ProjectDataStorage storage, IMessageBroker broker) { Storage = storage; _broker = broker; From 116e1419ace3aae1b7993f321a1291f81073443e Mon Sep 17 00:00:00 2001 From: YukiMatsuzawa <122433968+YukiMatsuzawa@users.noreply.github.com> Date: Thu, 21 May 2026 17:56:18 +0900 Subject: [PATCH 3/4] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs b/src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs index 570b032cf..b59c2fb20 100644 --- a/src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs +++ b/src/MSDIAL5/MsdialGuiApp/Model/Core/ProjectModel.cs @@ -19,8 +19,6 @@ namespace CompMs.App.Msdial.Model.Core { internal sealed class ProjectModel : BindableBase, IProjectModel { - - public ProjectModel(ProjectDataStorage storage, IMessageBroker broker) { Storage = storage; _broker = broker; From 4b737e6e1ceed92854b0d84ecd24f6c6a4aa53f4 Mon Sep 17 00:00:00 2001 From: YuuKamegai Date: Thu, 21 May 2026 18:08:53 +0900 Subject: [PATCH 4/4] change buttun header about previous project and delete useless code about this function. --- src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs | 4 ---- src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs b/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs index 04d1aa5d9..61fd590bf 100644 --- a/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs +++ b/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs @@ -205,10 +205,6 @@ public async Task DeleteProjectAsync(ProjectCrumb projectCrumb){ using (nowLoading.ProcessStart()){ try { - if (projectCrumb.FilePath is null || !File.Exists(projectCrumb.FilePath)) - { - return; - } var resembleProjects = _previousProjects.Where(projectCrumb.MaybeSame).ToList(); foreach (var resembleProject in resembleProjects) { diff --git a/src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml b/src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml index a5dbdc487..ef991d241 100644 --- a/src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml +++ b/src/MSDIAL5/MsdialGuiApp/View/Core/MainWindow.xaml @@ -167,7 +167,7 @@ -