Skip to content

Commit

Permalink
feat: add style key aliases
Browse files Browse the repository at this point in the history
  • Loading branch information
kazo0 committed Apr 21, 2022
1 parent eff0b84 commit b223c4e
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 36 deletions.
139 changes: 116 additions & 23 deletions src/library/Uno.Material/MaterialResourcesV2.cs
Expand Up @@ -15,46 +15,139 @@ namespace Uno.Material
/// </summary>
public sealed class MaterialResourcesV2 : ResourceDictionary
{
private const string StylePrefix = "M3Material";
private ResourceDictionary _implicitResources = new ResourceDictionary();

public MaterialResourcesV2()
{
Source = new Uri("ms-appx:///Uno.Material/Generated/mergedpages.v2.xaml");

MapStyleInfo();
}

public bool WithImplicitStyles { set => ExportImplicitStyles(value); }

private string[] GetImplicitStyles()
private void MapStyleInfo()
{
return new[] { "M3MaterialBodyMedium" };
}

private void ExportImplicitStyles(bool value)
{
if (!value) return; // we don't support teardown

var implicitResources = new ResourceDictionary();
foreach (var key in GetImplicitStyles())
var aliasedResources = new ResourceDictionary();
foreach (var (resKey, sharedKey, isDefaultStyle) in GetStyleInfos())
{
if (!this.TryGetValue(key, out var resource) || !(resource is Style style))
{
// uwp: If the {key} style is clearly defined in {info.Source}, but we can't find it here.
// And, that it only happens on uwp, and not other uno platforms.
// It means that the style references resources that are not directly included.
// This can usually be fixed by including `<MaterialColors xmlns="using:Uno.Material" />` in the MergedDictionaries of {info.Source}.
// note: Resources used on Style.Setters need to be directly defined/included, those used in Style.Template dont have to be.
throw new ArgumentException($"Missing resource: key={key}");
}
if (style.TargetType == null)
var style = GetStyle(resKey);

if (isDefaultStyle)
{
throw new InvalidOperationException($"Missing TargetType on style: key={key}");
_implicitResources.Add(style.TargetType, style);
}

implicitResources.Add(style.TargetType, style);
aliasedResources.Add(sharedKey, style);
}

// UWP don't allow for res-dict with Source set to contain resource directly:
// > Local values are not allowed in resource dictionary with Source set
// but, we can add them through merged-dict instead.
this.MergedDictionaries.Add(implicitResources);
this.MergedDictionaries.Add(aliasedResources);
}

private void ExportImplicitStyles(bool value)
{
if (!value) return; // we don't support teardown

this.MergedDictionaries.Add(_implicitResources);
}

private Style GetStyle(string key)
{
if (!this.TryGetValue(key, out var resource) || !(resource is Style style))
{
// uwp: If the {key} style is clearly defined, but we can't find it here.
// And, that it only happens on uwp, and not other uno platforms.
// It means that the style references resources that are not directly included.
// note: Resources used on Style.Setters need to be directly defined/included, those used in Style.Template dont have to be.
throw new ArgumentException($"Missing resource: key={key}");
}
if (style.TargetType == null)
{
throw new InvalidOperationException($"Missing TargetType on style: key={key}");
}

return style;
}

private IEnumerable<(string ResourceKey, string SharedKey, bool IsDefaultStyle)> GetStyleInfos()
{
var result = new List<(string ResourceKey, string SharedKey, bool IsDefaultStyle)>();

Add("M3MaterialCheckBoxStyle", isImplicit: true);
Add("M3MaterialAppBarButtonStyle");
Add("M3MaterialCommandBarStyle");
Add("M3MaterialRadioButtonStyle", isImplicit: true);
Add("M3MaterialDisplayLarge");
Add("M3MaterialDisplayMedium");
Add("M3MaterialDisplaySmall");
Add("M3MaterialHeadlineLarge");
Add("M3MaterialHeadlineMedium");
Add("M3MaterialHeadlineSmall");
Add("M3MaterialTitleLarge");
Add("M3MaterialTitleMedium");
Add("M3MaterialTitleSmall");
Add("M3MaterialLabelLarge");
Add("M3MaterialLabelMedium");
Add("M3MaterialLabelSmall");
Add("M3MaterialBodyLarge");
Add("M3MaterialBodyMedium", isImplicit: true);
Add("M3MaterialBodySmall");
Add("M3MaterialOutlinedTextBoxStyle");
Add("M3MaterialFilledTextBoxStyle", isImplicit: true);
Add("M3MaterialOutlinedPasswordBoxStyle");
Add("M3MaterialFilledPasswordBoxStyle", isImplicit: true);
Add("M3MaterialElevatedButtonStyle");
Add("M3MaterialFilledButtonStyle", isImplicit: true);
Add("M3MaterialFilledTonalButtonStyle");
Add("M3MaterialOutlinedButtonStyle");
Add("M3MaterialTextButtonStyle");
Add("M3MaterialIconButtonStyle");

// ** TODO **

//Add("M3MaterialIconToggleButtonStyle");
//Add("M3MaterialToggleButtonStyle");
//Add("M3MaterialMediumFabButtonStyle");
//Add("M3MaterialLargeFabButtonStyle");
//Add("M3MaterialElevatedInputChipStyle");
//Add("M3MaterialElevatedAssistChipStyle");
//Add("M3MaterialElevatedFilterChipStyle");
//Add("M3MaterialElevatedSuggestionChipStyle");
//Add("M3MaterialOutlinedInputChipStyle");
//Add("M3MaterialOutlinedAssistChipStyle");
//Add("M3MaterialOutlinedFilterChipStyle");
//Add("M3MaterialOutlinedSuggestionChipStyle");
//Add("M3MaterialElevatedInputChipGroupStyle");
//Add("M3MaterialElevatedAssistChipGroupStyle");
//Add("M3MaterialElevatedFilterChipGroupStyle");
//Add("M3MaterialElevatedSuggestionChipGroupStyle");
//Add("M3MaterialOutlinedInputChipGroupStyle");
//Add("M3MaterialOutlinedAssistChipGroupStyle");
//Add("M3MaterialOutlinedFilterChipGroupStyle");
//Add("M3MaterialOutlinedSuggestionChipGroupStyle");
//Add("M3MaterialSliderStyle");
//Add("M3MaterialToggleSwitchStyle");
//Add("M3MaterialElevatedCardContentControlStyle");
//Add("M3MaterialFilledCardContentControlStyle");
//Add("M3MaterialOutlinedCardContentControlStyle");
//Add("M3MaterialFlyoutPresenterStyle");
//Add("M3MaterialDatePickerStyle");
//Add("M3MaterialTimePickerStyle");
//Add("M3MaterialCalendarDatePickerStyle");
//Add("M3MaterialListViewStyle");
//Add("M3MaterialListViewItemStyle");
//Add("M3MaterialInfoBarStyle");
//Add("M3MaterialProgressRingStyle");
//Add("M3MaterialProgressBarStyle");

return result;

void Add(string key, string alias = null, bool isImplicit = false) =>
result.Add((key, alias ?? key.Substring(StylePrefix.Length), isImplicit));
}
}
}
Expand Up @@ -11,7 +11,7 @@
<x:Double x:Key="M3MaterialCommandBarElevation">4</x:Double>
<x:Double x:Key="M3MaterialCommandBarHeight">48</x:Double>

