Skip to content

Commit

Permalink
Added icons to the file bundle view.
Browse files Browse the repository at this point in the history
  • Loading branch information
MeltyPlayer committed May 14, 2024
1 parent 658fd11 commit bdfc945
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\Fin\Fin.Ui\Fin.Ui.csproj" />
<ProjectReference Include="..\..\Fin\Fin\Fin.csproj" />
<ProjectReference Include="..\..\Formats\Grezzo\Grezzo\Grezzo.csproj" />
<ProjectReference Include="..\UniversalAssetTool\UniversalAssetTool.csproj" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,21 @@
<vm:MainViewModel />
</Design.DataContext>

<UserControl.Styles>
<Style Selector="treeViews|FilterTreeView">
<Setter Property="Background" Value="Transparent" />
</Style>
</UserControl.Styles>

<SplitView IsPaneOpen="True"
PaneBackground="White"
DisplayMode="Inline"
OpenPaneLength="250">
<SplitView.Pane>
<treeViews:FilterTreeView />
</SplitView.Pane>

<Panel Background="Magenta">
</Panel>
</SplitView>
</UserControl>
Original file line number Diff line number Diff line change
Expand Up @@ -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">
<Design.DataContext>
<treeViews:FilterTreeViewViewModel />
<treeViews:FileBundleTreeViewModel />
</Design.DataContext>

<!-- Overrides expander styles in tree view. -->
<UserControl.Styles>
<Style Selector="TreeViewItem /template/ ToggleButton">
<Setter Property="Width" Value="16" />
Expand All @@ -35,13 +36,20 @@
</Style>
</UserControl.Styles>

<!-- Renders tree view. -->
<StackPanel>
<textboxes:AutocompleteTextbox Placeholder="Search file bundles..." />

<TreeView ItemsSource="{Binding Nodes}">
<TreeView ItemsSource="{Binding Nodes}"
SelectionChanged="TreeView_OnSelectionChanged_">
<TreeView.ItemTemplate>
<TreeDataTemplate ItemsSource="{Binding SubNodes}">
<StackPanel Orientation="Horizontal">
<Image IsVisible="{Binding Icon, Converter={x:Static ObjectConverters.IsNotNull}}"
Source="{Binding Icon}"
Margin="-24 0 4 0"
Height="16"
Width="16" />
<TextBlock Text="{Binding Label}" />
</StackPanel>
</TreeDataTemplate>
Expand Down
Original file line number Diff line number Diff line change
@@ -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<INode>(e.AddedItems[0]);
filterTreeViewViewModel.ChangeSelection(selectedNode);
}
}

public class FilterTreeViewViewModel : FilterTreeViewViewModel<string> {
public FilterTreeViewViewModel() {
// Top-level view model types
public class FileBundleTreeViewModel<T>
: ViewModelBase, IFilterTreeViewViewModel<T> {
public ObservableCollection<INode<T>> Nodes { get; protected set; }

public event EventHandler<INode<T>>? NodeSelected;

public void ChangeSelection(INode node)
=> this.NodeSelected?.Invoke(this, Asserts.AsA<INode<T>>(node));
}

public class FileBundleTreeViewModel : FileBundleTreeViewModel<IAnnotatedFileBundle> {
public FileBundleTreeViewModel() {
this.Nodes = [
new ParentNode<string>("Animals",
new ParentNode("Animals",
[
new ParentNode<string>("Mammals",
new ParentNode("Mammals",
[
new ParentNode<string>("Lion"),
new ParentNode<string>("Cat"),
new ParentNode<string>("Zebra")
new LeafNode("Lion", new CmbModelFileBundle("foo", new FinFile()).Annotate(null)),
new LeafNode("Cat", new OggAudioFileBundle(new FinFile()).Annotate(null))
])
])
];
}
}

public class FilterTreeViewViewModel<T> : ViewModelBase {
public ObservableCollection<INode<T>> Nodes { get; protected set; }
}
// Node types
public class ParentNode(
string label,
ObservableCollection<INode<IAnnotatedFileBundle>>? subNodes = null)
: ViewModelBase, INode<IAnnotatedFileBundle> {
public ObservableCollection<INode<IAnnotatedFileBundle>>? SubNodes { get; }
= subNodes;

public interface INode<T> : IViewModelBase {
bool IsExpanded { get; set; }
ObservableCollection<INode<T>>? SubNodes { get; }
IImage Icon { get; }
string Label { get; }
public IImage? Icon => null;

public string Label { get; } = label;
}

public class ParentNode<T>(
string label,
ObservableCollection<INode<T>>? subNodes = null)
: ViewModelBase, INode<T> {
public ObservableCollection<INode<T>>? SubNodes { get; } = subNodes;
public class LeafNode(string label, IAnnotatedFileBundle data)
: ViewModelBase, INode<IAnnotatedFileBundle> {
public ObservableCollection<INode<IAnnotatedFileBundle>>? 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;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<T> : IFilterTreeViewViewModel {
event EventHandler<INode<T>>? NodeSelected;
}

// Node types
public interface INode : IViewModelBase {
IImage? Icon { get; }
string Label { get; }
}

public interface INode<T> : INode {
ObservableCollection<INode<T>>? SubNodes { get; }
}
}

0 comments on commit bdfc945

Please sign in to comment.