diff --git a/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs b/src/MSDIAL5/MsdialGuiApp/Model/Core/MainWindowModel.cs index f1c8ad78a..61fd590bf 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; } @@ -83,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(); } } @@ -123,11 +143,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 +179,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 +200,27 @@ await Application.Current.Dispatcher.InvokeAsync(() => { } } } + + public async Task DeleteProjectAsync(ProjectCrumb projectCrumb){ + using (nowLoading.ProcessStart()){ + try + { + 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..ef991d241 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; }