<Style x:Key="M3MaterialAppBarButton"
<Style x:Key="M3MaterialAppBarButtonStyle"
TargetType="AppBarButton">
<Setter Property="Height" Value="{StaticResource M3MaterialCommandBarHeight}" />
<Setter Property="Width" Value="{StaticResource M3MaterialCommandBarHeight}" />
Expand Down
20 changes: 10 additions & 10 deletions src/library/Uno.Material/Styles/Controls/v2/PasswordBox.xaml
Expand Up @@ -295,7 +295,7 @@
<VisualState.Setters>
<Setter Target="Root.BorderBrush"
Value="{StaticResource M3MaterialDisabledOutlinedTextBoxBorderBrush}" />
<Setter Target="ContentElement.Foreground"
<Setter Target="ContentElement.Foreground"
Value="{StaticResource OnSurfaceBrush}" />
<Setter Target="PlaceholderElement.Foreground"
Value="{StaticResource OnSurfaceBrush}" />
Expand Down Expand Up @@ -326,31 +326,31 @@

<VisualStateGroup x:Name="HeaderStates">

<VisualState x:Name="NotEmpty">
<Storyboard>
<DoubleAnimation EasingFunction="{StaticResource MaterialEaseInOutFunction}"
<VisualState x:Name="NotEmpty">
<Storyboard>
<DoubleAnimation EasingFunction="{StaticResource MaterialEaseInOutFunction}"
Storyboard.TargetName="Transform"
Storyboard.TargetProperty="TranslateY"
To="-11"
Duration="{StaticResource MaterialTextBoxAnimationDuration}" />
<DoubleAnimation EasingFunction="{StaticResource MaterialEaseInOutFunction}"
<DoubleAnimation EasingFunction="{StaticResource MaterialEaseInOutFunction}"
Storyboard.TargetName="ContentTransform"
Storyboard.TargetProperty="TranslateY"
To="5"
Duration="{StaticResource MaterialTextBoxAnimationDuration}" />
<DoubleAnimation EasingFunction="{StaticResource MaterialEaseInOutFunction}"
<DoubleAnimation EasingFunction="{StaticResource MaterialEaseInOutFunction}"
Storyboard.TargetName="Transform"
Storyboard.TargetProperty="ScaleX"
To="0.7"
Duration="{StaticResource MaterialTextBoxAnimationDuration}" />
<DoubleAnimation EasingFunction="{StaticResource MaterialEaseInOutFunction}"
<DoubleAnimation EasingFunction="{StaticResource MaterialEaseInOutFunction}"
Storyboard.TargetName="Transform"
Storyboard.TargetProperty="ScaleY"
To="0.7"
Duration="{StaticResource MaterialTextBoxAnimationDuration}" />
</Storyboard>
</Storyboard>

