diff --git a/Core/Models/TagDatabase/TagDatabase.ReadMethods.cs b/Core/Models/TagDatabase/TagDatabase.ReadMethods.cs index ba54b78..aff36c3 100644 --- a/Core/Models/TagDatabase/TagDatabase.ReadMethods.cs +++ b/Core/Models/TagDatabase/TagDatabase.ReadMethods.cs @@ -73,6 +73,16 @@ public partial class TagDatabase return tags; } + public int GetTagRelationshipCount() + { + this.CheckInitialisation(); + SqliteCommand command = this.currentConnection.CreateCommand(); + command.CommandText = "SELECT COUNT(*) FROM tag_parent_link"; + + int count = Convert.ToInt32(command.ExecuteScalar()); + return count; + } + /// /// Selects one specific tag by its exact name. /// diff --git a/UI/Assets/Resources.resx b/UI/Assets/Resources.resx index 75844af..e997b12 100644 --- a/UI/Assets/Resources.resx +++ b/UI/Assets/Resources.resx @@ -185,4 +185,7 @@ Database successfully exported at {0} + + Tags: {0}, with {1} parent-child relationships + \ No newline at end of file diff --git a/UI/ViewModels/DatabaseSettingsViewModel.cs b/UI/ViewModels/DatabaseSettingsViewModel.cs new file mode 100644 index 0000000..5dabc22 --- /dev/null +++ b/UI/ViewModels/DatabaseSettingsViewModel.cs @@ -0,0 +1,33 @@ +using System; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; + +namespace TagHierarchyManager.UI.ViewModels; + +public partial class DatabaseSettingsViewModel : ViewModelBase +{ + public DatabaseSettingsViewModel(MainWindowViewModel mainWindow) + { + this.MainWindow = mainWindow; + + this.WindowTitle = mainWindow.Database!.Name; + this.DatabaseVersion = string.Format(Assets.Resources.DatabaseSettingsDbVersion, mainWindow.Database!.Version); + var tagRelationshipCount = mainWindow.Database!.GetTagRelationshipCount(); + this.TagRowsCount = string.Format(Assets.Resources.DatabaseSettingsTagCount, + mainWindow.Database!.Tags.Count, tagRelationshipCount); + this.DefaultTagBindings = string.Join("; ", mainWindow.Database!.DefaultTagBindings); + } + + private MainWindowViewModel MainWindow { get; } + + [ObservableProperty] private string _windowTitle; + [ObservableProperty] private string _databaseVersion; + [ObservableProperty] private string _tagRowsCount; + [ObservableProperty] private string _defaultTagBindings; + + public void SaveSettings() + { + this.MainWindow.Database!.DefaultTagBindings = this.DefaultTagBindings.Split(";", + StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToList(); + } +} \ No newline at end of file diff --git a/UI/ViewModels/MainWindowViewModel.cs b/UI/ViewModels/MainWindowViewModel.cs index 5a1f8b8..50b3a83 100644 --- a/UI/ViewModels/MainWindowViewModel.cs +++ b/UI/ViewModels/MainWindowViewModel.cs @@ -18,7 +18,6 @@ namespace TagHierarchyManager.UI.ViewModels; public partial class MainWindowViewModel : ViewModelBase { - // TODO consider moving editor-related functionality to a separate ViewModel. internal TagDatabase? Database; [ObservableProperty] private HierarchyTreeViewModel? _hierarchyTreeViewModel; @@ -159,6 +158,19 @@ public partial class MainWindowViewModel : ViewModelBase this.ShowErrorDialog(ex.Message); } } + + public void ShowDatabaseSettings() + { + if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop) + return; + + var dialog = new DatabaseSettingsWindow + { + DataContext = new DatabaseSettingsViewModel(this) + }; + + dialog.ShowDialog(desktop.MainWindow!); + } public void ShowErrorDialog(string message) { @@ -294,6 +306,7 @@ public partial class MainWindowViewModel : ViewModelBase private void TagDatabase_TagAdded(object? sender, Tag _) { this.OnPropertyChanged(nameof(this.TotalTags)); + this.SelectedTag!.SyncId(); } private void TagDatabase_TagDeleted(object? sender, (int id, string name) _) diff --git a/UI/ViewModels/SearchViewModel.cs b/UI/ViewModels/SearchViewModel.cs index 981d172..8e9fa96 100644 --- a/UI/ViewModels/SearchViewModel.cs +++ b/UI/ViewModels/SearchViewModel.cs @@ -29,12 +29,10 @@ public partial class SearchViewModel : ViewModelBase, IDisposable var results = searchAliases ? this.mainWindow.Database.SearchWithAliases(searchQuery, mode) : this.mainWindow.Database.Search(searchQuery, mode); - - string statusBlockString = string.Empty; + this.SearchResults.Clear(); if (results.Count == 0) { - // todo resx this.mainWindow.StatusBlockText = Assets.Resources.SearchNoResultsFound; return; } diff --git a/UI/ViewModels/TagItemViewModel.cs b/UI/ViewModels/TagItemViewModel.cs index 7f3d85e..19a2ef5 100644 --- a/UI/ViewModels/TagItemViewModel.cs +++ b/UI/ViewModels/TagItemViewModel.cs @@ -45,10 +45,12 @@ public partial class TagItemViewModel(Tag tag, Func? getNameById = ? string.Join("; ", this.Tag.TagBindings) : string.Empty; + public bool OnDatabase => this.Id != 0; + internal Tag Tag { get; } = tag; private bool IsTopLevel => this.Tag.IsTopLevel; - + private string Parents => getNameById != null && this.Tag.ParentIds.Count > 0 ? string.Join("; ", this.Tag.ParentIds.Select(getNameById).Where(n => n != null)) : string.Empty; @@ -126,6 +128,12 @@ public partial class TagItemViewModel(Tag tag, Func? getNameById = } } + public void SyncId() + { + OnPropertyChanged(nameof(Id)); + OnPropertyChanged(nameof(OnDatabase)); + } + protected override void OnPropertyChanged(PropertyChangedEventArgs e) { base.OnPropertyChanged(e); diff --git a/UI/Views/DatabaseSettingsWindow.axaml b/UI/Views/DatabaseSettingsWindow.axaml index 1bd517b..a32e465 100644 --- a/UI/Views/DatabaseSettingsWindow.axaml +++ b/UI/Views/DatabaseSettingsWindow.axaml @@ -3,19 +3,27 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:assets="clr-namespace:TagHierarchyManager.UI.Assets" - mc:Ignorable="d" d:DesignWidth="500" d:DesignHeight="160" - Width="500" Height="160" + xmlns:vm="clr-namespace:TagHierarchyManager.UI.ViewModels" + mc:Ignorable="d" d:DesignWidth="500" d:DesignHeight="180" + Width="500" Height="200" x:Class="TagHierarchyManager.UI.Views.DatabaseSettingsWindow" + x:DataType="vm:DatabaseSettingsViewModel" WindowStartupLocation="CenterOwner" - ShowInTaskbar="False" - Title="Settings - {0}"> + ShowInTaskbar="False" CanResize="False" + Title="{Binding WindowTitle}"> - + + + - + -