1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

WIP on layer properties window

This commit is contained in:
SpoinkyNL 2016-03-26 10:20:30 +01:00
parent 99e9620db2
commit 9c32bb6ce6
9 changed files with 290 additions and 111 deletions

View File

@ -411,6 +411,7 @@
<Compile Include="Modules\Games\RocketLeague\RocketLeagueViewModel.cs" /> <Compile Include="Modules\Games\RocketLeague\RocketLeagueViewModel.cs" />
<Compile Include="Modules\Games\Witcher3\Witcher3ViewModel.cs" /> <Compile Include="Modules\Games\Witcher3\Witcher3ViewModel.cs" />
<Compile Include="ViewModels\LayerEditorViewModel.cs" /> <Compile Include="ViewModels\LayerEditorViewModel.cs" />
<Compile Include="ViewModels\LayerEditor\LayerConditionViewModel.cs" />
<Compile Include="ViewModels\OverlaysViewModel.cs" /> <Compile Include="ViewModels\OverlaysViewModel.cs" />
<Compile Include="Modules\Overlays\VolumeDisplay\VolumeDisplayViewModel.cs" /> <Compile Include="Modules\Overlays\VolumeDisplay\VolumeDisplayViewModel.cs" />
<Compile Include="ViewModels\ProfileEditorViewModel.cs" /> <Compile Include="ViewModels\ProfileEditorViewModel.cs" />
@ -453,6 +454,9 @@
<Compile Include="Views\LayerEditorView.xaml.cs"> <Compile Include="Views\LayerEditorView.xaml.cs">
<DependentUpon>LayerEditorView.xaml</DependentUpon> <DependentUpon>LayerEditorView.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Views\LayerEditor\LayerConditionView.xaml.cs">
<DependentUpon>LayerConditionView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\OverlaysView.xaml.cs"> <Compile Include="Views\OverlaysView.xaml.cs">
<DependentUpon>OverlaysView.xaml</DependentUpon> <DependentUpon>OverlaysView.xaml</DependentUpon>
</Compile> </Compile>
@ -606,6 +610,10 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="Views\LayerEditor\LayerConditionView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\OverlaysView.xaml"> <Page Include="Views\OverlaysView.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>

View File