<VisualState.StateTriggers>
<VisualState.StateTriggers>
<StateTrigger IsActive="{Binding Password, Converter={StaticResource MaterialEmptyToFalse}, RelativeSource={RelativeSource TemplatedParent}}" />
</VisualState.StateTriggers>
</VisualState>
Expand Down Expand Up @@ -416,7 +416,7 @@
MinHeight="34"
VerticalAlignment="Stretch"
AutomationProperties.AccessibilityView="Raw"
Foreground="{TemplateBinding OnSurfaceVariantBrush}"
Foreground="{StaticResource OnSurfaceVariantBrush}"
IsTabStop="False"
Style="{StaticResource M3MaterialRevealButtonStyle}"
Visibility="Collapsed" />
Expand Down
Expand Up @@ -21,7 +21,7 @@
Style="{StaticResource M3MaterialCommandBarStyle}">
<toolkit:CommandBarExtensions.NavigationCommand>
<AppBarButton Click="NavigateBack"
Style="{StaticResource M3MaterialAppBarButton}">
Style="{StaticResource M3MaterialAppBarButtonStyle}">
<AppBarButton.Icon>
<BitmapIcon UriSource="ms-appx:///Assets/BackButton.png" />
</AppBarButton.Icon>
Expand Down
Expand Up @@ -20,7 +20,7 @@
Style="{StaticResource M3MaterialCommandBarStyle}">
<toolkit:CommandBarExtensions.NavigationCommand>
<AppBarButton Click="NavigateBack"
Style="{StaticResource M3MaterialAppBarButton}">
Style="{StaticResource M3MaterialAppBarButtonStyle}">
<AppBarButton.Icon>
<BitmapIcon UriSource="ms-appx:///Assets/BackButton.png" />
</AppBarButton.Icon>
Expand Down

0 comments on commit b223c4e

Please sign in to comment.