Merge with latests changes

This commit is contained in:
Javier Suárez Ruiz 2017-12-29 13:25:54 +01:00
commit 9d2db7f498
10 changed files with 298 additions and 25 deletions

View File

@ -0,0 +1,20 @@
using System;
using Xamarin.Forms;
namespace Ooui.Forms
{
public class LinkLabel : Xamarin.Forms.Label
{
public static readonly BindableProperty HRefProperty = BindableProperty.Create ("HRef", typeof (string),
typeof (LinkView), string.Empty, BindingMode.OneWay, null, null, null, null);
public string HRef {
get { return (string)base.GetValue (HRefProperty); }
set { base.SetValue (HRefProperty, value); }
}
public LinkLabel ()
{
}
}
}

View File

@ -0,0 +1,20 @@
using System;
using Xamarin.Forms;
namespace Ooui.Forms
{
public class LinkView : ContentView
{
public static readonly BindableProperty HRefProperty = BindableProperty.Create ("HRef", typeof (string),
typeof (LinkView), string.Empty, BindingMode.OneWay, null, null, null, null);
public string HRef {
get { return (string)base.GetValue (HRefProperty); }
set { base.SetValue (HRefProperty, value); }
}
public LinkView ()
{
}
}
}

View File

@ -13,9 +13,10 @@ using Xamarin.Forms;
[assembly: ExportRenderer (typeof (Frame), typeof (FrameRenderer))] [assembly: ExportRenderer (typeof (Frame), typeof (FrameRenderer))]
[assembly: ExportRenderer (typeof (Image), typeof (ImageRenderer))] [assembly: ExportRenderer (typeof (Image), typeof (ImageRenderer))]
[assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))] [assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))]
[assembly: ExportRenderer (typeof (LinkLabel), typeof (LinkLabelRenderer))]
[assembly: ExportRenderer (typeof (LinkView), typeof (LinkViewRenderer))]
[assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))] [assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))]
[assembly: ExportRenderer (typeof (SearchBar), typeof (SearchBarRenderer))] [assembly: ExportRenderer (typeof (SearchBar), typeof (SearchBarRenderer))]
[assembly: ExportRenderer(typeof(Slider), typeof(SliderRenderer))]
[assembly: ExportRenderer (typeof (Switch), typeof (SwitchRenderer))] [assembly: ExportRenderer (typeof (Switch), typeof (SwitchRenderer))]
[assembly: ExportRenderer (typeof (TimePicker), typeof (TimePickerRenderer))] [assembly: ExportRenderer (typeof (TimePicker), typeof (TimePickerRenderer))]
[assembly: ExportImageSourceHandler (typeof (FileImageSource), typeof (FileImageSourceHandler))] [assembly: ExportImageSourceHandler (typeof (FileImageSource), typeof (FileImageSourceHandler))]

View File

@ -24,6 +24,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Extensions\" /> <Folder Include="Extensions\" />
<Folder Include="Controls\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Ooui\Ooui.csproj" /> <ProjectReference Include="..\Ooui\Ooui.csproj" />

View File

@ -0,0 +1,165 @@
using System;
using System.ComponentModel;
using Ooui.Forms.Extensions;
using Xamarin.Forms;
namespace Ooui.Forms.Renderers
{
public class LinkLabelRenderer : ViewRenderer<LinkLabel, Anchor>
{
SizeRequest _perfectSize;
bool _perfectSizeValid;
public override SizeRequest GetDesiredSize (double widthConstraint, double heightConstraint)
{
if (!_perfectSizeValid) {
var size = Element.Text.MeasureSize (Element.FontFamily, Element.FontSize, Element.FontAttributes);
size.Width = Math.Ceiling (size.Width);
size.Height = Math.Ceiling (size.Height * 1.4);
_perfectSize = new SizeRequest (size, size);
_perfectSizeValid = true;
}
var widthFits = widthConstraint >= _perfectSize.Request.Width;
var heightFits = heightConstraint >= _perfectSize.Request.Height;
if (widthFits && heightFits)
return _perfectSize;
var result = base.GetDesiredSize (widthConstraint, heightConstraint);
var tinyWidth = Math.Min (10, result.Request.Width);
result.Minimum = new Size (tinyWidth, result.Request.Height);
if (widthFits || Element.LineBreakMode == LineBreakMode.NoWrap)
return result;
bool containerIsNotInfinitelyWide = !double.IsInfinity (widthConstraint);
if (containerIsNotInfinitelyWide) {
bool textCouldHaveWrapped = Element.LineBreakMode == LineBreakMode.WordWrap || Element.LineBreakMode == LineBreakMode.CharacterWrap;
bool textExceedsContainer = result.Request.Width > widthConstraint;
if (textExceedsContainer || textCouldHaveWrapped) {
var expandedWidth = Math.Max (tinyWidth, widthConstraint);
result.Request = new Size (expandedWidth, result.Request.Height);
}
}
return result;
}
protected override void OnElementChanged (ElementChangedEventArgs<Ooui.Forms.LinkLabel> e)
{
if (e.NewElement != null) {
if (Control == null) {
SetNativeControl (new Anchor ());
}
UpdateHRef ();
UpdateText ();
UpdateTextColor ();
UpdateFont ();
UpdateLineBreakMode ();
UpdateAlignment ();
}
base.OnElementChanged (e);
}
protected override void OnElementPropertyChanged (object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged (sender, e);
if (Control == null)
return;
if (e.PropertyName == Ooui.Forms.LinkLabel.HRefProperty.PropertyName)
UpdateHRef ();
else if (e.PropertyName == Xamarin.Forms.Label.HorizontalTextAlignmentProperty.PropertyName)
UpdateAlignment ();
else if (e.PropertyName == Xamarin.Forms.Label.VerticalTextAlignmentProperty.PropertyName)
UpdateAlignment ();
else if (e.PropertyName == Xamarin.Forms.Label.TextColorProperty.PropertyName)
UpdateTextColor ();
else if (e.PropertyName == Xamarin.Forms.Label.FontProperty.PropertyName)
UpdateFont ();
else if (e.PropertyName == Xamarin.Forms.Label.TextProperty.PropertyName)
UpdateText ();
else if (e.PropertyName == Xamarin.Forms.Label.FormattedTextProperty.PropertyName)
UpdateText ();
else if (e.PropertyName == Xamarin.Forms.Label.LineBreakModeProperty.PropertyName)
UpdateLineBreakMode ();
}
protected override void SetBackgroundColor (Xamarin.Forms.Color color)
{
if (color == Xamarin.Forms.Color.Default)
Style.BackgroundColor = Colors.Clear;
else
Style.BackgroundColor = color.ToOouiColor ();
}
void UpdateHRef ()
{
Control.HRef = Element.HRef;
}
void UpdateAlignment ()
{
this.Style.Display = "table";
Control.Style.Display = "table-cell";
this.Style.TextAlign = Element.HorizontalTextAlignment.ToOouiTextAlign ();
Control.Style.VerticalAlign = Element.VerticalTextAlignment.ToOouiVerticalAlign ();
}
void UpdateLineBreakMode ()
{
_perfectSizeValid = false;
}
bool isTextFormatted;
void UpdateText ()
{
_perfectSizeValid = false;
var values = Element.GetValues (Xamarin.Forms.Label.FormattedTextProperty, Xamarin.Forms.Label.TextProperty, Xamarin.Forms.Label.TextColorProperty);
var formatted = values[0] as FormattedString;
if (formatted != null) {
Control.Text = (string)values[1];
isTextFormatted = true;
}
else {
Control.Text = (string)values[1];
isTextFormatted = false;
}
}
void UpdateFont ()
{
if (isTextFormatted)
return;
_perfectSizeValid = false;
Element.SetStyleFont (Element.FontFamily, Element.FontSize, Element.FontAttributes, Control.Style);
}
void UpdateTextColor ()
{
if (isTextFormatted)
return;
_perfectSizeValid = false;
var textColor = Element.TextColor;
if (textColor.IsDefault) {
Control.Style.Color = null;
}
else {
Control.Style.Color = textColor.ToOouiColor (Xamarin.Forms.Color.Black);
}
}
}
}

