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}">
-
+
+
+
-
+
-
-
+
+
\ No newline at end of file
diff --git a/UI/Views/DatabaseSettingsWindow.axaml.cs b/UI/Views/DatabaseSettingsWindow.axaml.cs
index 6f073b7..1f33954 100644
--- a/UI/Views/DatabaseSettingsWindow.axaml.cs
+++ b/UI/Views/DatabaseSettingsWindow.axaml.cs
@@ -1,4 +1,6 @@
using Avalonia.Controls;
+using Avalonia.Interactivity;
+using TagHierarchyManager.UI.ViewModels;
namespace TagHierarchyManager.UI.Views;
@@ -8,4 +10,14 @@ public partial class DatabaseSettingsWindow : Window
{
this.InitializeComponent();
}
+
+ private DatabaseSettingsViewModel? ViewModel => this.DataContext as DatabaseSettingsViewModel;
+
+ public void ButtonCancel_Click(object? sender, RoutedEventArgs e) => this.Close();
+
+ public void ButtonOk_Click(object? sender, RoutedEventArgs e)
+ {
+ this.ViewModel!.SaveSettings();
+ this.Close();
+ }
}
\ No newline at end of file
diff --git a/UI/Views/MainWindow.axaml b/UI/Views/MainWindow.axaml
index 35e1b9c..97cf7a1 100644
--- a/UI/Views/MainWindow.axaml
+++ b/UI/Views/MainWindow.axaml
@@ -12,14 +12,7 @@
-
-
-