Ooui-tws-port/Ooui.Forms/Cells/ImageCellElement.cs

86 lines
2.9 KiB
C#

using System;
using System.ComponentModel;
using System.Threading.Tasks;
using Ooui.Forms.Extensions;
using Ooui.Forms.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Internals;
namespace Ooui.Forms.Cells
{
public class ImageCellElement : CellElement
{
public Image ImageView { get; } = new Image ();
public Label TextLabel { get; } = new Label ();
public Label DetailTextLabel { get; } = new Label ();
public ImageCellElement ()
{
AppendChild (ImageView);
AppendChild (TextLabel);
AppendChild (DetailTextLabel);
}
protected override void BindCell ()
{
Cell.PropertyChanged += Cell_PropertyChanged;
if (Cell is ImageCell cell) {
TextLabel.Text = cell.Text ?? string.Empty;
DetailTextLabel.Text = cell.Detail ?? string.Empty;
TextLabel.Style.Color = cell.TextColor.ToOouiColor (OouiTheme.TextColor);
DetailTextLabel.Style.Color = cell.DetailColor.ToOouiColor (OouiTheme.SecondaryTextColor);
}
base.BindCell ();
}
protected override void UnbindCell ()
{
Cell.PropertyChanged -= Cell_PropertyChanged;
base.UnbindCell ();
}
async void Cell_PropertyChanged (object sender, PropertyChangedEventArgs args)
{
if (!(Cell is ImageCell cell))
return;
if (args.PropertyName == TextCell.TextProperty.PropertyName)
TextLabel.Text = cell.Text ?? string.Empty;
else if (args.PropertyName == TextCell.DetailProperty.PropertyName)
DetailTextLabel.Text = cell.Detail ?? string.Empty;
else if (args.PropertyName == TextCell.TextColorProperty.PropertyName)
TextLabel.Style.Color = cell.TextColor.ToOouiColor (OouiTheme.TextColor);
else if (args.PropertyName == TextCell.DetailColorProperty.PropertyName)
DetailTextLabel.Style.Color = cell.DetailColor.ToOouiColor (OouiTheme.SecondaryTextColor);
else if (args.PropertyName == ImageCell.ImageSourceProperty.PropertyName)
await SetImage (cell.ImageSource).ConfigureAwait (false);
}
async Task SetImage (ImageSource source)
{
ImageView.Source = null;
IImageSourceHandler handler;
if (source != null && (handler = Registrar.Registered.GetHandlerForObject<Renderers.IImageSourceHandler> (source)) != null) {
string image;
try {
image = await handler.LoadImageAsync (source).ConfigureAwait (false);
}
catch (TaskCanceledException) {
image = null;
}
ImageView.Source = image;
}
else {
ImageView.Source = null;
}
}
}
}