View File

@ -0,0 +1,36 @@
using System;
using System.ComponentModel;
namespace Ooui.Forms.Renderers
{
public class LinkViewRenderer : ViewRenderer<LinkView, Ooui.Anchor>
{
public LinkViewRenderer ()
: base ("a")
{
}
protected override void OnElementChanged (ElementChangedEventArgs<LinkView> e)
{
base.OnElementChanged (e);
UpdateHRef ();
}
protected override void OnElementPropertyChanged (object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged (sender, e);
if (Control == null)
return;
if (e.PropertyName == Ooui.Forms.LinkLabel.HRefProperty.PropertyName)
UpdateHRef ();
}
void UpdateHRef ()
{
this.SetAttribute ("href", Element.HRef);
}
}
}

View File

@ -21,6 +21,11 @@ namespace Ooui.Forms.Renderers
/// </summary> /// </summary>
protected virtual bool ManageNativeControlLifetime => true; protected virtual bool ManageNativeControlLifetime => true;
public ViewRenderer (string tagName = "div")
: base (tagName)
{
}
protected override void Dispose (bool disposing) protected override void Dispose (bool disposing)
{ {
base.Dispose (disposing); base.Dispose (disposing);

View File

@ -62,7 +62,7 @@ namespace Ooui.Forms
} }
} }
public VisualElementRenderer () : base ("div") public VisualElementRenderer (string tagName = "div") : base (tagName)
{ {
_propertyChangedHandler = OnElementPropertyChanged; _propertyChangedHandler = OnElementPropertyChanged;
} }

18
Ooui/Anchor.cs Normal file
View File

@ -0,0 +1,18 @@
using System;
namespace Ooui
{
public class Anchor : Element
{
string href = "";
public string HRef {
get => href;
set => SetProperty (ref href, value ?? "", "href");
}
public Anchor ()
: base ("a")
{
}
}
}

View File

@ -1,11 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:ooui="clr-namespace:Ooui.Forms;assembly=Ooui.Forms"
x:Class="Samples.DisplayAlertPage"> x:Class="Samples.DisplayAlertPage">
<ContentPage.Content> <ContentPage.Content>
<StackLayout> <StackLayout>
<Label Text="Welcome to DisplayAlert Sample!" FontSize="32" FontAttributes="Bold" Margin="10,10,10,50" <Label Text="Welcome to DisplayAlert Sample!" FontSize="32" FontAttributes="Bold" Margin="10,10,10,50"
HorizontalOptions="Center" /> HorizontalOptions="Center" />
<ooui:LinkLabel Text="Link to Xamarin.Forms docs"
HRef="https://developer.xamarin.com/guides/xamarin-forms/" />
<ooui:LinkView
HRef="https://developer.xamarin.com/guides/xamarin-forms/">
<BoxView Color="Gray" HeightRequest="16" />
</ooui:LinkView>
<ActivityIndicator x:Name="activity" /> <ActivityIndicator x:Name="activity" />
<ProgressBar x:Name="progress" /> <ProgressBar x:Name="progress" />
<DatePicker x:Name="datePicker" /> <DatePicker x:Name="datePicker" />