Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
using System;
using System.Collections.Generic;
using Avalonia.Media.Imaging;
using Stride.Core.Assets.Templates;

namespace Stride.Core.Assets.Editor.Components.TemplateDescriptions.ViewModels
{
public interface ITemplateDescriptionViewModel
{
string Name { get; }

string Description { get; }

string FullDescription { get; }

string Group { get; }

Guid Id { get; }

string DefaultOutputName { get; }

Bitmap Icon { get; }

IEnumerable<Bitmap> Screenshots { get; }

TemplateDescription GetTemplate();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Stride.Core.Assets.Editor.Services;
using Stride.Core.Presentation.Commands;
using Stride.Core.Presentation.Services;
using Stride.Core.Presentation.ViewModels;

namespace Stride.Core.Assets.Editor.Avalonia;

public class NewOrOpenSessionTemplateCollectionViewModel
{
private readonly IModalDialog dialog;
private readonly IViewModelServiceProvider serviceProvider;
public NewOrOpenSessionTemplateCollectionViewModel(IViewModelServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
BrowseForExistingProjectCommand = new AnonymousTaskCommand(serviceProvider, BrowseForExistingProject);
}
public ICommandBase BrowseForExistingProjectCommand { get; }
public bool AutoReloadSession { get; }

private async Task BrowseForExistingProject()
{
var filePath = await EditorDialogHelper.BrowseForExistingProject(serviceProvider);
if (filePath != null)
{
//SelectedTemplate = new ExistingProjectViewModel(ServiceProvider, filePath, RemoveExistingProjects);
dialog?.RequestClose(DialogResult.Ok);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="300"
x:Class="Stride.Core.Assets.Editor.Avalonia.ObjectBrowserUserControl">
<Grid ColumnDefinitions="*,5,3*,5,220">
<TreeView Grid.Column="0" SelectionMode="Single"
ItemsSource="{Binding HierarchyItemsSource, ElementName=ObjectBrowser, Mode=TwoWay}"
SelectedItem="{Binding SelectedHierarchyItem, ElementName=ObjectBrowser, Mode=TwoWay}"
ItemTemplate="{Binding HierarchyItemTemplate, ElementName=ObjectBrowser, Mode=TwoWay}" />

<GridSplitter Grid.Column="1" ResizeBehavior="PreviousAndNext" VerticalAlignment="Stretch" Width="5"/>

<ListBox Grid.Column="2"
ItemsSource="{Binding ObjectItemsSource, ElementName=ObjectBrowser, Mode=TwoWay}"
SelectedItem="{Binding SelectedObjectItem, ElementName=ObjectBrowser, Mode=TwoWay}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>

<GridSplitter Grid.Column="3" ResizeBehavior="PreviousAndNext" VerticalAlignment="Stretch" Width="5"/>

<DockPanel Grid.Column="4" Background="{DynamicResource ControlBackgroundBrush}">
<ScrollViewer x:Name="DescriptionScrollViewer" VerticalScrollBarVisibility="Auto">
<ContentPresenter Content="{Binding SelectedObjectItem, ElementName=ObjectBrowser, Mode=TwoWay}"
ContentTemplate="{Binding ObjectDescriptionTemplate, ElementName=ObjectBrowser, Mode=TwoWay}"/>
</ScrollViewer>
</DockPanel>
</Grid>
</UserControl>

Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.

using System.Collections;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
using Avalonia.Styling;

namespace Stride.Core.Assets.Editor.Avalonia;

public partial class ObjectBrowserUserControl : UserControl
{
public static readonly StyledProperty<IEnumerable> HierarchyItemsSourceProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IEnumerable>(nameof(HierarchyItemsSource));

public static readonly StyledProperty<object> SelectedHierarchyItemProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, object>(nameof(SelectedHierarchyItem));

public static readonly StyledProperty<IDataTemplate> HierarchyItemTemplateProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IDataTemplate>(nameof(HierarchyItemTemplate));

public static readonly StyledProperty<IStyle> HierarchyItemContainerStyleProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IStyle>(nameof(HierarchyItemContainerStyle));

public static readonly StyledProperty<IEnumerable> ObjectItemsSourceProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IEnumerable>(nameof(ObjectItemsSource));

public static readonly StyledProperty<object> SelectedObjectItemProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, object>(nameof(SelectedObjectItem));

public static readonly StyledProperty<IDataTemplate> ObjectItemTemplateProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IDataTemplate>(nameof(ObjectItemTemplate));

public static readonly StyledProperty<IDataTemplate> ObjectItemTemplateSelectorProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IDataTemplate>(nameof(ObjectItemTemplateSelector));

public static readonly StyledProperty<IStyle> ObjectItemContainerStyleProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IStyle>(nameof(ObjectItemContainerStyle));

public static readonly StyledProperty<IDataTemplate> ObjectDescriptionTemplateProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IDataTemplate>(nameof(ObjectDescriptionTemplate));

public static readonly StyledProperty<IDataTemplate> ObjectDescriptionTemplateSelectorProperty =
AvaloniaProperty.Register<ObjectBrowserUserControl, IDataTemplate>(nameof(ObjectDescriptionTemplateSelector));

public ObjectBrowserUserControl()
{
InitializeComponent();
}

public IEnumerable HierarchyItemsSource
{
get => GetValue(HierarchyItemsSourceProperty);
set => SetValue(HierarchyItemsSourceProperty, value);
}

public object SelectedHierarchyItem
{
get => GetValue(SelectedHierarchyItemProperty);
set => SetValue(SelectedHierarchyItemProperty, value);
}

public IDataTemplate HierarchyItemTemplate
{
get => GetValue(HierarchyItemTemplateProperty);
set => SetValue(HierarchyItemTemplateProperty, value);
}

public IStyle HierarchyItemContainerStyle
{
get => GetValue(HierarchyItemContainerStyleProperty);
set => SetValue(HierarchyItemContainerStyleProperty, value);
}

public IEnumerable ObjectItemsSource
{
get => GetValue(ObjectItemsSourceProperty);
set => SetValue(ObjectItemsSourceProperty, value);
}

public object SelectedObjectItem
{
get => GetValue(SelectedObjectItemProperty);
set => SetValue(SelectedObjectItemProperty, value);
}

public IDataTemplate ObjectItemTemplate
{
get => GetValue(ObjectItemTemplateProperty);
set => SetValue(ObjectItemTemplateProperty, value);
}

public IDataTemplate ObjectItemTemplateSelector
{
get => GetValue(ObjectItemTemplateSelectorProperty);
set => SetValue(ObjectItemTemplateSelectorProperty, value);
}

public IStyle ObjectItemContainerStyle
{
get => GetValue(ObjectItemContainerStyleProperty);
set => SetValue(ObjectItemContainerStyleProperty, value);
}

public IDataTemplate ObjectDescriptionTemplate
{
get => GetValue(ObjectDescriptionTemplateProperty);
set => SetValue(ObjectDescriptionTemplateProperty, value);
}

public IDataTemplate ObjectDescriptionTemplateSelector
{
get => GetValue(ObjectDescriptionTemplateSelectorProperty);
set => SetValue(ObjectDescriptionTemplateSelectorProperty, value);
}

// If you have a scroll viewer in your .axaml file:
private void OnSelectedObjectItemChanged()
{
// ScrollViewer?.ScrollToTop(); // Placeholder: hook up actual ScrollViewer reference
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:avalonia="clr-namespace:Stride.Core.Assets.Editor.Avalonia"
xmlns:sd="http://schemas.stride3d.net/xaml/presentation"
mc:Ignorable="d"
Height="768" Width="1024" ShowInTaskbar="False"
x:Class="Stride.Core.Assets.Editor.Avalonia.ProjectSelectionWindow"
d:DataContext="{d:DesignInstance avalonia:NewOrOpenSessionTemplateCollectionViewModel}">
<DockPanel>
<Grid DockPanel.Dock="Bottom">
<DockPanel>
<DockPanel DockPanel.Dock="Bottom" Margin="20">
<Button DockPanel.Dock="Left" Content="{sd:LocalizeString Browse for existing project, Context=Button}" Command="{Binding BrowseForExistingProjectCommand}" Padding="20,6"/>
<CheckBox IsChecked="{Binding AutoReloadSession}" Content="{sd:LocalizeString Reload last session automatically at startup, Context=Button}"
VerticalAlignment="Center" Margin="8"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<UniformGrid Rows="1">
<Button Content="{sd:LocalizeString Select, Context=Button}" Padding="20,6" Margin="10,0,0,0"
IsEnabled="{Binding SelectedTemplate, Converter={sd:ObjectToBool}}">
</Button>
<Button Content="{sd:LocalizeString Cancel, Context=Button}" Padding="20,6" Margin="10,0,0,0" IsCancel="True">
</Button>
</UniformGrid>
</StackPanel>
</DockPanel>
<Grid ColumnDefinitions="Auto,2*,*" RowDefinitions="Auto,Auto,Auto,Auto">
<TextBlock Grid.Row="0" Grid.Column="0" Text="{sd:LocalizeString Name:}" Margin="20,0" VerticalAlignment="Center"/>
<TextBox Grid.Row="0" Grid.Column="1" Margin="2" Text="{Binding Name}"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="{sd:LocalizeString Location:}" Margin="20,0" VerticalAlignment="Center"/>
<DockPanel Grid.Row="1" Grid.Column="1">
<Button DockPanel.Dock="Right" Command="{Binding BrowseDirectoryCommand}" CommandParameter="Location">
</Button>
<TextBox Margin="2" Text="{Binding Location}"/>
</DockPanel>
<TextBlock Grid.Row="2" Grid.Column="0" Text="{sd:LocalizeString Solution name:}" Margin="20,0" VerticalAlignment="Center"/>
<TextBox Grid.Row="2" Grid.Column="1" Margin="2" Watermark="{sd:LocalizeString (Auto-generate solution name)}"
Text="{Binding SolutionName}">
</TextBox>
<TextBlock Grid.Row="3" Grid.Column="0" Text="{sd:LocalizeString Solution location:}" Margin="20,0" VerticalAlignment="Center"/>
<DockPanel Grid.Row="3" Grid.Column="1">
<Button DockPanel.Dock="Right" Command="{Binding BrowseDirectoryCommand}" CommandParameter="SolutionLocation" />
<TextBox Margin="2" Watermark="{sd:LocalizeString (Same location)}" Text="{Binding SolutionLocation}">
</TextBox>
</DockPanel>
</Grid>
</DockPanel>
</Grid>

<avalonia:TemplateBrowserUserControl Margin="10"/>
</DockPanel>
</Window>

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.

using Avalonia.Controls;

namespace Stride.Core.Assets.Editor.Avalonia;

public partial class ProjectSelectionWindow : Window
{
public ProjectSelectionWindow()
{
InitializeComponent();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:avalonia="clr-namespace:Stride.Core.Assets.Editor.Avalonia"
mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="300"
xmlns:viewModels="clr-namespace:Stride.Core.Assets.Editor.Components.TemplateDescriptions.ViewModels"
d:DataContext="{d:DesignInstance viewModels:TemplateDescriptionCollectionViewModel}"
x:Class="Stride.Core.Assets.Editor.Avalonia.TemplateBrowserUserControl">
<avalonia:ObjectBrowserUserControl HierarchyItemsSource="{Binding RootGroups}"
SelectedHierarchyItem="{Binding SelectedGroup, Mode=TwoWay}"
ObjectItemsSource="{Binding Templates}"
SelectedObjectItem="{Binding SelectedTemplate}"
ObjectItemTemplateSelector="{StaticResource DataTypeTemplateSelector}">
<avalonia:ObjectBrowserUserControl.HierarchyItemTemplate>
<TreeDataTemplate ItemsSource="{Binding SubGroups}" DataType="viewModels:TemplateDescriptionGroupViewModel">
<TextBlock Text="{Binding Name}"/>
</TreeDataTemplate>
</avalonia:ObjectBrowserUserControl.HierarchyItemTemplate>
<avalonia:ObjectBrowserUserControl.ObjectDescriptionTemplate>
<DataTemplate DataType="viewModels:ITemplateDescriptionViewModel">
<StackPanel DockPanel.Dock="Top">
<TextBlock FontWeight="Bold" Text="{Binding Name}" Margin="10"/>
<TextBlock Text="{Binding FullDescription}" Margin="10,20" TextWrapping="Wrap"/>

<ItemsControl ItemsSource="{Binding Screenshots}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Image Margin="2,12" Source="{Binding}" MaxWidth="192" StretchDirection="DownOnly" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</avalonia:ObjectBrowserUserControl.ObjectDescriptionTemplate>
</avalonia:ObjectBrowserUserControl>
</UserControl>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.

using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;

namespace Stride.Core.Assets.Editor.Avalonia;

public partial class TemplateBrowserUserControl : UserControl
{
public TemplateBrowserUserControl()
{
InitializeComponent();
}
}

Loading