Skip to content

Commit 2d44d18

Browse files
committed
Numeric option
1 parent fe18e14 commit 2d44d18

File tree

6 files changed

+42
-17
lines changed

6 files changed

+42
-17
lines changed
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,22 @@ namespace CommunityToolkit.Labs.Core.SourceGenerators.Attributes;
1313
/// <para/>
1414
/// </remarks>
1515
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
16-
public sealed class ToolkitSampleSliderOptionAttribute : ToolkitSampleOptionBaseAttribute
16+
public sealed class ToolkitSampleNumericOptionAttribute : ToolkitSampleOptionBaseAttribute
1717
{
1818
/// <summary>
19-
/// Creates a new instance of <see cref="ToolkitSampleSliderOptionAttribute"/>.
19+
/// Creates a new instance of <see cref="ToolkitSampleNumericOptionAttribute"/>.
2020
/// </summary>
2121
/// <param name="bindingName">The name of the generated property, which you can bind to in XAML.</param>
2222
/// <param name="choices">A list of the choices to display to the user. Can be literal values, or labeled values. Use a " : " separator (single colon surrounded by at least 1 whitespace) to separate a label from a value.</param>
2323
/// <param name="title">A title to display on top of this option.</param>
24-
public ToolkitSampleSliderOptionAttribute(string bindingName, double initial = 0, double min = 0, double max = 10, double step = 1)
24+
public ToolkitSampleNumericOptionAttribute(string bindingName, double initial = 0, double min = 0, double max = 10, double step = 1, bool showAsNumberBox = false)
2525
: base(bindingName, null)
2626
{
2727
Initial = initial;
2828
Min = min;
2929
Max = max;
3030
Step = step;
31+
ShowAsNumberBox = showAsNumberBox;
3132
}
3233

3334
/// <summary>
@@ -50,6 +51,11 @@ public ToolkitSampleSliderOptionAttribute(string bindingName, double initial = 0
5051
/// </summary>
5152
public double Step { get; }
5253

54+
/// <summary>
55+
/// Determines if a Slider or NumberBox is shown.
56+
/// </summary>
57+
public bool ShowAsNumberBox { get; }
58+
5359
/// <summary>
5460
/// The source generator-friendly type name used for casting.
5561
/// </summary>
Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,25 @@
77
namespace CommunityToolkit.Labs.Core.SourceGenerators.Metadata;
88

99
/// <summary>
10-
/// An INPC-enabled metadata container for data defined in an <see cref="ToolkitSampleSliderOptionAttribute"/>.
10+
/// An INPC-enabled metadata container for data defined in an <see cref="ToolkitSampleNumericOptionAttribute"/>.
1111
/// </summary>
12-
public class ToolkitSampleSliderOptionMetadataViewModel : IGeneratedToolkitSampleOptionViewModel
12+
public class ToolkitSampleNumericOptionMetadataViewModel : IGeneratedToolkitSampleOptionViewModel
1313
{
1414
private string? _title;
1515
private object _value;
1616

1717
/// <summary>
18-
/// Creates a new instance of <see cref="ToolkitSampleSliderOptionMetadataViewModel"/>.
18+
/// Creates a new instance of <see cref="ToolkitSampleNumericOptionMetadataViewModel"/>.
1919
/// </summary>
20-
public ToolkitSampleSliderOptionMetadataViewModel(string name, double initial = 0, double min = 0, double max = 10, double step = 1, string? title = null)
20+
public ToolkitSampleNumericOptionMetadataViewModel(string name, double initial = 0, double min = 0, double max = 10, double step = 1, bool showAsNumberBox = false, string? title = null)
2121
{
2222
Name = name;
2323
_title = title;
2424
_value = initial;
2525
Max = max;
2626
Min = min;
27-
Step = step;;
27+
Step = step;
28+
ShowAsNumberBox = showAsNumberBox;
2829
}
2930

3031
/// <inheritdoc cref="INotifyPropertyChanged.PropertyChanged"/>
@@ -34,7 +35,7 @@ public ToolkitSampleSliderOptionMetadataViewModel(string name, double initial =
3435
/// A unique identifier for this option.
3536
/// </summary>
3637
/// <remarks>
37-
/// Used by the sample system to match up <see cref="ToolkitSampleSliderOptionMetadataViewModel"/> to the original <see cref="ToolkitSampleSliderOptionAttribute"/> and the control that declared it.
38+
/// Used by the sample system to match up <see cref="ToolkitSampleNumericOptionMetadataViewModel"/> to the original <see cref="ToolkitSampleNumericOptionAttribute"/> and the control that declared it.
3839
/// </remarks>
3940
public string Name { get; }
4041

@@ -80,6 +81,11 @@ public object? Value
8081
/// </summary>
8182
public double Step { get; }
8283

84+
/// <summary>
85+
/// Determines if a Slider or NumberBox is shown.
86+
/// </summary>
87+
public bool ShowAsNumberBox { get; }
88+
8389
/// <summary>
8490
/// A label to display along the slider.
8591
/// </summary>

CommunityToolkit.Labs.Core.SourceGenerators/ToolkitSampleMetadataGenerator.Sample.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ void Execute(IncrementalValuesProvider<ISymbol> types, bool skipDiagnostics = fa
6464
if (x.Item2.TryReconstructAs<ToolkitSampleMultiChoiceOptionAttribute>() is ToolkitSampleMultiChoiceOptionAttribute multiChoiceOptionAttribute)
6565
return (x.Item1, (ToolkitSampleOptionBaseAttribute)multiChoiceOptionAttribute);
6666

67-
if (x.Item2.TryReconstructAs<ToolkitSampleSliderOptionAttribute>() is ToolkitSampleSliderOptionAttribute sliderOptionAttribute)
68-
return (x.Item1, (ToolkitSampleOptionBaseAttribute)sliderOptionAttribute);
67+
if (x.Item2.TryReconstructAs<ToolkitSampleNumericOptionAttribute>() is ToolkitSampleNumericOptionAttribute numericOptionAttribute)
68+
return (x.Item1, (ToolkitSampleOptionBaseAttribute)numericOptionAttribute);
6969

7070
if (x.Item2.TryReconstructAs<ToolkitSampleTextOptionAttribute>() is ToolkitSampleTextOptionAttribute textOptionAttribute)
7171
return (x.Item1, (ToolkitSampleOptionBaseAttribute)textOptionAttribute);
@@ -293,9 +293,9 @@ private static IEnumerable<string> BuildNewGeneratedSampleOptionMetadataSource(T
293293
{
294294
yield return $@"new {typeof(ToolkitSampleBoolOptionMetadataViewModel).FullName}(name: ""{boolAttribute.Name}"", defaultState: {boolAttribute.DefaultState?.ToString().ToLower()}, title: ""{boolAttribute.Title}"")";
295295
}
296-
else if (item is ToolkitSampleSliderOptionAttribute sliderAttribute)
296+
else if (item is ToolkitSampleNumericOptionAttribute numericAttribute)
297297
{
298-
yield return $@"new {typeof(ToolkitSampleSliderOptionMetadataViewModel).FullName}(name: ""{sliderAttribute.Name}"", initial: {sliderAttribute.Initial}, min: {sliderAttribute.Min}, max: {sliderAttribute.Max}, step: {sliderAttribute.Step}, title: ""{sliderAttribute.Title}"")";
298+
yield return $@"new {typeof(ToolkitSampleNumericOptionMetadataViewModel).FullName}(name: ""{numericAttribute.Name}"", initial: {numericAttribute.Initial}, min: {numericAttribute.Min}, max: {numericAttribute.Max}, step: {numericAttribute.Step}, showAsNumberBox: {numericAttribute.ShowAsNumberBox.ToString().ToLower()}, title: ""{numericAttribute.Title}"")";
299299
}
300300
else if (item is ToolkitSampleTextOptionAttribute textAttribute)
301301
{

CommunityToolkit.Labs.Core.SourceGenerators/ToolkitSampleOptionGenerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
4141
if (x.Item2.TryReconstructAs<ToolkitSampleMultiChoiceOptionAttribute>() is ToolkitSampleMultiChoiceOptionAttribute multiChoiceOptionAttribute)
4242
return (Attribute: (ToolkitSampleOptionBaseAttribute)multiChoiceOptionAttribute, ContainingClassSymbol: x.Item1, Type: typeof(ToolkitSampleMultiChoiceOptionMetadataViewModel));
4343

44-
if(x.Item2.TryReconstructAs<ToolkitSampleSliderOptionAttribute>() is ToolkitSampleSliderOptionAttribute sliderOptionAttribute)
45-
return (Attribute: (ToolkitSampleOptionBaseAttribute)sliderOptionAttribute, ContainingClassSymbol: x.Item1, Type: typeof(ToolkitSampleSliderOptionMetadataViewModel));
44+
if(x.Item2.TryReconstructAs<ToolkitSampleNumericOptionAttribute>() is ToolkitSampleNumericOptionAttribute numericOptionAttribute)
45+
return (Attribute: (ToolkitSampleOptionBaseAttribute)numericOptionAttribute, ContainingClassSymbol: x.Item1, Type: typeof(ToolkitSampleNumericOptionMetadataViewModel));
4646

4747
if (x.Item2.TryReconstructAs<ToolkitSampleTextOptionAttribute>() is ToolkitSampleTextOptionAttribute textOptionAttribute)
4848
return (Attribute: (ToolkitSampleOptionBaseAttribute)textOptionAttribute, ContainingClassSymbol: x.Item1, Type: typeof(ToolkitSampleTextOptionMetadataViewModel));

CommunityToolkit.Labs.Shared/Renderers/GeneratedSampleOptionTemplateSelector.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ internal class GeneratedSampleOptionTemplateSelector : DataTemplateSelector
1717

1818
public DataTemplate? SliderOptionTemplate { get; set; }
1919

20+
public DataTemplate? NumberBoxOptionTemplate { get; set; }
21+
2022
public DataTemplate? TextOptionTemplate { get; set; }
2123

2224
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
@@ -25,7 +27,8 @@ protected override DataTemplate SelectTemplateCore(object item, DependencyObject
2527
{
2628
ToolkitSampleBoolOptionMetadataViewModel => BoolOptionTemplate ?? base.SelectTemplateCore(item, container),
2729
ToolkitSampleMultiChoiceOptionMetadataViewModel => MultiChoiceOptionTemplate ?? base.SelectTemplateCore(item, container),
28-
ToolkitSampleSliderOptionMetadataViewModel => SliderOptionTemplate ?? base.SelectTemplateCore(item, container),
30+
ToolkitSampleNumericOptionMetadataViewModel { ShowAsNumberBox: true } => NumberBoxOptionTemplate ?? base.SelectTemplateCore(item, container),
31+
ToolkitSampleNumericOptionMetadataViewModel { ShowAsNumberBox: false } => SliderOptionTemplate ?? base.SelectTemplateCore(item, container),
2932
ToolkitSampleTextOptionMetadataViewModel => TextOptionTemplate ?? base.SelectTemplateCore(item, container),
3033
_ => base.SelectTemplateCore(item, container),
3134
};

CommunityToolkit.Labs.Shared/Renderers/GeneratedSampleOptionsRenderer.xaml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,24 @@
2929
</DataTemplate>
3030
</local:GeneratedSampleOptionTemplateSelector.MultiChoiceOptionTemplate>
3131
<local:GeneratedSampleOptionTemplateSelector.SliderOptionTemplate>
32-
<DataTemplate x:DataType="metadata:ToolkitSampleSliderOptionMetadataViewModel">
32+
<DataTemplate x:DataType="metadata:ToolkitSampleNumericOptionMetadataViewModel">
3333
<Slider Header="{x:Bind Title}"
3434
Maximum="{x:Bind Max, Mode=OneWay}"
3535
Minimum="{x:Bind Min, Mode=OneWay}"
3636
StepFrequency="{x:Bind Step, Mode=OneWay}"
3737
Value="{x:Bind Initial, Mode=TwoWay}" />
3838
</DataTemplate>
3939
</local:GeneratedSampleOptionTemplateSelector.SliderOptionTemplate>
40+
<local:GeneratedSampleOptionTemplateSelector.NumberBoxOptionTemplate>
41+
<DataTemplate x:DataType="metadata:ToolkitSampleNumericOptionMetadataViewModel">
42+
<muxc:NumberBox Header="{x:Bind Title}"
43+
Maximum="{x:Bind Max, Mode=OneWay}"
44+
Minimum="{x:Bind Min, Mode=OneWay}"
45+
SmallChange="{x:Bind Step, Mode=OneWay}"
46+
SpinButtonPlacementMode="Compact"
47+
Value="{x:Bind Initial, Mode=TwoWay}" />
48+
</DataTemplate>
49+
</local:GeneratedSampleOptionTemplateSelector.NumberBoxOptionTemplate>
4050
<local:GeneratedSampleOptionTemplateSelector.TextOptionTemplate>
4151
<DataTemplate x:DataType="metadata:ToolkitSampleTextOptionMetadataViewModel">
4252
<TextBox HorizontalAlignment="Stretch"

0 commit comments

Comments
 (0)