Browse Source

Merge commit 'eb2948d2ea779df9d1d97fd3756b955ccad71936'

pull/112/head
Steven Kirk 11 years ago
parent
commit
eb79a6b127
  1. 40
      src/Markup/Perspex.Markup.Xaml/Converters/BrushConverter.cs
  2. 41
      src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs
  3. 6
      src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/ObservablePropertyBranch.cs
  4. 21
      src/Perspex.Themes.Default/ButtonStyle.cs
  5. 10
      src/Perspex.Themes.Default/ContentControlStyle.cs

40
src/Markup/Perspex.Markup.Xaml/Converters/BrushConverter.cs

@ -8,6 +8,7 @@ namespace Perspex.Markup.Xaml.Converters
{
using System;
using System.Globalization;
using System.Reflection;
using System.Text;
using Media;
using Media.Imaging;
@ -32,10 +33,24 @@ namespace Perspex.Markup.Xaml.Converters
var color = DecodeColor(colorString);
return new SolidColorBrush(color);
if (color != null)
{
return new SolidColorBrush(color.Value);
}
else
{
var member = typeof(Brushes).GetTypeInfo().GetDeclaredProperty(colorString);
if (member != null)
{
return (Brush)member.GetValue(null);
}
}
throw new InvalidOperationException("Invalid color string.");
}
private static Color DecodeColor(string colorString)
private static Color? DecodeColor(string colorString)
{
if (colorString[0] == '#')
{
@ -49,6 +64,7 @@ namespace Perspex.Markup.Xaml.Converters
var b = Convert.ToByte(restOfValue.Substring(8, 2), 16);
return Color.FromArgb(a, r, g, b);
}
if (restOfValue.Length == 6)
{
var r = Convert.ToByte(restOfValue.Substring(0, 2), 16);
@ -59,26 +75,8 @@ namespace Perspex.Markup.Xaml.Converters
throw new InvalidOperationException("The color code format cannot be parsed");
}
else
{
return DecodeFromNamedColor(colorString);
}
throw new InvalidOperationException($"The color cannot be decoded from the string \"{colorString}\"");
}
private static Color DecodeFromNamedColor(string colorString)
{
if (colorString == "Crimson")
{
return DecodeColor("#DC143C");
}
if (colorString == "Coral")
{
return DecodeColor("#FF7F50");
}
throw new NotImplementedException();
return null;
}
public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType)

41
src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs

@ -27,35 +27,26 @@ namespace Perspex.Markup.Xaml.Converters
private static Thickness ConvertFromString(string s)
{
var parts = s.Split(',')
.Take(4)
.Select(part => part.Trim());
var parts = s.Split(',', ' ');
if (parts.Count() == 1)
switch (parts.Length)
{
var uniformLength = double.Parse(parts.First());
return new Thickness(uniformLength);
case 1:
var uniform = double.Parse(parts[0]);
return new Thickness(uniform);
case 2:
var horizontal = double.Parse(parts[0]);
var vertical = double.Parse(parts[1]);
return new Thickness(horizontal, vertical);
case 4:
var left = double.Parse(parts[0]);
var top = double.Parse(parts[1]);
var right = double.Parse(parts[2]);
var bottom = double.Parse(parts[3]);
return new Thickness(left, top, right, bottom);
}
double left = 0, top = 0, right = 0, bottom = 0;
IList<Action<double>> setValue = new List<Action<double>>
{
val => left = val,
val => top = val,
val => right = val,
val => bottom = val,
};
var i = 0;
foreach (var part in parts)
{
var v = double.Parse(part);
setValue[i](v);
i++;
}
return new Thickness(left, top, right, bottom);
throw new InvalidOperationException("Invalid Thickness.");
}
public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType)

6
src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/ObservablePropertyBranch.cs

