Make an Element for each cell type
This commit is contained in:
parent
010982b08a
commit
4f9f46ce38
|
@ -0,0 +1,44 @@
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Ooui.Forms.Cells
|
||||||
|
{
|
||||||
|
public class CellElement : Div, INativeElementView
|
||||||
|
{
|
||||||
|
Cell cell;
|
||||||
|
|
||||||
|
public Cell Cell {
|
||||||
|
get => cell;
|
||||||
|
set {
|
||||||
|
if (cell == value)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (cell != null)
|
||||||
|
UnbindCell ();
|
||||||
|
|
||||||
|
cell = value;
|
||||||
|
|
||||||
|
if (cell != null)
|
||||||
|
BindCell ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Xamarin.Forms.Element Element => Cell;
|
||||||
|
|
||||||
|
public CellElement ()
|
||||||
|
{
|
||||||
|
Style.Width = "100%";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void UnbindCell ()
|
||||||
|
{
|
||||||
|
Device.BeginInvokeOnMainThread (Cell.SendDisappearing);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void BindCell ()
|
||||||
|
{
|
||||||
|
Device.BeginInvokeOnMainThread (cell.SendAppearing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,61 +6,59 @@ namespace Ooui.Forms.Cells
|
||||||
{
|
{
|
||||||
public class CellRenderer : IRegisterable
|
public class CellRenderer : IRegisterable
|
||||||
{
|
{
|
||||||
private EventHandler _onForceUpdateSizeRequested;
|
EventHandler _onForceUpdateSizeRequested;
|
||||||
|
|
||||||
static readonly BindableProperty RealCellProperty =
|
static readonly BindableProperty RealCellProperty =
|
||||||
BindableProperty.CreateAttached("RealCell", typeof(Div),
|
BindableProperty.CreateAttached ("RealCell", typeof (CellElement), typeof (Cell), null);
|
||||||
typeof(Cell), null);
|
|
||||||
|
|
||||||
public virtual CellView GetCell(Cell item, CellView reusableView, List listView)
|
public virtual CellElement GetCellElement (Cell cell, CellElement reusableElement, List listView)
|
||||||
{
|
{
|
||||||
var nativeCell = reusableView ?? GetCellInstance (item);
|
var cellElement = reusableElement ?? CreateCellElement (cell);
|
||||||
|
|
||||||
nativeCell.Cell = item;
|
cellElement.Cell = cell;
|
||||||
|
|
||||||
WireUpForceUpdateSizeRequested(item, nativeCell);
|
WireUpForceUpdateSizeRequested (cell, cellElement);
|
||||||
UpdateBackground(nativeCell, item);
|
UpdateBackground (cellElement, cell);
|
||||||
|
|
||||||
return nativeCell;
|
return cellElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static CellView GetRealCell(BindableObject cell)
|
protected static CellElement GetRealCell (BindableObject cell)
|
||||||
{
|
{
|
||||||
return (CellView)cell.GetValue(RealCellProperty);
|
return (CellElement)cell.GetValue (RealCellProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void SetRealCell(BindableObject cell, CellView renderer)
|
protected static void SetRealCell (BindableObject cell, CellElement renderer)
|
||||||
{
|
{
|
||||||
cell.SetValue(RealCellProperty, renderer);
|
cell.SetValue (RealCellProperty, renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual CellView GetCellInstance(Cell item)
|
protected virtual CellElement CreateCellElement (Cell cell)
|
||||||
{
|
{
|
||||||
return new CellView();
|
return new CellElement ();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void OnForceUpdateSizeRequest(Cell cell, CellView nativeCell)
|
protected virtual void OnForceUpdateSizeRequest (Cell cell, CellElement cellElement)
|
||||||
{
|
{
|
||||||
nativeCell.Style.Height = (int)cell.RenderHeight;
|
cellElement.Style.Height = (int)cell.RenderHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void UpdateBackground(CellView tableViewCell, Cell cell)
|
protected void UpdateBackground (CellElement cellElement, Cell cell)
|
||||||
{
|
{
|
||||||
var backgroundColor = Xamarin.Forms.Color.Default;
|
var backgroundColor = Xamarin.Forms.Color.Default;
|
||||||
|
|
||||||
if (backgroundColor == Xamarin.Forms.Color.Default && cell.RealParent is VisualElement element)
|
if (backgroundColor == Xamarin.Forms.Color.Default && cell.RealParent is VisualElement element)
|
||||||
backgroundColor = element.BackgroundColor;
|
backgroundColor = element.BackgroundColor;
|
||||||
|
|
||||||
tableViewCell.Style.BackgroundColor = backgroundColor.ToOouiColor (Xamarin.Forms.Color.White);
|
cellElement.Style.BackgroundColor = backgroundColor.ToOouiColor (Xamarin.Forms.Color.White);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void WireUpForceUpdateSizeRequested(Cell cell, CellView nativeCell)
|
protected void WireUpForceUpdateSizeRequested (Cell cell, CellElement cellElement)
|
||||||
{
|
{
|
||||||
cell.ForceUpdateSizeRequested -= _onForceUpdateSizeRequested;
|
cell.ForceUpdateSizeRequested -= _onForceUpdateSizeRequested;
|
||||||
|
|
||||||
_onForceUpdateSizeRequested = (sender, e) =>
|
_onForceUpdateSizeRequested = (sender, e) => {
|
||||||
{
|
OnForceUpdateSizeRequest (cell, cellElement);
|
||||||
OnForceUpdateSizeRequest(cell, nativeCell);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
cell.ForceUpdateSizeRequested += _onForceUpdateSizeRequested;
|
cell.ForceUpdateSizeRequested += _onForceUpdateSizeRequested;
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using Xamarin.Forms;
|
|
||||||
|
|
||||||
namespace Ooui.Forms.Cells
|
|
||||||
{
|
|
||||||
public class CellView : Div, INativeElementView
|
|
||||||
{
|
|
||||||
private Cell _cell;
|
|
||||||
|
|
||||||
public Action<object, PropertyChangedEventArgs> ForwardPropertyChanged;
|
|
||||||
|
|
||||||
public CellView()
|
|
||||||
{
|
|
||||||
CreateUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Cell Cell
|
|
||||||
{
|
|
||||||
get { return _cell; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_cell == value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (_cell != null)
|
|
||||||
Device.BeginInvokeOnMainThread(_cell.SendDisappearing);
|
|
||||||
|
|
||||||
_cell = value;
|
|
||||||
|
|
||||||
if (_cell != null)
|
|
||||||
Device.BeginInvokeOnMainThread(_cell.SendAppearing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Div FirstCol { get; private set; }
|
|
||||||
|
|
||||||
public Div SecondCol { get; private set; }
|
|
||||||
|
|
||||||
public Div ThirdCol { get; private set; }
|
|
||||||
|
|
||||||
public Label TextLabel { get; private set; }
|
|
||||||
|
|
||||||
public Label DetailTextLabel { get; private set; }
|
|
||||||
|
|
||||||
public Image ImageView { get; private set; }
|
|
||||||
|
|
||||||
public Div CustomView { get; private set; }
|
|
||||||
|
|
||||||
public virtual Xamarin.Forms.Element Element => Cell;
|
|
||||||
|
|
||||||
public void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
|
|
||||||
{
|
|
||||||
ForwardPropertyChanged?.Invoke(this, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CreateUI()
|
|
||||||
{
|
|
||||||
Style.Width = "100%";
|
|
||||||
Style.Display = "flex";
|
|
||||||
|
|
||||||
FirstCol = new Div();
|
|
||||||
AppendChild(FirstCol);
|
|
||||||
|
|
||||||
SecondCol = new Div();
|
|
||||||
AppendChild(SecondCol);
|
|
||||||
|
|
||||||
ThirdCol = new Div();
|
|
||||||
AppendChild(ThirdCol);
|
|
||||||
|
|
||||||
ImageView = new Image();
|
|
||||||
FirstCol.AppendChild(ImageView);
|
|
||||||
|
|
||||||
TextLabel = new Label();
|
|
||||||
SecondCol.AppendChild(TextLabel);
|
|
||||||
|
|
||||||
DetailTextLabel = new Label();
|
|
||||||
SecondCol.AppendChild(DetailTextLabel);
|
|
||||||
|
|
||||||
CustomView = new Div();
|
|
||||||
ThirdCol.AppendChild(CustomView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using Ooui.Forms.Extensions;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Ooui.Forms.Cells
|
||||||
|
{
|
||||||
|
public class EntryCellElement : CellElement
|
||||||
|
{
|
||||||
|
public Label TextLabel { get; } = new Label ();
|
||||||
|
public TextInput TextInput { get; } = new TextInput ();
|
||||||
|
|
||||||
|
public EntryCellElement ()
|
||||||
|
{
|
||||||
|
AppendChild (TextLabel);
|
||||||
|
AppendChild (TextInput);
|
||||||
|
|
||||||
|
TextInput.Change += TextInput_Change;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void BindCell ()
|
||||||
|
{
|
||||||
|
Cell.PropertyChanged += Cell_PropertyChanged;
|
||||||
|
|
||||||
|
if (Cell is EntryCell cell) {
|
||||||
|
UpdateLabel (cell);
|
||||||
|
UpdateText (cell);
|
||||||
|
UpdatePlaceholder (cell);
|
||||||
|
UpdateLabelColor (cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
base.BindCell ();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UnbindCell ()
|
||||||
|
{
|
||||||
|
Cell.PropertyChanged -= Cell_PropertyChanged;
|
||||||
|
base.UnbindCell ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell_PropertyChanged (object sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
var entryCell = (EntryCell)sender;
|
||||||
|
|
||||||
|
if (e.PropertyName == EntryCell.LabelProperty.PropertyName)
|
||||||
|
UpdateLabel (entryCell);
|
||||||
|
else if (e.PropertyName == EntryCell.TextProperty.PropertyName)
|
||||||
|
UpdateText (entryCell);
|
||||||
|
else if (e.PropertyName == EntryCell.PlaceholderProperty.PropertyName)
|
||||||
|
UpdatePlaceholder (entryCell);
|
||||||
|
else if (e.PropertyName == EntryCell.LabelColorProperty.PropertyName)
|
||||||
|
UpdateLabelColor (entryCell);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateLabel (EntryCell entryCell)
|
||||||
|
{
|
||||||
|
TextLabel.Text = entryCell.Label ?? string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateLabelColor (EntryCell entryCell)
|
||||||
|
{
|
||||||
|
TextLabel.Style.Color = entryCell.LabelColor.ToOouiColor (OouiTheme.TextColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdatePlaceholder (EntryCell entryCell)
|
||||||
|
{
|
||||||
|
TextInput.Placeholder = entryCell.Placeholder ?? string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateText (EntryCell entryCell)
|
||||||
|
{
|
||||||
|
TextInput.Value = entryCell.Text ?? string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextInput_Change (object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (Cell is EntryCell cell)
|
||||||
|
cell.Text = TextInput.Text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,104 +1,13 @@
|
||||||
using Ooui.Forms.Extensions;
|
using System;
|
||||||
using System;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
|
|
||||||
namespace Ooui.Forms.Cells
|
namespace Ooui.Forms.Cells
|
||||||
{
|
{
|
||||||
public class EntryCellRenderer : CellRenderer
|
public class EntryCellRenderer : TextCellRenderer
|
||||||
{
|
{
|
||||||
private static Cell _cell;
|
protected override CellElement CreateCellElement (Cell item)
|
||||||
|
|
||||||
public override CellView GetCell(Cell item, CellView reusableView, List listView)
|
|
||||||
{
|
{
|
||||||
TextInput nativeEntry = null;
|
return new EntryCellElement ();
|
||||||
|
|
||||||
var nativeEntryCell = base.GetCell(item, reusableView, listView);
|
|
||||||
|
|
||||||
if (nativeEntryCell == null)
|
|
||||||
nativeEntryCell = new CellView();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nativeEntryCell.Cell.PropertyChanged -= OnCellPropertyChanged;
|
|
||||||
|
|
||||||
nativeEntry = nativeEntryCell.CustomView.FirstChild as TextInput;
|
|
||||||
if (nativeEntry != null)
|
|
||||||
{
|
|
||||||
nativeEntryCell.CustomView.RemoveChild(nativeEntry);
|
|
||||||
nativeEntry.Change -= OnTextChanged;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SetRealCell(item, nativeEntryCell);
|
|
||||||
|
|
||||||
if (nativeEntry == null)
|
|
||||||
nativeEntryCell.CustomView.AppendChild(nativeEntry = new TextInput());
|
|
||||||
|
|
||||||
var entryCell = (EntryCell)item;
|
|
||||||
|
|
||||||
nativeEntryCell.Cell = item;
|
|
||||||
nativeEntryCell.SecondCol.Style.Width = "25%";
|
|
||||||
_cell = nativeEntryCell.Cell;
|
|
||||||
|
|
||||||
nativeEntryCell.Cell.PropertyChanged += OnCellPropertyChanged;
|
|
||||||
nativeEntry.Change += OnTextChanged;
|
|
||||||
|
|
||||||
WireUpForceUpdateSizeRequested(item, nativeEntryCell);
|
|
||||||
|
|
||||||
UpdateBackground(nativeEntryCell, entryCell);
|
|
||||||
UpdateLabel(nativeEntryCell, entryCell);
|
|
||||||
UpdateText(nativeEntryCell, entryCell);
|
|
||||||
UpdatePlaceholder(nativeEntryCell, entryCell);
|
|
||||||
UpdateLabelColor(nativeEntryCell, entryCell);
|
|
||||||
|
|
||||||
return nativeEntryCell;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void OnCellPropertyChanged(object sender, PropertyChangedEventArgs e)
|
|
||||||
{
|
|
||||||
var entryCell = (EntryCell)sender;
|
|
||||||
var realCell = (CellView)GetRealCell(entryCell);
|
|
||||||
|
|
||||||
if (e.PropertyName == EntryCell.LabelProperty.PropertyName)
|
|
||||||
UpdateLabel(realCell, entryCell);
|
|
||||||
else if (e.PropertyName == EntryCell.TextProperty.PropertyName)
|
|
||||||
UpdateText(realCell, entryCell);
|
|
||||||
else if (e.PropertyName == EntryCell.PlaceholderProperty.PropertyName)
|
|
||||||
UpdatePlaceholder(realCell, entryCell);
|
|
||||||
else if (e.PropertyName == EntryCell.LabelColorProperty.PropertyName)
|
|
||||||
UpdateLabelColor(realCell, entryCell);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void UpdateLabel(CellView cell, EntryCell entryCell)
|
|
||||||
{
|
|
||||||
cell.TextLabel.Text = entryCell.Label ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void UpdateLabelColor(CellView cell, EntryCell entryCell)
|
|
||||||
{
|
|
||||||
cell.TextLabel.Style.Color = entryCell.LabelColor.ToOouiColor(OouiTheme.TextColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void UpdatePlaceholder(CellView cell, EntryCell entryCell)
|
|
||||||
{
|
|
||||||
if (cell.CustomView.FirstChild is TextInput textInput)
|
|
||||||
textInput.Placeholder = entryCell.Placeholder ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void UpdateText(CellView cell, EntryCell entryCell)
|
|
||||||
{
|
|
||||||
if (cell.CustomView.FirstChild is TextInput textInput)
|
|
||||||
textInput.Text = entryCell.Text ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void OnTextChanged(object sender, EventArgs eventArgs)
|
|
||||||
{
|
|
||||||
var textInput = (TextInput)sender;
|
|
||||||
|
|
||||||
CellView realCell = GetRealCell(_cell);
|
|
||||||
|
|
||||||
if (realCell != null)
|
|
||||||
((EntryCell)realCell.Cell).Text = textInput.Text;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,59 +8,9 @@ namespace Ooui.Forms.Cells
|
||||||
{
|
{
|
||||||
public class ImageCellRenderer : TextCellRenderer
|
public class ImageCellRenderer : TextCellRenderer
|
||||||
{
|
{
|
||||||
public override CellView GetCell(Cell item, CellView reusableView, List listView)
|
protected override CellElement CreateCellElement (Cell cell)
|
||||||
{
|
{
|
||||||
var nativeImageCell = reusableView as CellView ?? new CellView();
|
return new ImageCellElement ();
|
||||||
|
|
||||||
var result = (CellView)base.GetCell(item, nativeImageCell, listView);
|
|
||||||
|
|
||||||
var imageCell = (ImageCell)item;
|
|
||||||
|
|
||||||
WireUpForceUpdateSizeRequested(item, result);
|
|
||||||
|
|
||||||
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
|
|
||||||
SetImage(imageCell, result);
|
|
||||||
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async void HandlePropertyChanged(object sender, PropertyChangedEventArgs args)
|
|
||||||
{
|
|
||||||
var tvc = (CellView)sender;
|
|
||||||
var imageCell = (ImageCell)tvc.Cell;
|
|
||||||
|
|
||||||
base.HandlePropertyChanged(sender, args);
|
|
||||||
|
|
||||||
if (args.PropertyName == ImageCell.ImageSourceProperty.PropertyName)
|
|
||||||
await SetImage(imageCell, tvc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static async Task SetImage(ImageCell cell, CellView target)
|
|
||||||
{
|
|
||||||
var source = cell.ImageSource;
|
|
||||||
|
|
||||||
target.ImageView.Source = null;
|
|
||||||
|
|
||||||
IImageSourceHandler handler;
|
|
||||||
|
|
||||||
if (source != null && (handler =
|
|
||||||
Registrar.Registered.GetHandler<Renderers.IImageSourceHandler>(source.GetType())) != null)
|
|
||||||
{
|
|
||||||
string image;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
image = await handler.LoadImageAsync(source).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (TaskCanceledException)
|
|
||||||
{
|
|
||||||
image = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
target.ImageView.Source = image;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
target.ImageView.Source = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using Ooui.Forms.Extensions;
|
||||||
|
using Ooui.Forms.Renderers;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Ooui.Forms.Cells
|
||||||
|
{
|
||||||
|
public class SwitchCellElement : CellElement
|
||||||
|
{
|
||||||
|
public Label TextLabel { get; } = new Label ();
|
||||||
|
public SwitchRenderer.SwitchElement Switch { get; } = new SwitchRenderer.SwitchElement ();
|
||||||
|
|
||||||
|
public SwitchCellElement ()
|
||||||
|
{
|
||||||
|
AppendChild (TextLabel);
|
||||||
|
AppendChild (Switch);
|
||||||
|
|
||||||
|
Switch.Style.Display = "inline-block";
|
||||||
|
|
||||||
|
Switch.Change += Switch_Change;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void BindCell ()
|
||||||
|
{
|
||||||
|
Cell.PropertyChanged += Cell_PropertyChanged;
|
||||||
|
|
||||||
|
if (Cell is SwitchCell cell) {
|
||||||
|
UpdateText (cell);
|
||||||
|
UpdateOn (cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
base.BindCell ();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UnbindCell ()
|
||||||
|
{
|
||||||
|
Cell.PropertyChanged -= Cell_PropertyChanged;
|
||||||
|
|
||||||
|
base.UnbindCell ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell_PropertyChanged (object sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
var cell = (SwitchCell)sender;
|
||||||
|
|
||||||
|
if (e.PropertyName == SwitchCell.TextProperty.PropertyName)
|
||||||
|
UpdateText (cell);
|
||||||
|
else if (e.PropertyName == SwitchCell.OnProperty.PropertyName)
|
||||||
|
UpdateOn (cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateText (SwitchCell cell)
|
||||||
|
{
|
||||||
|
TextLabel.Text = cell.Text ?? string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateOn (SwitchCell cell)
|
||||||
|
{
|
||||||
|
Switch.IsChecked = cell.On;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Switch_Change (object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (Cell is SwitchCell cell)
|
||||||
|
cell.On = Switch.IsChecked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,79 +1,13 @@
|
||||||
using System;
|
using System;
|
||||||
using System.ComponentModel;
|
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
|
|
||||||
namespace Ooui.Forms.Cells
|
namespace Ooui.Forms.Cells
|
||||||
{
|
{
|
||||||
public class SwitchCellRenderer : CellRenderer
|
public class SwitchCellRenderer : CellRenderer
|
||||||
{
|
{
|
||||||
private static Cell _cell;
|
protected override CellElement CreateCellElement (Cell cell)
|
||||||
|
|
||||||
public override CellView GetCell(Cell item, CellView reusableView, List listView)
|
|
||||||
{
|
{
|
||||||
var nativeSwitchCell = reusableView as CellView;
|
return new SwitchCellElement ();
|
||||||
Input oouiSwitch = null;
|
|
||||||
|
|
||||||
if (nativeSwitchCell == null)
|
|
||||||
nativeSwitchCell = new CellView();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
oouiSwitch = nativeSwitchCell.CustomView.FirstChild as Input;
|
|
||||||
|
|
||||||
if (oouiSwitch != null)
|
|
||||||
{
|
|
||||||
nativeSwitchCell.CustomView.RemoveChild(oouiSwitch);
|
|
||||||
oouiSwitch.Click -= OnSwitchClick;
|
|
||||||
}
|
|
||||||
nativeSwitchCell.Cell.PropertyChanged -= OnCellPropertyChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetRealCell(item, nativeSwitchCell);
|
|
||||||
|
|
||||||
if (oouiSwitch == null)
|
|
||||||
{
|
|
||||||
oouiSwitch = new Input(InputType.Checkbox);
|
|
||||||
oouiSwitch.SetAttribute("data-toggle", "toggle");
|
|
||||||
}
|
|
||||||
|
|
||||||
var switchCell = (SwitchCell)item;
|
|
||||||
|
|
||||||
nativeSwitchCell.Cell = item;
|
|
||||||
nativeSwitchCell.SecondCol.Style.Width = "25%";
|
|
||||||
_cell = nativeSwitchCell.Cell;
|
|
||||||
|
|
||||||
nativeSwitchCell.Cell.PropertyChanged += OnCellPropertyChanged;
|
|
||||||
nativeSwitchCell.CustomView.AppendChild(oouiSwitch);
|
|
||||||
nativeSwitchCell.TextLabel.Text = switchCell.Text ?? string.Empty;
|
|
||||||
|
|
||||||
oouiSwitch.IsChecked = switchCell.On;
|
|
||||||
oouiSwitch.Click += OnSwitchClick;
|
|
||||||
|
|
||||||
WireUpForceUpdateSizeRequested(item, nativeSwitchCell);
|
|
||||||
|
|
||||||
UpdateBackground(nativeSwitchCell, item);
|
|
||||||
|
|
||||||
return nativeSwitchCell;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnCellPropertyChanged(object sender, PropertyChangedEventArgs e)
|
|
||||||
{
|
|
||||||
var switchCell = (SwitchCell)sender;
|
|
||||||
var nativeSwitchCell = (CellView)GetRealCell(switchCell);
|
|
||||||
|
|
||||||
if (e.PropertyName == SwitchCell.OnProperty.PropertyName)
|
|
||||||
((Input)nativeSwitchCell.CustomView.FirstChild).IsChecked = switchCell.On;
|
|
||||||
else if (e.PropertyName == SwitchCell.TextProperty.PropertyName)
|
|
||||||
nativeSwitchCell.TextLabel.Text = switchCell.Text ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnSwitchClick(object sender, EventArgs eventArgs)
|
|
||||||
{
|
|
||||||
var switchInput = (Input)sender;
|
|
||||||
|
|
||||||
CellView realCell = GetRealCell(_cell);
|
|
||||||
|
|
||||||
if (realCell != null)
|
|
||||||
((SwitchCell)realCell.Cell).On = switchInput.IsChecked;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using Ooui.Forms.Extensions;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Ooui.Forms.Cells
|
||||||
|
{
|
||||||
|
public class TextCellElement : CellElement
|
||||||
|
{
|
||||||
|
public Label TextLabel { get; } = new Label ();
|
||||||
|
|
||||||
|
public Label DetailTextLabel { get; } = new Label ();
|
||||||
|
|
||||||
|
public TextCellElement ()
|
||||||
|
{
|
||||||
|
AppendChild (TextLabel);
|
||||||
|
AppendChild (DetailTextLabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void BindCell ()
|
||||||
|
{
|
||||||
|
Cell.PropertyChanged += Cell_PropertyChanged;
|
||||||
|
|
||||||
|
if (Cell is TextCell textCell) {
|
||||||
|
TextLabel.Text = textCell.Text ?? string.Empty;
|
||||||
|
DetailTextLabel.Text = textCell.Detail ?? string.Empty;
|
||||||
|
TextLabel.Style.Color = textCell.TextColor.ToOouiColor (OouiTheme.TextColor);
|
||||||
|
DetailTextLabel.Style.Color = textCell.DetailColor.ToOouiColor (OouiTheme.SecondaryTextColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
base.BindCell ();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UnbindCell ()
|
||||||
|
{
|
||||||
|
Cell.PropertyChanged -= Cell_PropertyChanged;
|
||||||
|
base.UnbindCell ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell_PropertyChanged (object sender, PropertyChangedEventArgs args)
|
||||||
|
{
|
||||||
|
if (!(Cell is TextCell textCell))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (args.PropertyName == TextCell.TextProperty.PropertyName)
|
||||||
|
TextLabel.Text = textCell.Text ?? string.Empty;
|
||||||
|
else if (args.PropertyName == TextCell.DetailProperty.PropertyName)
|
||||||
|
DetailTextLabel.Text = textCell.Detail ?? string.Empty;
|
||||||
|
else if (args.PropertyName == TextCell.TextColorProperty.PropertyName)
|
||||||
|
TextLabel.Style.Color = textCell.TextColor.ToOouiColor (OouiTheme.TextColor);
|
||||||
|
else if (args.PropertyName == TextCell.DetailColorProperty.PropertyName)
|
||||||
|
DetailTextLabel.Style.Color = textCell.DetailColor.ToOouiColor (OouiTheme.SecondaryTextColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,43 +6,9 @@ namespace Ooui.Forms.Cells
|
||||||
{
|
{
|
||||||
public class TextCellRenderer : CellRenderer
|
public class TextCellRenderer : CellRenderer
|
||||||
{
|
{
|
||||||
public override CellView GetCell(Cell item, CellView reusableView, List listView)
|
protected override CellElement CreateCellElement (Cell item)
|
||||||
{
|
{
|
||||||
var nativeTextCell = base.GetCell(item, reusableView, listView);
|
return new TextCellElement ();
|
||||||
var textCell = (TextCell)item;
|
|
||||||
|
|
||||||
if (nativeTextCell.Cell != null)
|
|
||||||
nativeTextCell.Cell.PropertyChanged -= nativeTextCell.HandlePropertyChanged;
|
|
||||||
|
|
||||||
nativeTextCell.Cell = textCell;
|
|
||||||
textCell.PropertyChanged += nativeTextCell.HandlePropertyChanged;
|
|
||||||
nativeTextCell.ForwardPropertyChanged = HandlePropertyChanged;
|
|
||||||
|
|
||||||
nativeTextCell.TextLabel.Text = textCell.Text ?? string.Empty;
|
|
||||||
nativeTextCell.DetailTextLabel.Text = textCell.Detail ?? string.Empty;
|
|
||||||
nativeTextCell.TextLabel.Style.Color = textCell.TextColor.ToOouiColor(OouiTheme.TextColor);
|
|
||||||
nativeTextCell.DetailTextLabel.Style.Color = textCell.DetailColor.ToOouiColor(OouiTheme.SecondaryTextColor);
|
|
||||||
|
|
||||||
WireUpForceUpdateSizeRequested(item, nativeTextCell);
|
|
||||||
|
|
||||||
UpdateBackground(nativeTextCell, item);
|
|
||||||
|
|
||||||
return nativeTextCell;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void HandlePropertyChanged(object sender, PropertyChangedEventArgs args)
|
|
||||||
{
|
|
||||||
var tvc = (CellView)sender;
|
|
||||||
var textCell = (TextCell)tvc.Cell;
|
|
||||||
|
|
||||||
if (args.PropertyName == TextCell.TextProperty.PropertyName)
|
|
||||||
tvc.TextLabel.Text = textCell.Text ?? string.Empty;
|
|
||||||
else if (args.PropertyName == TextCell.DetailProperty.PropertyName)
|
|
||||||
tvc.DetailTextLabel.Text = textCell.Detail ?? string.Empty;
|
|
||||||
else if (args.PropertyName == TextCell.TextColorProperty.PropertyName)
|
|
||||||
tvc.TextLabel.Style.Color = textCell.TextColor.ToOouiColor(OouiTheme.TextColor);
|
|
||||||
else if (args.PropertyName == TextCell.DetailColorProperty.PropertyName)
|
|
||||||
tvc.DetailTextLabel.Style.Color = textCell.DetailColor.ToOouiColor(OouiTheme.SecondaryTextColor);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
using Ooui.Forms.Renderers;
|
||||||
|
using System;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Ooui.Forms.Cells
|
||||||
|
{
|
||||||
|
public class ViewCellElement : CellElement
|
||||||
|
{
|
||||||
|
WeakReference<IVisualElementRenderer> _rendererRef;
|
||||||
|
|
||||||
|
protected override void BindCell ()
|
||||||
|
{
|
||||||
|
var cell = (ViewCell)Cell;
|
||||||
|
|
||||||
|
IVisualElementRenderer renderer;
|
||||||
|
if (_rendererRef == null || !_rendererRef.TryGetTarget (out renderer))
|
||||||
|
renderer = GetNewRenderer (cell);
|
||||||
|
else {
|
||||||
|
if (renderer.Element != null && renderer == Platform.GetRenderer (renderer.Element))
|
||||||
|
renderer.Element.ClearValue (Platform.RendererProperty);
|
||||||
|
|
||||||
|
var type = Xamarin.Forms.Internals.Registrar.Registered.GetHandlerTypeForObject (cell.View);
|
||||||
|
var reflectableType = renderer as System.Reflection.IReflectableType;
|
||||||
|
var rendererType = reflectableType != null ? reflectableType.GetTypeInfo ().AsType () : renderer.GetType ();
|
||||||
|
if (rendererType == type || (renderer is DefaultRenderer && type == null)) {
|
||||||
|
renderer.SetElement (cell.View);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
renderer = GetNewRenderer (cell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Platform.SetRenderer (cell.View, renderer);
|
||||||
|
|
||||||
|
base.BindCell ();
|
||||||
|
}
|
||||||
|
|
||||||
|
IVisualElementRenderer GetNewRenderer (ViewCell cell)
|
||||||
|
{
|
||||||
|
var newRenderer = Platform.CreateRenderer (cell.View);
|
||||||
|
_rendererRef = new WeakReference<IVisualElementRenderer> (newRenderer);
|
||||||
|
AppendChild (newRenderer.NativeView);
|
||||||
|
|
||||||
|
return newRenderer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,22 +4,9 @@ namespace Ooui.Forms.Cells
|
||||||
{
|
{
|
||||||
public class ViewCellRenderer : CellRenderer
|
public class ViewCellRenderer : CellRenderer
|
||||||
{
|
{
|
||||||
public override CellView GetCell(Cell item, CellView reusableView, List listView)
|
protected override CellElement CreateCellElement (Cell cell)
|
||||||
{
|
{
|
||||||
var viewCell = (ViewCell)item;
|
return new ViewCellElement ();
|
||||||
|
|
||||||
var nativeViewCell = reusableView as ViewCellView;
|
|
||||||
|
|
||||||
if (nativeViewCell == null)
|
|
||||||
nativeViewCell = new ViewCellView();
|
|
||||||
|
|
||||||
nativeViewCell.ViewCell = viewCell;
|
|
||||||
|
|
||||||
SetRealCell(item, nativeViewCell);
|
|
||||||
|
|
||||||
WireUpForceUpdateSizeRequested(item, nativeViewCell);
|
|
||||||
|
|
||||||
return nativeViewCell;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
using Ooui.Forms.Renderers;
|
|
||||||
using System;
|
|
||||||
using Xamarin.Forms;
|
|
||||||
|
|
||||||
namespace Ooui.Forms.Cells
|
|
||||||
{
|
|
||||||
public class ViewCellView : CellView
|
|
||||||
{
|
|
||||||
private WeakReference<IVisualElementRenderer> _rendererRef;
|
|
||||||
private ViewCell _viewCell;
|
|
||||||
|
|
||||||
public ViewCell ViewCell
|
|
||||||
{
|
|
||||||
get { return _viewCell; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_viewCell == value)
|
|
||||||
return;
|
|
||||||
UpdateCell(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateCell(ViewCell cell)
|
|
||||||
{
|
|
||||||
if (_viewCell != null)
|
|
||||||
Device.BeginInvokeOnMainThread(_viewCell.SendDisappearing);
|
|
||||||
|
|
||||||
_viewCell = cell;
|
|
||||||
|
|
||||||
Device.BeginInvokeOnMainThread(_viewCell.SendAppearing);
|
|
||||||
|
|
||||||
IVisualElementRenderer renderer;
|
|
||||||
if (_rendererRef == null || !_rendererRef.TryGetTarget(out renderer))
|
|
||||||
renderer = GetNewRenderer();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (renderer.Element != null && renderer == Platform.GetRenderer(renderer.Element))
|
|
||||||
renderer.Element.ClearValue(Platform.RendererProperty);
|
|
||||||
|
|
||||||
var type = Xamarin.Forms.Internals.Registrar.Registered.GetHandlerType(_viewCell.View.GetType());
|
|
||||||
var reflectableType = renderer as System.Reflection.IReflectableType;
|
|
||||||
var rendererType = reflectableType != null ? reflectableType.GetTypeInfo().AsType() : renderer.GetType();
|
|
||||||
if (rendererType == type || (renderer is DefaultRenderer && type == null))
|
|
||||||
renderer.SetElement(_viewCell.View);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
renderer = GetNewRenderer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Platform.SetRenderer(_viewCell.View, renderer);
|
|
||||||
}
|
|
||||||
|
|
||||||
private IVisualElementRenderer GetNewRenderer()
|
|
||||||
{
|
|
||||||
var newRenderer = Platform.CreateRenderer(_viewCell.View);
|
|
||||||
_rendererRef = new WeakReference<IVisualElementRenderer>(newRenderer);
|
|
||||||
AppendChild(newRenderer.NativeView);
|
|
||||||
|
|
||||||
return newRenderer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using Xamarin.Forms;
|
||||||
namespace Ooui.Forms
|
namespace Ooui.Forms
|
||||||
{
|
{
|
||||||
public static class OouiTheme
|
public static class OouiTheme
|
||||||
|
@ -10,5 +11,7 @@ namespace Ooui.Forms
|
||||||
public static readonly Color ButtonBackgroundColor = new Color (51, 122, 183, 0xFF);
|
public static readonly Color ButtonBackgroundColor = new Color (51, 122, 183, 0xFF);
|
||||||
public static readonly Color ButtonBorderColor = new Color (46, 109, 164, 0xFF);
|
public static readonly Color ButtonBorderColor = new Color (46, 109, 164, 0xFF);
|
||||||
public static readonly Color ButtonTextColor = new Color (0xFF, 0xFF, 0xFF, 0xFF);
|
public static readonly Color ButtonTextColor = new Color (0xFF, 0xFF, 0xFF, 0xFF);
|
||||||
|
|
||||||
|
public static readonly Size SwitchSize = new Size (54, 38);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,7 +124,7 @@ namespace Ooui.Forms.Renderers
|
||||||
foreach (var item in items) {
|
foreach (var item in items) {
|
||||||
var li = listItems[i];
|
var li = listItems[i];
|
||||||
var children = li.Children;
|
var children = li.Children;
|
||||||
var rv = children.Count > 0 ? children[0] as CellView : null;
|
var rv = children.Count > 0 ? children[0] as CellElement : null;
|
||||||
var cell = GetCell (item, rv);
|
var cell = GetCell (item, rv);
|
||||||
if (rv == null) {
|
if (rv == null) {
|
||||||
li.AppendChild (cell);
|
li.AppendChild (cell);
|
||||||
|
@ -171,11 +171,11 @@ namespace Ooui.Forms.Renderers
|
||||||
Control.Style.BackgroundColor = backgroundColor;
|
Control.Style.BackgroundColor = backgroundColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
CellView GetCell (Cell cell, CellView reusableView)
|
CellElement GetCell (Cell cell, CellElement reusableView)
|
||||||
{
|
{
|
||||||
var renderer = (Cells.CellRenderer)Registrar.Registered.GetHandlerForObject<IRegisterable> (cell);
|
var renderer = (Cells.CellRenderer)Registrar.Registered.GetHandlerForObject<IRegisterable> (cell);
|
||||||
|
|
||||||
var realCell = renderer.GetCell (cell, reusableView, Control);
|
var realCell = renderer.GetCellElement (cell, reusableView, Control);
|
||||||
|
|
||||||
return realCell;
|
return realCell;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ namespace Ooui.Forms.Renderers
|
||||||
{
|
{
|
||||||
public override SizeRequest GetDesiredSize (double widthConstraint, double heightConstraint)
|
public override SizeRequest GetDesiredSize (double widthConstraint, double heightConstraint)
|
||||||
{
|
{
|
||||||
var size = new Size (54, 38);
|
var size = OouiTheme.SwitchSize;
|
||||||
return new SizeRequest (size, size);
|
return new SizeRequest (size, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,11 +62,10 @@ namespace Ooui.Forms.Renderers
|
||||||
}
|
}
|
||||||
public SwitchElement ()
|
public SwitchElement ()
|
||||||
{
|
{
|
||||||
AppendChild (knob);
|
|
||||||
knob.Style.Position = "absolute";
|
knob.Style.Position = "absolute";
|
||||||
knob.Style.BorderRadius = "10px";
|
knob.Style.BorderRadius = "10px";
|
||||||
knob.Style.Cursor = "pointer";
|
knob.Style.Cursor = "pointer";
|
||||||
knob.Style.Top = "2px";
|
knob.Style.Top = "0px";
|
||||||
knob.Style.Width = "18px";
|
knob.Style.Width = "18px";
|
||||||
knob.Style.Height = "34px";
|
knob.Style.Height = "34px";
|
||||||
|
|
||||||
|
@ -74,10 +73,14 @@ namespace Ooui.Forms.Renderers
|
||||||
Style.Cursor = "pointer";
|
Style.Cursor = "pointer";
|
||||||
Style.BorderStyle = "solid";
|
Style.BorderStyle = "solid";
|
||||||
Style.BorderWidth = "2px";
|
Style.BorderWidth = "2px";
|
||||||
|
Style.Width = OouiTheme.SwitchSize.Width;
|
||||||
|
Style.Height = OouiTheme.SwitchSize.Height;
|
||||||
|
Style.Position = "relative";
|
||||||
Click += (s, e) => {
|
Click += (s, e) => {
|
||||||
IsChecked = !IsChecked;
|
IsChecked = !IsChecked;
|
||||||
Change?.Invoke (this, EventArgs.Empty);
|
Change?.Invoke (this, EventArgs.Empty);
|
||||||
};
|
};
|
||||||
|
AppendChild (knob);
|
||||||
UpdateUI ();
|
UpdateUI ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,10 +90,10 @@ namespace Ooui.Forms.Renderers
|
||||||
Style.BorderColor = Style.BackgroundColor;
|
Style.BorderColor = Style.BackgroundColor;
|
||||||
knob.Style.BackgroundColor = isChecked ? "#FFF" : "#EEE";
|
knob.Style.BackgroundColor = isChecked ? "#FFF" : "#EEE";
|
||||||
if (isChecked) {
|
if (isChecked) {
|
||||||
knob.Style.Left = "34px";
|
knob.Style.Left = "32px";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
knob.Style.Left = "2px";
|
knob.Style.Left = "0px";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
28
Ooui.sln
28
Ooui.sln
|
@ -16,10 +16,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PlatformSamples", "Platform
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCoreMvc", "PlatformSamples\AspNetCoreMvc\AspNetCoreMvc.csproj", "{7C6D477C-3378-4A86-9C31-AAD51204120B}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCoreMvc", "PlatformSamples\AspNetCoreMvc\AspNetCoreMvc.csproj", "{7C6D477C-3378-4A86-9C31-AAD51204120B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OouiTemplates", "Templates\OouiTemplates\OouiTemplates.csproj", "{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ooui.Wasm.Build.Tasks", "Ooui.Wasm.Build.Tasks\Ooui.Wasm.Build.Tasks.csproj", "{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ooui.Wasm.Build.Tasks", "Ooui.Wasm.Build.Tasks\Ooui.Wasm.Build.Tasks.csproj", "{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "OouiTemplates", "Templates\OouiTemplates\OouiTemplates.csproj", "{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
@ -102,18 +102,6 @@ Global
|
||||||
{7C6D477C-3378-4A86-9C31-AAD51204120B}.Release|x64.Build.0 = Release|Any CPU
|
{7C6D477C-3378-4A86-9C31-AAD51204120B}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{7C6D477C-3378-4A86-9C31-AAD51204120B}.Release|x86.ActiveCfg = Release|Any CPU
|
{7C6D477C-3378-4A86-9C31-AAD51204120B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{7C6D477C-3378-4A86-9C31-AAD51204120B}.Release|x86.Build.0 = Release|Any CPU
|
{7C6D477C-3378-4A86-9C31-AAD51204120B}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{1DA10AAB-EB41-49CF-9441-B4D28D0A7F96}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
@ -126,6 +114,18 @@ Global
|
||||||
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Release|x64.Build.0 = Release|Any CPU
|
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Release|x86.ActiveCfg = Release|Any CPU
|
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Release|x86.Build.0 = Release|Any CPU
|
{6E9C9582-0DA8-4496-BAE0-23EFAF4A10C2}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
Loading…
Reference in New Issue