XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

SpaceEngineersModDev/SpaceEngineersBlueprintEditorInWinUI

完善属性查看功能

5910fbe
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

6 个文件 +143 -13
Added SpaceEngineersBlueprintEditor/Implements/Services/DefinitionPropertiesDisplayService.cs +49 -0
@@ -0,0 +1,49 @@
1 using Microsoft.UI.Xaml.Media;
2 using SpaceEngineersBlueprintEditor.Interface.Services;
3 using SpaceEngineersBlueprintEditor.Model;
4 using System.Collections.ObjectModel;
5 using System.Diagnostics.CodeAnalysis;
6 using Windows.Foundation;
7 using XFEExtension.NetCore.StringExtension;
8
9 namespace SpaceEngineersBlueprintEditor.Implements.Services;
10
11 internal class DefinitionPropertiesDisplayService<T> : IDefinitionPropertiesDisplayService<T> where T : DefinitionViewData
12 {
13 private ItemsView? _itemsView;
14 private Page? _page;
15 private bool needToTrig = false;
16 private int currentTrigger = 0;
17 public bool IsPageLoaded => _page is not null && _page.IsLoaded;
18 public event TypedEventHandler<ItemsView, ItemsViewSelectionChangedEventArgs>? SelectionChanged;
19
20 [MemberNotNull(nameof(_page), nameof(_itemsView))]
21 public void Initialize(Page page, ItemsView itemsView)
22 {
23 _page = page;
24 _itemsView = itemsView;
25 _itemsView.SelectionChanged += (sender, args) => SelectionChanged?.Invoke(sender, args); ;
26 _page.Loaded += Page_Loaded;
27 }
28
29 private void Page_Loaded(object sender, RoutedEventArgs e)
30 {
31 if (needToTrig)
32 _itemsView?.Select(currentTrigger);
33 needToTrig = false;
34 }
35
36 public void Select(T item)
37 {
38 if (_itemsView is not null && _page is not null && _itemsView.ItemsSource is ObservableCollection<T> itemSource)
39 if (_page.IsLoaded)
40 {
41 _itemsView.Select(itemSource.IndexOf(item));
42 }
43 else
44 {
45 needToTrig = true;
46 currentTrigger = itemSource.IndexOf(item);
47 }
48 }
49 }
Added SpaceEngineersBlueprintEditor/Interface/Services/IDefinitionPropertiesDisplayService.cs +13 -0
@@ -0,0 +1,13 @@
1 using SpaceEngineersBlueprintEditor.Model;
2 using Windows.Foundation;
3
4 namespace SpaceEngineersBlueprintEditor.Interface.Services;
5
6 public interface IDefinitionPropertiesDisplayService<T> where T : DefinitionViewData
7 {
8 bool IsPageLoaded { get; }
9
10 event TypedEventHandler<ItemsView, ItemsViewSelectionChangedEventArgs> SelectionChanged;
11 void Initialize(Page page, ItemsView itemsView);
12 void Select(T item);
13 }
Added SpaceEngineersBlueprintEditor/Model/PropertyViewData.cs +9 -0
@@ -0,0 +1,9 @@
1 namespace SpaceEngineersBlueprintEditor.Model;
2
3 public class PropertyViewData
4 {
5 public required string PropertyName { get; set; }
6 public object? Value { get; set; }
7 public bool IsValueType { get; set; }
8 public bool IsNotValueType => !IsValueType;
9 }
Modified SpaceEngineersBlueprintEditor/ViewModels/GameDefinitionsViewPageViewModel.cs +47 -2
@@ -8,6 +8,7 @@ using SpaceEngineersBlueprintEditor.SpaceEngineersCore;
8 8 using SpaceEngineersBlueprintEditor.Utilities;
9 9 using System.Collections.ObjectModel;
10 10 using VRage.Game;
11 using XFEExtension.NetCore.StringExtension;
11 12
12 13 namespace SpaceEngineersBlueprintEditor.ViewModels;
13 14
@@ -16,15 +17,48 @@ public partial class GameDefinitionsViewPageViewModel : ViewModelBase
16 17 [ObservableProperty]
17 18 private string searchText = "";
18 19 [ObservableProperty]
20 private string propertiesSearchText = "";
21 [ObservableProperty]
19 22 private bool isProgressRingVisible = true;
20 23 [ObservableProperty]
21 24 private DefinitionViewData? selectedDefinitionViewData;
22 25 private string currentParameter = "";
23 26 private readonly List<DefinitionViewData> _definitions = [];
27 private readonly List<PropertyViewData> _propertiesInfo = [];
24 28 public ObservableCollection<DefinitionViewData> Definitions { get; } = [];
29 public ObservableCollection<PropertyViewData> PropertiesInfo { get; } = [];
25 30 public INavigationParameterService<string> NavigationParameterService { get; } = new NavigationParameterService<string>();
31 public IDefinitionPropertiesDisplayService<DefinitionViewData> DefinitionPropertiesDisplayService { get; } = new DefinitionPropertiesDisplayService<DefinitionViewData>();
26 32
27 public GameDefinitionsViewPageViewModel() => NavigationParameterService.ParameterChange += NavigationParameterService_ParameterChange;
33 public GameDefinitionsViewPageViewModel()
34 {
35 NavigationParameterService.ParameterChange += NavigationParameterService_ParameterChange;
36 DefinitionPropertiesDisplayService.SelectionChanged += DefinitionPropertiesDisplayService_SelectionChanged;
37 }
38
39 private void DefinitionPropertiesDisplayService_SelectionChanged(ItemsView sender, ItemsViewSelectionChangedEventArgs args)
40 {
41 if (sender.SelectedItem is DefinitionViewData definitionViewData)
42 {
43 SelectedDefinitionViewData = definitionViewData;
44 PropertiesInfo.Clear();
45 foreach (var definition in SelectedDefinitionViewData.DefinitionBase.GetType().GetFields())
46 {
47 if (definition.GetValue(SelectedDefinitionViewData.DefinitionBase) is object value)
48 {
49 var valueString = value.ToString();
50 var propertyViewData = new PropertyViewData
51 {
52 PropertyName = definition.Name,
53 Value = string.IsNullOrWhiteSpace(valueString) ? "值为空" : valueString,
54 IsValueType = value.GetType().IsValueType
55 };
56 _propertiesInfo.Add(propertyViewData);
57 PropertiesInfo.Add(propertyViewData);
58 }
59 }
60 }
61 }
28 62
29 63 private async void NavigationParameterService_ParameterChange(object? sender, string e)
30 64 {
@@ -32,6 +66,8 @@ public partial class GameDefinitionsViewPageViewModel : ViewModelBase
32 66 while (!Initializer.IsDefinitionsLoadComplete) { await Task.Delay(100); }
33 67 LoadDefinitions(GetCurrentDefinitions(currentParameter));
34 68 IsProgressRingVisible = false;
69 while (!DefinitionPropertiesDisplayService.IsPageLoaded) { await Task.Delay(100); }
70 DefinitionPropertiesDisplayService.Select(Definitions.First());
35 71 }
36 72
37 73 private void LoadDefinitions(IEnumerable<MyDefinitionBase> myDefinitions)
@@ -52,9 +88,11 @@ public partial class GameDefinitionsViewPageViewModel : ViewModelBase
52 88
53 89 private IEnumerable<DefinitionViewData> SearchDefinitions(string definitionsName) => _definitions.Where(definition => definition.DefinitionBase.DisplayNameText is not null && definition.DefinitionBase.DisplayNameText.Contains(definitionsName, StringComparison.OrdinalIgnoreCase));
54 90
91 private IEnumerable<PropertyViewData> SearchProperties(string propertiesName) => _propertiesInfo.Where(property => property.PropertyName.Contains(propertiesName, StringComparison.OrdinalIgnoreCase) || (property.Value is not null && property.Value.ToString() is string valueString && valueString.Contains(propertiesName, StringComparison.OrdinalIgnoreCase)));
92
55 93 private static IEnumerable<MyDefinitionBase> GetCurrentDefinitions(string currentLocation) => currentLocation switch
56 94 {
57 "Cubes" => SpaceEngineersHelper.CubeBlockDefinitions,
95 "Cubes" => SpaceEngineersHelper.CubeBlockDefinitions.OrderBy(definition => definition.CubeSize),
58 96 "Components" => SpaceEngineersHelper.ComponentDefinitions,
59 97 "Items" => SpaceEngineersHelper.ItemDefinitions,
60 98 _ => throw new NotImplementedException()
@@ -66,4 +104,11 @@ public partial class GameDefinitionsViewPageViewModel : ViewModelBase
66 104 foreach (var definition in SearchDefinitions(value))
67 105 Definitions.Add(definition);
68 106 }
107
108 partial void OnPropertiesSearchTextChanged(string value)
109 {
110 PropertiesInfo.Clear();
111 foreach (var property in SearchProperties(value))
112 PropertiesInfo.Add(property);
113 }
69 114 }
Modified SpaceEngineersBlueprintEditor/Views/GameDefinitionsViewPage.xaml +24 -9
@@ -2,11 +2,10 @@
2 2 <Page
3 3 x:Class="SpaceEngineersBlueprintEditor.Views.GameDefinitionsViewPage"
4 4 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
5 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
6 xmlns:local="using:SpaceEngineersBlueprintEditor.Views"
7 xmlns:model="using:SpaceEngineersBlueprintEditor.Model"
8 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
9 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
8 xmlns:model="using:SpaceEngineersBlueprintEditor.Model"
10 9 mc:Ignorable="d">
11 10
12 11 <Grid>
@@ -21,14 +20,14 @@
21 20 </StackPanel>
22 21 </Grid>
23 22 </Grid>
24 <Grid ColumnDefinitions="4*, *" RowSpacing="20" Background="{ThemeResource SolidBackgroundFillColorBaseBrush}" BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}" Margin="0,0,0,36" CornerRadius="8">
25 <ItemsView x:Name="definitionsItemView" SelectionChanged="DefinitionsItemView_SelectionChanged" Canvas.ZIndex="0" Padding="4" ItemsSource="{x:Bind ViewModel.Definitions}">
23 <Grid ColumnDefinitions="4*, *" RowSpacing="20">
24 <ItemsView x:Name="definitionsItemView" Canvas.ZIndex="0" Padding="4" ItemsSource="{x:Bind ViewModel.Definitions}">
26 25 <ItemsView.Layout>
27 26 <UniformGridLayout Orientation="Horizontal" />
28 27 </ItemsView.Layout>
29 28 <ItemsView.ItemTemplate>
30 29 <DataTemplate x:DataType="model:DefinitionViewData">
31 <ItemContainer Width="100" Height="100" Margin="4" Background="{ThemeResource CardBackgroundFillColorDefaultBrush}" BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}">
30 <ItemContainer Width="100" Height="100" Margin="4" ToolTipService.ToolTip="{x:Bind DefinitionBase.DisplayNameText}">
32 31 <Grid RowDefinitions="60, Auto" Padding="5">
33 32 <Image Source="{x:Bind ImageSource}" Width="60" Height="60" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center"/>
34 33 <TextBlock Grid.Row="1" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" HorizontalAlignment="Center" VerticalAlignment="Bottom" Text="{x:Bind DefinitionBase.DisplayNameText}"/>
@@ -41,14 +40,30 @@
41 40 </DataTemplate>
42 41 </ItemsView.ItemTemplate>
43 42 </ItemsView>
44 <Grid Grid.Column="1" Background="{ThemeResource CardBackgroundFillColorDefaultBrush}" BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}">
45 <ScrollView>
43 <Grid Grid.Column="1" Margin="0,0,0,24" Background="{ThemeResource CardBackgroundFillColorDefaultBrush}" BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}" CornerRadius="8">
44 <Grid RowDefinitions="Auto, Auto, *">
46 45 <StackPanel Padding="16" Spacing="20">
47 46 <TextBlock Text="{x:Bind ViewModel.SelectedDefinitionViewData.DefinitionBase.DisplayNameText, Mode=OneWay}" HorizontalAlignment="Left" Style="{ThemeResource SubtitleTextBlockStyle}"/>
48 47 <Image Source="{x:Bind ViewModel.SelectedDefinitionViewData.ImageSource, Mode=OneWay}" HorizontalAlignment="Left" Width="128" Height="128"/>
49 48 <TextBlock Text="{x:Bind ViewModel.SelectedDefinitionViewData.DefinitionBase.DescriptionText, Mode=OneWay}" HorizontalAlignment="Left" Style="{ThemeResource CaptionTextBlockStyle}"/>
50 49 </StackPanel>
51 </ScrollView>
50 <AutoSuggestBox Margin="5,10,5,0" Grid.Row="1" HorizontalAlignment="Stretch" PlaceholderText="Search properties..." QueryIcon="Find" Text="{x:Bind ViewModel.PropertiesSearchText, Mode=TwoWay}"/>
51 <ScrollView Padding="5" Grid.Row="2">
52 <ListView ItemsSource="{x:Bind ViewModel.PropertiesInfo}">
53 <ListView.ItemTemplate>
54 <DataTemplate x:DataType="model:PropertyViewData">
55 <ListViewItem>
56 <Grid ColumnDefinitions="*, *" ColumnSpacing="20">
57 <TextBlock ToolTipService.ToolTip="{x:Bind Value}" Grid.Column="1" Text="{x:Bind Value}" Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" HorizontalAlignment="Right" Visibility="{x:Bind IsValueType}" TextTrimming="CharacterEllipsis"/>
58 <TextBlock ToolTipService.ToolTip="{x:Bind Value}" Grid.Column="1" Text="{x:Bind Value}" HorizontalAlignment="Right" Visibility="{x:Bind IsNotValueType}" TextTrimming="CharacterEllipsis"/>
59 <TextBlock ToolTipService.ToolTip="{x:Bind PropertyName}" Text="{x:Bind PropertyName}" HorizontalAlignment="Left" TextTrimming="CharacterEllipsis"/>
60 </Grid>
61 </ListViewItem>
62 </DataTemplate>
63 </ListView.ItemTemplate>
64 </ListView>
65 </ScrollView>
66 </Grid>
52 67 </Grid>
53 68 <Grid Margin="0,0,0,20" Width="250" Padding="5" CornerRadius="8" VerticalAlignment="Bottom" HorizontalAlignment="Center" Background="{ThemeResource AcrylicInAppFillColorDefaultBrush}">
54 69 <AutoSuggestBox PlaceholderText="Search definitions..." QueryIcon="Find" Text="{x:Bind ViewModel.SearchText, Mode=TwoWay}"/>
Modified SpaceEngineersBlueprintEditor/Views/GameDefinitionsViewPage.xaml.cs +1 -2
@@ -16,6 +16,7 @@ public sealed partial class GameDefinitionsViewPage : Page
16 16 {
17 17 PageManager.AddOrUpdateCurrentPage(Current = this);
18 18 this.InitializeComponent();
19 ViewModel.DefinitionPropertiesDisplayService.Initialize(this, definitionsItemView);
19 20 }
20 21
21 22 protected override void OnNavigatedTo(NavigationEventArgs e)
@@ -27,6 +28,4 @@ public sealed partial class GameDefinitionsViewPage : Page
27 28 ViewModel.NavigationParameterService.OnParameterChange(Parameter);
28 29 }
29 30 }
30
31 private void DefinitionsItemView_SelectionChanged(ItemsView sender, ItemsViewSelectionChangedEventArgs args) => ViewModel.SelectedDefinitionViewData = (Model.DefinitionViewData?)sender.SelectedItem;
32 31 }