@ -1,4 +1,5 @@
using Artemis.Models.Interfaces; using System;
using Artemis.Models.Interfaces;
namespace Artemis.Modules.Games.TheDivision namespace Artemis.Modules.Games.TheDivision
{ {
@ -20,6 +21,7 @@ namespace Artemis.Modules.Games.TheDivision
public TestTest TestyTest { get; set; } public TestTest TestyTest { get; set; }
} }
public class TestTest public class TestTest
{ {
public string TestS { get; set; } public string TestS { get; set; }

View File

@ -7,52 +7,52 @@
xmlns:cal="http://www.caliburnproject.org" xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="416.495" d:DesignWidth="553.608"> d:DesignHeight="416.495" d:DesignWidth="553.608">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Grid Margin="15, 5, 15, 5"> <Grid Margin="15, 5, 15, 5">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition /> <ColumnDefinition />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"> <StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
<Label FontSize="20" HorizontalAlignment="Left"> <Label FontSize="20" HorizontalAlignment="Left">
<Label.Content> <Label.Content>
<AccessText TextWrapping="Wrap" <AccessText TextWrapping="Wrap"
Text="Shows lots of things, I should change this." /> Text="Shows lots of things, I should change this." />
</Label.Content> </Label.Content>
</Label> </Label>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Label Content="Enable effect" Margin="0 3 0 0" HorizontalAlignment="Right" /> <Label Content="Enable effect" Margin="0 3 0 0" HorizontalAlignment="Right" />
<ToggleButton x:Name="EffectEnabled" Margin="0 3 0 0" Width="25" Height="25" <ToggleButton x:Name="EffectEnabled" Margin="0 3 0 0" Width="25" Height="25"
IsChecked="{Binding Path=GameSettings.Enabled, Mode=TwoWay}" IsChecked="{Binding Path=GameSettings.Enabled, Mode=TwoWay}"
Style="{DynamicResource MetroCircleToggleButtonStyle}" Style="{DynamicResource MetroCircleToggleButtonStyle}"
cal:Message.Attach="[Event Click] = [Action ToggleEffect]" /> cal:Message.Attach="[Event Click] = [Action ToggleEffect]" />
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<TextBlock Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Center" Margin="0,8" <TextBlock Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Center" Margin="0,8"
TextWrapping="Wrap" HorizontalAlignment="Left" FontFamily="Segoe UI Semibold" TextWrapping="Wrap" HorizontalAlignment="Left" FontFamily="Segoe UI Semibold"
Foreground="{DynamicResource HighlightBrush}" MaxWidth="510" TextAlignment="Justify"> Foreground="{DynamicResource HighlightBrush}" MaxWidth="510" TextAlignment="Justify">
Note: For this game to work with Artemis, please open up your Division settings, navigate to 3rd Party and set LED keyboard support to Yes. (This only works if you have Artemis running before starting the game) Note: For this game to work with Artemis, please open up your Division settings, navigate to 3rd Party and set LED keyboard support to Yes. (This only works if you have Artemis running before starting the game)
</TextBlock> </TextBlock>
<!-- Profile editor --> <!-- Profile editor -->
<ContentControl Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" x:Name="ProfileEditor" /> <ContentControl Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" x:Name="ProfileEditor" />
<!-- Buttons --> <!-- Buttons -->
<StackPanel Grid.Column="0" Grid.Row="4" Orientation="Horizontal" VerticalAlignment="Bottom"> <StackPanel Grid.Column="0" Grid.Row="4" Orientation="Horizontal" VerticalAlignment="Bottom">
<Button x:Name="ResetSettings" Content="Reset effect" VerticalAlignment="Top" Width="100" <Button x:Name="ResetSettings" Content="Reset effect" VerticalAlignment="Top" Width="100"
Style="{DynamicResource SquareButtonStyle}" /> Style="{DynamicResource SquareButtonStyle}" />
<Button x:Name="SaveSettings" Content="Save changes" VerticalAlignment="Top" Width="100" <Button x:Name="SaveSettings" Content="Save changes" VerticalAlignment="Top" Width="100"
Margin="10,0,0,0" Margin="10,0,0,0"
Style="{DynamicResource SquareButtonStyle}" /> Style="{DynamicResource SquareButtonStyle}" />
</StackPanel> </StackPanel>
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Security.Principal; using System.Security.Principal;
using System.Windows; using System.Windows;
@ -53,33 +54,45 @@ namespace Artemis.Utilities
} }
} }
public static List<PropertyCollection> GetPropertyMap(object o) public static List<PropertyCollection> GenerateTypeMap(object o) => GenerateTypeMap(o.GetType().GetProperties());
{ public static List<PropertyCollection> GenerateTypeMap<T>() => GenerateTypeMap(typeof (T).GetProperties());
var res = new List<PropertyCollection>();
// No point reinventing the wheel, just serialize it to JSON and parse that
var json = JObject.FromObject(o, JsonSerializer.CreateDefault());
res.AddRange(JObjectToPropertyCollection(json));
return res; private static List<PropertyCollection> GenerateTypeMap(IEnumerable<PropertyInfo> getProperties,
} string path = "")
private static List<PropertyCollection> JObjectToPropertyCollection(JObject json)
{ {
var res = new List<PropertyCollection>(); var list = new List<PropertyCollection>();
foreach (var property in json.Properties()) foreach (var propertyInfo in getProperties)
{ {
var parent = new PropertyCollection {Name = property.Name}; var parent = new PropertyCollection
foreach (var child in property.Children<JObject>()) {
parent.Children = JObjectToPropertyCollection(child); Type = propertyInfo.PropertyType.Name,
Display = $"{path.Replace(".", " ")}{propertyInfo.Name}",
Path = $"{path}{propertyInfo.Name}"
};
res.Add(parent); if (propertyInfo.PropertyType.BaseType?.Name == "Enum")
{
parent.EnumValues = Enum.GetNames(propertyInfo.PropertyType);
parent.Type = "Enum";
}
list.Add(parent);
list.AddRange(GenerateTypeMap(propertyInfo.PropertyType.GetProperties(), path + $"{propertyInfo.Name}."));
} }
return res; return list;
} }
public struct PropertyCollection public struct PropertyCollection
{ {
public string Name { get; set; } public string Display { get; set; }
public string Path { get; set; }
public string Type { get; set; }
/// <summary>
/// Only used if Type is an enumerable
/// </summary>
public string[] EnumValues { get; set; }
public List<PropertyCollection> Children { get; set; } public List<PropertyCollection> Children { get; set; }
} }
} }

View File

