diff --git a/app/Desktop/Main/Controls/FilterPanelModel.cs b/app/Desktop/Main/Controls/FilterPanelModel.cs index 828b64a..5985f75 100644 --- a/app/Desktop/Main/Controls/FilterPanelModel.cs +++ b/app/Desktop/Main/Controls/FilterPanelModel.cs @@ -14,7 +14,7 @@ using DHT.Server.Database; using DHT.Utils.Models; namespace DHT.Desktop.Main.Controls { - sealed class FilterPanelModel : BaseModel { + sealed class FilterPanelModel : BaseModel, IDisposable { private static readonly HashSet FilterProperties = new () { nameof(FilterByDate), nameof(StartDate), @@ -103,6 +103,10 @@ namespace DHT.Desktop.Main.Controls { db.Statistics.PropertyChanged += OnDbStatisticsChanged; } + public void Dispose() { + db.Statistics.PropertyChanged -= OnDbStatisticsChanged; + } + private void OnPropertyChanged(object? sender, PropertyChangedEventArgs e) { if (e.PropertyName != null && FilterProperties.Contains(e.PropertyName)) { FilterPropertyChanged?.Invoke(sender, e); diff --git a/app/Desktop/Main/MainContentScreenModel.cs b/app/Desktop/Main/MainContentScreenModel.cs index 23ef9a4..f8e95e0 100644 --- a/app/Desktop/Main/MainContentScreenModel.cs +++ b/app/Desktop/Main/MainContentScreenModel.cs @@ -56,6 +56,7 @@ namespace DHT.Desktop.Main { public void Dispose() { TrackingPageModel.Dispose(); + ViewerPageModel.Dispose(); } } } diff --git a/app/Desktop/Main/MainWindow.axaml b/app/Desktop/Main/MainWindow.axaml index ed343ee..d02426a 100644 --- a/app/Desktop/Main/MainWindow.axaml +++ b/app/Desktop/Main/MainWindow.axaml @@ -17,7 +17,6 @@ - - + diff --git a/app/Desktop/Main/MainWindowModel.cs b/app/Desktop/Main/MainWindowModel.cs index 0d99787..396e842 100644 --- a/app/Desktop/Main/MainWindowModel.cs +++ b/app/Desktop/Main/MainWindowModel.cs @@ -15,14 +15,13 @@ namespace DHT.Desktop.Main { public string Title { get; private set; } = DefaultTitle; - public WelcomeScreen WelcomeScreen { get; } - private WelcomeScreenModel WelcomeScreenModel { get; } + public UserControl CurrentScreen { get; private set; } + + private readonly WelcomeScreen welcomeScreen; + private readonly WelcomeScreenModel welcomeScreenModel; - public MainContentScreen? MainContentScreen { get; private set; } - private MainContentScreenModel? MainContentScreenModel { get; set; } - - public bool ShowWelcomeScreen => db == null; - public bool ShowMainContentScreen => db != null; + private MainContentScreen? mainContentScreen; + private MainContentScreenModel? mainContentScreenModel; private readonly Window window; @@ -34,10 +33,11 @@ namespace DHT.Desktop.Main { public MainWindowModel(Window window, Arguments args) { this.window = window; - WelcomeScreenModel = new WelcomeScreenModel(window); - WelcomeScreen = new WelcomeScreen { DataContext = WelcomeScreenModel }; + welcomeScreenModel = new WelcomeScreenModel(window); + welcomeScreen = new WelcomeScreen { DataContext = welcomeScreenModel }; + CurrentScreen = welcomeScreen; - WelcomeScreenModel.PropertyChanged += WelcomeScreenModelOnPropertyChanged; + welcomeScreenModel.PropertyChanged += WelcomeScreenModelOnPropertyChanged; var dbFile = args.DatabaseFile; if (!string.IsNullOrWhiteSpace(dbFile)) { @@ -50,7 +50,7 @@ namespace DHT.Desktop.Main { } if (File.Exists(dbFile)) { - await WelcomeScreenModel.OpenOrCreateDatabaseFromPath(dbFile); + await welcomeScreenModel.OpenOrCreateDatabaseFromPath(dbFile); } else { await Dialog.ShowOk(window, "Database Error", "Database file not found:\n" + dbFile); @@ -70,31 +70,31 @@ namespace DHT.Desktop.Main { } private async void WelcomeScreenModelOnPropertyChanged(object? sender, PropertyChangedEventArgs e) { - if (e.PropertyName == nameof(WelcomeScreenModel.Db)) { - if (MainContentScreenModel != null) { - MainContentScreenModel.DatabaseClosed -= MainContentScreenModelOnDatabaseClosed; - MainContentScreenModel.Dispose(); + if (e.PropertyName == nameof(welcomeScreenModel.Db)) { + if (mainContentScreenModel != null) { + mainContentScreenModel.DatabaseClosed -= MainContentScreenModelOnDatabaseClosed; + mainContentScreenModel.Dispose(); } db?.Dispose(); - db = WelcomeScreenModel.Db; + db = welcomeScreenModel.Db; if (db == null) { Title = DefaultTitle; - MainContentScreenModel = null; - MainContentScreen = null; + mainContentScreenModel = null; + mainContentScreen = null; + CurrentScreen = welcomeScreen; } else { Title = Path.GetFileName(db.Path) + " - " + DefaultTitle; - MainContentScreenModel = new MainContentScreenModel(window, db); - await MainContentScreenModel.Initialize(); - MainContentScreenModel.DatabaseClosed += MainContentScreenModelOnDatabaseClosed; - MainContentScreen = new MainContentScreen { DataContext = MainContentScreenModel }; - OnPropertyChanged(nameof(MainContentScreen)); + mainContentScreenModel = new MainContentScreenModel(window, db); + await mainContentScreenModel.Initialize(); + mainContentScreenModel.DatabaseClosed += MainContentScreenModelOnDatabaseClosed; + mainContentScreen = new MainContentScreen { DataContext = mainContentScreenModel }; + CurrentScreen = mainContentScreen; } - OnPropertyChanged(nameof(ShowWelcomeScreen)); - OnPropertyChanged(nameof(ShowMainContentScreen)); + OnPropertyChanged(nameof(CurrentScreen)); OnPropertyChanged(nameof(Title)); window.Focus(); @@ -102,12 +102,12 @@ namespace DHT.Desktop.Main { } private void MainContentScreenModelOnDatabaseClosed(object? sender, EventArgs e) { - WelcomeScreenModel.CloseDatabase(); + welcomeScreenModel.CloseDatabase(); } public void Dispose() { - WelcomeScreenModel.Dispose(); - MainContentScreenModel?.Dispose(); + welcomeScreenModel.Dispose(); + mainContentScreenModel?.Dispose(); db?.Dispose(); db = null; } diff --git a/app/Desktop/Main/Pages/ViewerPageModel.cs b/app/Desktop/Main/Pages/ViewerPageModel.cs index 32c65e4..1aecfcc 100644 --- a/app/Desktop/Main/Pages/ViewerPageModel.cs +++ b/app/Desktop/Main/Pages/ViewerPageModel.cs @@ -16,7 +16,7 @@ using DHT.Utils.Models; using static DHT.Desktop.Program; namespace DHT.Desktop.Main.Pages { - sealed class ViewerPageModel : BaseModel { + sealed class ViewerPageModel : BaseModel, IDisposable { public string ExportedMessageText { get; private set; } = ""; public bool DatabaseToolFilterModeKeep { get; set; } = true; @@ -41,12 +41,17 @@ namespace DHT.Desktop.Main.Pages { this.window = window; this.db = db; - this.FilterModel = new FilterPanelModel(window, db); - this.FilterModel.FilterPropertyChanged += OnFilterPropertyChanged; - this.db.Statistics.PropertyChanged += OnDbStatisticsChanged; + FilterModel = new FilterPanelModel(window, db); + FilterModel.FilterPropertyChanged += OnFilterPropertyChanged; + db.Statistics.PropertyChanged += OnDbStatisticsChanged; UpdateStatistics(); } + public void Dispose() { + db.Statistics.PropertyChanged -= OnDbStatisticsChanged; + FilterModel.Dispose(); + } + private void OnFilterPropertyChanged(object? sender, PropertyChangedEventArgs e) { UpdateStatistics(); HasFilters = FilterModel.HasAnyFilters; diff --git a/app/Server/Database/DatabaseStatistics.cs b/app/Server/Database/DatabaseStatistics.cs index fdc59c8..2a70d2a 100644 --- a/app/Server/Database/DatabaseStatistics.cs +++ b/app/Server/Database/DatabaseStatistics.cs @@ -1,8 +1,7 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; +using DHT.Utils.Models; namespace DHT.Server.Database { - public sealed class DatabaseStatistics : INotifyPropertyChanged { + public sealed class DatabaseStatistics : BaseModel { private long totalServers; private long totalChannels; private long totalUsers; @@ -10,29 +9,22 @@ namespace DHT.Server.Database { public long TotalServers { get => totalServers; - internal set => Change(out totalServers, value); + internal set => Change(ref totalServers, value); } public long TotalChannels { get => totalChannels; - internal set => Change(out totalChannels, value); + internal set => Change(ref totalChannels, value); } public long TotalUsers { get => totalUsers; - internal set => Change(out totalUsers, value); + internal set => Change(ref totalUsers, value); } public long TotalMessages { get => totalMessages; - internal set => Change(out totalMessages, value); - } - - public event PropertyChangedEventHandler? PropertyChanged; - - private void Change(out T field, T value, [CallerMemberName] string? propertyName = null) { - field = value; - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + internal set => Change(ref totalMessages, value); } public DatabaseStatistics Clone() {