From bdfc9459b8bf9e961dbcf89ad4b4a0dc6c01a90f Mon Sep 17 00:00:00 2001 From: MeltyPlayer Date: Mon, 13 May 2024 19:29:36 -0500 Subject: [PATCH] Added icons to the file bundle view. --- .../UniversalAssetTool.Ui.Avalonia.csproj | 3 + .../Views/MainView.axaml | 9 ++ .../common/treeViews/FilterTreeView.axaml | 14 ++- .../common/treeViews/FilterTreeView.axaml.cs | 108 +++++++++++++----- .../FilterTreeViewViewModelInterfaces.cs | 28 +++++ 5 files changed, 129 insertions(+), 33 deletions(-) create mode 100644 FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeViewViewModelInterfaces.cs diff --git a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/UniversalAssetTool.Ui.Avalonia.csproj b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/UniversalAssetTool.Ui.Avalonia.csproj index d9946a16c..2ba757b6b 100644 --- a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/UniversalAssetTool.Ui.Avalonia.csproj +++ b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/UniversalAssetTool.Ui.Avalonia.csproj @@ -27,7 +27,10 @@ + + + diff --git a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/Views/MainView.axaml b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/Views/MainView.axaml index 300b5736a..d900a4da9 100644 --- a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/Views/MainView.axaml +++ b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/Views/MainView.axaml @@ -13,12 +13,21 @@ + + + + + + \ No newline at end of file diff --git a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeView.axaml b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeView.axaml index a9e00bb43..6ad886937 100644 --- a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeView.axaml +++ b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeView.axaml @@ -6,11 +6,12 @@ xmlns:treeViews="clr-namespace:uni.ui.avalonia.common.treeViews" mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="450" x:Class="uni.ui.avalonia.common.treeViews.FilterTreeView" - x:DataType="treeViews:FilterTreeViewViewModel"> + x:DataType="treeViews:FileBundleTreeViewModel"> - + + + - + + diff --git a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeView.axaml.cs b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeView.axaml.cs index 0cade3fef..d85dc97b7 100644 --- a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeView.axaml.cs +++ b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeView.axaml.cs @@ -1,62 +1,110 @@ +using System; using System.Collections.ObjectModel; using Avalonia.Controls; -using Avalonia.Media; + +using fin.audio.io; +using fin.audio.io.importers.ogg; +using fin.image; +using fin.importers; +using fin.io; +using fin.io.bundles; +using fin.model.io; +using fin.scene; +using fin.util.asserts; + +using grezzo.api; using uni.ui.avalonia.resources; using uni.ui.avalonia.ViewModels; +using IImage = Avalonia.Media.IImage; + namespace uni.ui.avalonia.common.treeViews { public partial class FilterTreeView : UserControl { public FilterTreeView() { - InitializeComponent(); - this.DataContext = new FilterTreeViewViewModel(); + this.InitializeComponent(); + this.DataContext = new FileBundleTreeViewModel(); + } + + private void TreeView_OnSelectionChanged_( + object? sender, + SelectionChangedEventArgs e) { + if (e.AddedItems.Count == 0) { + return; + } + + if (this.DataContext is not IFilterTreeViewViewModel + filterTreeViewViewModel) { + return; + } + + var selectedNode = Asserts.AsA(e.AddedItems[0]); + filterTreeViewViewModel.ChangeSelection(selectedNode); } } - public class FilterTreeViewViewModel : FilterTreeViewViewModel { - public FilterTreeViewViewModel() { + // Top-level view model types + public class FileBundleTreeViewModel + : ViewModelBase, IFilterTreeViewViewModel { + public ObservableCollection> Nodes { get; protected set; } + + public event EventHandler>? NodeSelected; + + public void ChangeSelection(INode node) + => this.NodeSelected?.Invoke(this, Asserts.AsA>(node)); + } + + public class FileBundleTreeViewModel : FileBundleTreeViewModel { + public FileBundleTreeViewModel() { this.Nodes = [ - new ParentNode("Animals", + new ParentNode("Animals", [ - new ParentNode("Mammals", + new ParentNode("Mammals", [ - new ParentNode("Lion"), - new ParentNode("Cat"), - new ParentNode("Zebra") + new LeafNode("Lion", new CmbModelFileBundle("foo", new FinFile()).Annotate(null)), + new LeafNode("Cat", new OggAudioFileBundle(new FinFile()).Annotate(null)) ]) ]) ]; } } - public class FilterTreeViewViewModel : ViewModelBase { - public ObservableCollection> Nodes { get; protected set; } - } + // Node types + public class ParentNode( + string label, + ObservableCollection>? subNodes = null) + : ViewModelBase, INode { + public ObservableCollection>? SubNodes { get; } + = subNodes; - public interface INode : IViewModelBase { - bool IsExpanded { get; set; } - ObservableCollection>? SubNodes { get; } - IImage Icon { get; } - string Label { get; } + public IImage? Icon => null; + + public string Label { get; } = label; } - public class ParentNode( - string label, - ObservableCollection>? subNodes = null) - : ViewModelBase, INode { - public ObservableCollection>? SubNodes { get; } = subNodes; + public class LeafNode(string label, IAnnotatedFileBundle data) + : ViewModelBase, INode { + public ObservableCollection>? SubNodes => null; + + public static readonly IImage MUSIC_ICON + = EmbeddedResourceUtil.LoadAvaloniaImage("music"); - public static readonly IImage FOLDER_OPEN_ICON - = EmbeddedResourceUtil.LoadAvaloniaImage("folder_open"); + public static readonly IImage PICTURE_ICON + = EmbeddedResourceUtil.LoadAvaloniaImage("picture"); - public static readonly IImage FOLDER_CLOSED_ICON - = EmbeddedResourceUtil.LoadAvaloniaImage("folder_closed"); + public static readonly IImage MODEL_ICON + = EmbeddedResourceUtil.LoadAvaloniaImage("model"); - public bool IsExpanded { get; set; } + public static readonly IImage SCENE_ICON + = EmbeddedResourceUtil.LoadAvaloniaImage("scene"); - public IImage Icon - => this.IsExpanded ? FOLDER_OPEN_ICON : FOLDER_CLOSED_ICON; + public IImage? Icon => data.FileBundle switch { + IAudioFileBundle => MUSIC_ICON, + IImageFileBundle => PICTURE_ICON, + IModelFileBundle => MODEL_ICON, + ISceneFileBundle => SCENE_ICON, + }; public string Label { get; } = label; } diff --git a/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeViewViewModelInterfaces.cs b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeViewViewModelInterfaces.cs new file mode 100644 index 000000000..b5f3c58bf --- /dev/null +++ b/FinModelUtility/UniversalAssetTool/UniversalAssetTool.Ui.Avalonia/common/treeViews/FilterTreeViewViewModelInterfaces.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.ObjectModel; + +using Avalonia.Media; + +using uni.ui.avalonia.ViewModels; + +namespace uni.ui.avalonia.common.treeViews { + // Top-level view model types + + public interface IFilterTreeViewViewModel : IViewModelBase { + void ChangeSelection(INode node); + } + + public interface IFilterTreeViewViewModel : IFilterTreeViewViewModel { + event EventHandler>? NodeSelected; + } + + // Node types + public interface INode : IViewModelBase { + IImage? Icon { get; } + string Label { get; } + } + + public interface INode : INode { + ObservableCollection>? SubNodes { get; } + } +}