@ -66,7 +66,11 @@ namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
var currentObjectTypeInfo = current.GetType().GetTypeInfo();
var nextProperty = currentObjectTypeInfo.GetDeclaredProperty(nextPropertyName);
var nextInstance = nextProperty.GetValue(current);
subscriptions.AddRange(this.GetSubscriptionsRecursive(nextInstance, propertyPath, i + 1));
if (i < this.propertyPath.Chunks.Length - 1)
{
subscriptions.AddRange(this.GetSubscriptionsRecursive(nextInstance, propertyPath, i + 1));
}
}
return subscriptions;

21
src/Perspex.Themes.Default/ButtonStyle.cs

@ -29,16 +29,6 @@ namespace Perspex.Themes.Default
this.AddRange(new[]
{
new Style(x => x.OfType<Button>())
{
Setters = new[]
{
new Setter(Button.FocusAdornerProperty, new FuncTemplate<IControl>(FocusAdornerTemplate)),
new Setter(Button.TemplateProperty, new ControlTemplate<Button>(Template)),
new Setter(Button.HorizontalContentAlignmentProperty, HorizontalAlignment.Center),
new Setter(Button.VerticalContentAlignmentProperty, VerticalAlignment.Center),
},
},
new Style(x => x.OfType<Button>().Template().Name("border"))
{
Setters = new[]
{
@ -46,6 +36,10 @@ namespace Perspex.Themes.Default
new Setter(Button.BorderBrushProperty, new SolidColorBrush(0xff707070)),
new Setter(Button.BorderThicknessProperty, 2),
new Setter(Button.ForegroundProperty, new SolidColorBrush(0xff000000)),
new Setter(Button.FocusAdornerProperty, new FuncTemplate<IControl>(FocusAdornerTemplate)),
new Setter(Button.TemplateProperty, new ControlTemplate<Button>(Template)),
new Setter(Button.HorizontalContentAlignmentProperty, HorizontalAlignment.Center),
new Setter(Button.VerticalContentAlignmentProperty, VerticalAlignment.Center),
},
},
new Style(x => x.OfType<Button>().Class(":pointerover").Template().Name("border"))
@ -70,11 +64,11 @@ namespace Perspex.Themes.Default
new Setter(Button.BorderBrushProperty, new SolidColorBrush(0xffff628b)),
},
},
new Style(x => x.OfType<Button>().Class(":disabled").Template().Name("border"))
new Style(x => x.OfType<Button>().Class(":disabled").Template().Name("contentPresenter"))
{
Setters = new[]
{
new Setter(Button.ForegroundProperty, new SolidColorBrush(0xff7f7f7f)),
new Setter(ContentPresenter.OpacityProperty, 0.5),
},
},
});
@ -110,10 +104,13 @@ namespace Perspex.Themes.Default
{
Name = "contentPresenter",
[~ContentPresenter.ContentProperty] = control[~Button.ContentProperty],
[~TextBlock.ForegroundProperty] = control[~Button.ForegroundProperty],
[~ContentPresenter.HorizontalAlignmentProperty] = control[~Button.HorizontalContentAlignmentProperty],
[~ContentPresenter.VerticalAlignmentProperty] = control[~Button.VerticalContentAlignmentProperty],
},
[~Border.BackgroundProperty] = control[~Button.BackgroundProperty],
[~Border.BorderBrushProperty] = control[~Button.BorderBrushProperty],
[~Border.BorderThicknessProperty] = control[~Button.BorderThicknessProperty],
};
return border;

10
src/Perspex.Themes.Default/ContentControlStyle.cs

@ -41,10 +41,14 @@ namespace Perspex.Themes.Default
/// <returns>The root of the instantiated template.</returns>
public static Control Template(ContentControl control)
{
return new ContentPresenter
return new Border
{
Name = "contentPresenter",
[~ContentPresenter.ContentProperty] = control[~ContentControl.ContentProperty],
[~Border.BackgroundProperty] = control[~ContentControl.BackgroundProperty],
Child = new ContentPresenter
{
Name = "contentPresenter",
[~ContentPresenter.ContentProperty] = control[~ContentControl.ContentProperty],
}
};
}
}

Loading…
Cancel
Save