105 lines
3.6 KiB
C#
105 lines
3.6 KiB
C#
|
using Ooui.Forms.Extensions;
|
|||
|
using System;
|
|||
|
using System.ComponentModel;
|
|||
|
using Xamarin.Forms;
|
|||
|
|
|||
|
namespace Ooui.Forms.Cells
|
|||
|
{
|
|||
|
public class EntryCellRenderer : CellRenderer
|
|||
|
{
|
|||
|
private static Cell _cell;
|
|||
|
|
|||
|
public override CellView GetCell(Cell item, CellView reusableView, List listView)
|
|||
|
{
|
|||
|
TextInput nativeEntry = null;
|
|||
|
|
|||
|
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();
|
|||
|
}
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|