返回提交历史
Added
SpaceEngineersBlueprintEditor/Implements/Services/DefinitionPropertiesDisplayService.cs
+49
-0
Added
SpaceEngineersBlueprintEditor/Interface/Services/IDefinitionPropertiesDisplayService.cs
+13
-0
Added
SpaceEngineersBlueprintEditor/Model/PropertyViewData.cs
+9
-0
Modified
SpaceEngineersBlueprintEditor/ViewModels/GameDefinitionsViewPageViewModel.cs
+47
-2
Modified
SpaceEngineersBlueprintEditor/Views/GameDefinitionsViewPage.xaml
+24
-9
Modified
SpaceEngineersBlueprintEditor/Views/GameDefinitionsViewPage.xaml.cs
+1
-2
SpaceEngineersModDev/SpaceEngineersBlueprintEditorInWinUI
完善属性查看功能
5910fbe
代码差异
6 个文件
+143
-13
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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}"/>
@@ -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
}