@ -0,0 +1,100 @@
using System.Linq;
using Artemis.Models.Profiles;
using Artemis.Utilities;
using Caliburn.Micro;
namespace Artemis.ViewModels.LayerEditor
{
public class LayerConditionViewModel<T> : Screen
{
private readonly LayerEditorViewModel<T> _conditionModel;
private GeneralHelpers.PropertyCollection _selectedDataModelProp;
private string _selectedOperator;
private bool _userValueIsVisible;
public LayerConditionViewModel(LayerEditorViewModel<T> conditionModel, LayerConditionModel layerConditionModel,
BindableCollection<GeneralHelpers.PropertyCollection> dataModelProps)
{
_conditionModel = conditionModel;
LayerConditionModel = layerConditionModel;
DataModelProps = dataModelProps;
Operators = new BindableCollection<string>();
}
public LayerConditionModel LayerConditionModel { get; set; }
public BindableCollection<GeneralHelpers.PropertyCollection> DataModelProps { get; set; }
public BindableCollection<string> Operators { get; set; }
public GeneralHelpers.PropertyCollection SelectedDataModelProp
{
get { return _selectedDataModelProp; }
set
{
if (value.Equals(_selectedDataModelProp)) return;
_selectedDataModelProp = value;
OnSelectedItemChangedAction(_selectedDataModelProp);
NotifyOfPropertyChange(() => SelectedDataModelProp);
}
}
public string SelectedOperator
{
get { return _selectedOperator; }
set
{
if (value == _selectedOperator) return;
_selectedOperator = value;
NotifyOfPropertyChange(() => SelectedOperator);
}
}
public bool UserValueIsVisible
{
get { return _userValueIsVisible; }
set
{
if (value == _userValueIsVisible) return;
_userValueIsVisible = value;
NotifyOfPropertyChange(() => UserValueIsVisible);
}
}
public void OnSelectedItemChangedAction(GeneralHelpers.PropertyCollection prop)
{
Operators.Clear();
if (prop.EnumValues != null)
{
Operators.AddRange(prop.EnumValues);
UserValueIsVisible = false;
}
else
switch (prop.Type)
{
case "Int32":
Operators.AddRange(new[]
{
"Lower than", "Lower or equal to", "Higher than", "Higher or equal to", "Equal to",
"Not equal to"
});
UserValueIsVisible = true;
break;
case "Boolean":
Operators.AddRange(new[] {"False", "True"});
UserValueIsVisible = false;
break;
default:
Operators.AddRange(new[] {"Equal to", "Not equal to"});
UserValueIsVisible = true;
break;
}
SelectedOperator = Operators.First();
}
public void Delete()
{
_conditionModel.DeleteCondition(this, LayerConditionModel);
}
}
}

View File

@ -1,9 +1,7 @@
using System; using System.Linq;
using System.Collections;
using System.Diagnostics;
using System.Reflection;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.ViewModels.LayerEditor;
using Caliburn.Micro; using Caliburn.Micro;
namespace Artemis.ViewModels namespace Artemis.ViewModels
@ -15,13 +13,19 @@ namespace Artemis.ViewModels
public LayerEditorViewModel(LayerModel layer) public LayerEditorViewModel(LayerModel layer)
{ {
Layer = layer; Layer = layer;
DataModelProps = new BindableCollection<GeneralHelpers.PropertyCollection>(); DataModelProps = new BindableCollection<GeneralHelpers.PropertyCollection>();
DataModelProps.AddRange(GeneralHelpers.GetPropertyMap((T)Activator.CreateInstance(typeof(T), new object[] { }))); DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap<T>());
LayerConditionVms =
new BindableCollection<LayerConditionViewModel<T>>(
layer.LayerConditions.Select(c => new LayerConditionViewModel<T>(this, c, DataModelProps)));
ProposedProperties = new LayerPropertiesModel(); ProposedProperties = new LayerPropertiesModel();
GeneralHelpers.CopyProperties(ProposedProperties, Layer.LayerUserProperties); GeneralHelpers.CopyProperties(ProposedProperties, Layer.LayerUserProperties);
} }
public BindableCollection<LayerConditionViewModel<T>> LayerConditionVms { get; set; }
public LayerModel Layer public LayerModel Layer
{ {
get { return _layer; } get { return _layer; }
@ -37,9 +41,22 @@ namespace Artemis.ViewModels
public LayerPropertiesModel ProposedProperties { get; set; } public LayerPropertiesModel ProposedProperties { get; set; }
public void AddCondition()
{
var condition = new LayerConditionModel();
Layer.LayerConditions.Add(condition);
LayerConditionVms.Add(new LayerConditionViewModel<T>(this, condition, DataModelProps));
}
public void Apply() public void Apply()
{ {
GeneralHelpers.CopyProperties(Layer.LayerUserProperties, ProposedProperties); GeneralHelpers.CopyProperties(Layer.LayerUserProperties, ProposedProperties);
} }
public void DeleteCondition(LayerConditionViewModel<T> layerConditionViewModel, LayerConditionModel layerConditionModel)
{
LayerConditionVms.Remove(layerConditionViewModel);
Layer.LayerConditions.Remove(layerConditionModel);
}
} }
} }

View File

@ -0,0 +1,41 @@
<UserControl x:Class="Artemis.Views.LayerEditor.LayerConditionView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Artemis.Views.LayerEditor"
xmlns:cal="http://www.caliburnproject.org"
xmlns:utilities="clr-namespace:Artemis.Utilities"
mc:Ignorable="d"
d:DesignHeight="132.061" d:DesignWidth="632.296">
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="30" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="120" />
</Grid.ColumnDefinitions>
<!-- Left -->
<ComboBox x:Name="DataModelProps" Grid.Column="0" Width="250" MaxDropDownHeight="125"
HorizontalAlignment="Center" VerticalAlignment="Top" DisplayMemberPath="Display" />
<!-- Center -->
<TextBlock Grid.Column="1" Text="is" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,3,0,0" />
<ComboBox x:Name="Operators" Grid.Column="2" Width="150" MaxDropDownHeight="125" HorizontalAlignment="Center"
VerticalAlignment="Top" Margin="0,0,20,0" />
<!-- Right -->
<Grid Grid.Column="3">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" x:Name="UserValueIsVisible">
<TextBox x:Name="UserValue" VerticalAlignment="Top" />
</StackPanel>
<Button Grid.Row="1" x:Name="Delete" Content="Delete condition" VerticalAlignment="Bottom" Width="100"
Style="{DynamicResource SquareButtonStyle}" HorizontalAlignment="Right" />
</Grid>
</Grid>
</UserControl>

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Artemis.Views.LayerEditor
{
/// <summary>
/// Interaction logic for LayerConditionView.xaml
/// </summary>
public partial class LayerConditionView : UserControl
{
public LayerConditionView()
{
InitializeComponent();
}
}
}

View File

@ -7,56 +7,26 @@
xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:cal="http://www.caliburnproject.org" xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d" mc:Ignorable="d"
Title="Artemis | Edit Layer" Height="400" Width="600" Title="Artemis | Edit Layer" Height="800" Width="630"
GlowBrush="{DynamicResource AccentColorBrush}" Icon="../logo.ico"> GlowBrush="{DynamicResource AccentColorBrush}" Icon="../logo.ico" ResizeMode="NoResize">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="10" FontSize="16" Text="Display if.." /> <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="10" FontSize="16" Text="Display if.." />
<ListBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"> <ListBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" x:Name="LayerConditionVms" />
<ListBoxItem Margin="10, 0, 10, 0" Padding="10"> <Button Grid.Row="2" Grid.Column="0" x:Name="AddCondition" Content="Add condition" VerticalAlignment="Top"
<Grid> Style="{DynamicResource SquareButtonStyle}" Width="95" HorizontalAlignment="Left" Margin="10" />
<Grid.ColumnDefinitions> <Button Grid.Row="3" Grid.Column="0" x:Name="Apply" Content="Apply" VerticalAlignment="Bottom"
<ColumnDefinition Width="*" /> Style="{DynamicResource SquareButtonStyle}" Width="95" HorizontalAlignment="Left" Margin="10" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- Left -->
<Border BorderThickness="1" BorderBrush="{DynamicResource GrayBrush6}">
<TreeView x:Name="ProfileTree" ItemsSource="{Binding Path=DataModelProps}" Width="200"
Height="100">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Border>
<!-- Center -->
<TextBlock Grid.Column="1" Text="is" VerticalAlignment="Top" HorizontalAlignment="Center"
Margin="0,3,0,0" />
<ComboBox Grid.Column="2" Width="60" IsEditable="True" MaxDropDownHeight="125"
Style="{DynamicResource VirtualisedMetroComboBox}" HorizontalAlignment="Center"
VerticalAlignment="Top" ItemsSource="{Binding Path=DataModelProps}" />
<TextBlock Grid.Column="3" Text="than" VerticalAlignment="Top" HorizontalAlignment="Center"
Margin="0,3,0,0" />
<!-- Right -->
<TextBox Grid.Column="4" Width="200" VerticalAlignment="Top" />
</Grid>
</ListBoxItem>
</ListBox>
</Grid> </Grid>
</controls:MetroWindow> </controls:MetroWindow>