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
|
||||
{
|
||||
private EventHandler _onForceUpdateSizeRequested;
|
||||
EventHandler _onForceUpdateSizeRequested;
|
||||
|
||||
static readonly BindableProperty RealCellProperty =
|
||||
BindableProperty.CreateAttached("RealCell", typeof(Div),
|
||||
typeof(Cell), null);
|
||||
BindableProperty.CreateAttached ("RealCell", typeof (CellElement), 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);
|
||||
UpdateBackground(nativeCell, item);
|
||||
WireUpForceUpdateSizeRequested (cell, cellElement);
|
||||
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;
|
||||
|
||||
if (backgroundColor == Xamarin.Forms.Color.Default && cell.RealParent is VisualElement element)
|
||||
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;
|
||||
|
||||
_onForceUpdateSizeRequested = (sender, e) =>
|
||||
{
|
||||
OnForceUpdateSizeRequest(cell, nativeCell);
|
||||
_onForceUpdateSizeRequested = (sender, e) => {
|
||||
OnForceUpdateSizeRequest (cell, cellElement);
|
||||
};
|
||||
|
||||
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.ComponentModel;
|
||||
using System;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Ooui.Forms.Cells
|
||||
{
|
||||
public class EntryCellRenderer : CellRenderer
|
||||
public class EntryCellRenderer : TextCellRenderer
|
||||
{
|
||||
private static Cell _cell;
|
||||
|
||||
public override CellView GetCell(Cell item, CellView reusableView, List listView)
|
||||
protected override CellElement CreateCellElement (Cell item)
|
||||
{
|
||||
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(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;
|
||||
return new EntryCellElement ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 override CellView GetCell(Cell item, CellView reusableView, List listView)
|
||||
protected override CellElement CreateCellElement (Cell cell)
|
||||
{
|
||||
var nativeImageCell = reusableView as CellView ?? new CellView();
|
||||
|
||||
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;
|
||||
return new ImageCellElement ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.ComponentModel;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Ooui.Forms.Cells
|
||||
{
|
||||
public class SwitchCellRenderer : CellRenderer
|
||||
{
|
||||
private static Cell _cell;
|
||||
|
||||
public override CellView GetCell(Cell item, CellView reusableView, List listView)
|
||||
protected override CellElement CreateCellElement (Cell cell)
|
||||
{
|
||||
var nativeSwitchCell = reusableView as CellView;
|
||||
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;
|
||||
return new SwitchCellElement ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 override CellView GetCell(Cell item, CellView reusableView, List listView)
|
||||
protected override CellElement CreateCellElement (Cell item)
|
||||
{
|
||||
var nativeTextCell = base.GetCell(item, reusableView, listView);
|
||||
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);
|
||||
return new TextCellElement ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 override CellView GetCell(Cell item, CellView reusableView, List listView)
|
||||
protected override CellElement CreateCellElement (Cell cell)
|
||||
{
|
||||
var viewCell = (ViewCell)item;
|
||||
|
||||
var nativeViewCell = reusableView as ViewCellView;
|
||||
|
||||
if (nativeViewCell == null)
|
||||
nativeViewCell = new ViewCellView();
|
||||
|
||||
nativeViewCell.ViewCell = viewCell;
|
||||
|
||||
SetRealCell(item, nativeViewCell);
|
||||
|
||||
WireUpForceUpdateSizeRequested(item, nativeViewCell);
|
||||
|
||||
return nativeViewCell;
|
||||
return new ViewCellElement ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 Xamarin.Forms;
|
||||
namespace Ooui.Forms
|
||||
{
|
||||
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 ButtonBorderColor = new Color (46, 109, 164, 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) {
|
||||
var li = listItems[i];
|
||||
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);
|
||||
if (rv == null) {
|
||||
li.AppendChild (cell);
|
||||
|
@ -171,11 +171,11 @@ namespace Ooui.Forms.Renderers
|
|||
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 realCell = renderer.GetCell (cell, reusableView, Control);
|
||||
var realCell = renderer.GetCellElement (cell, reusableView, Control);
|
||||
|
||||
return realCell;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ namespace Ooui.Forms.Renderers
|
|||
{
|
||||
public override SizeRequest GetDesiredSize (double widthConstraint, double heightConstraint)
|
||||
{
|
||||
var size = new Size (54, 38);
|
||||
var size = OouiTheme.SwitchSize;
|
||||
return new SizeRequest (size, size);
|
||||
}
|
||||
|
||||
|
@ -62,11 +62,10 @@ namespace Ooui.Forms.Renderers
|
|||
}
|
||||
public SwitchElement ()
|
||||
{
|
||||
AppendChild (knob);
|
||||
knob.Style.Position = "absolute";
|
||||
knob.Style.BorderRadius = "10px";
|
||||
knob.Style.Cursor = "pointer";
|
||||
knob.Style.Top = "2px";
|
||||
knob.Style.Top = "0px";
|
||||
knob.Style.Width = "18px";
|
||||
knob.Style.Height = "34px";
|
||||
|
||||
|
@ -74,10 +73,14 @@ namespace Ooui.Forms.Renderers
|
|||
Style.Cursor = "pointer";
|
||||
Style.BorderStyle = "solid";
|
||||
Style.BorderWidth = "2px";
|
||||
Style.Width = OouiTheme.SwitchSize.Width;
|
||||
Style.Height = OouiTheme.SwitchSize.Height;
|
||||
Style.Position = "relative";
|
||||
Click += (s, e) => {
|
||||
IsChecked = !IsChecked;
|
||||
Change?.Invoke (this, EventArgs.Empty);
|
||||
};
|
||||
AppendChild (knob);
|
||||
UpdateUI ();
|
||||
}
|
||||
|
||||
|
@ -87,10 +90,10 @@ namespace Ooui.Forms.Renderers
|
|||
Style.BorderColor = Style.BackgroundColor;
|
||||
knob.Style.BackgroundColor = isChecked ? "#FFF" : "#EEE";
|
||||
if (isChecked) {
|
||||
knob.Style.Left = "34px";
|
||||
knob.Style.Left = "32px";
|
||||
}
|
||||
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
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCoreMvc", "PlatformSamples\AspNetCoreMvc\AspNetCoreMvc.csproj", "{7C6D477C-3378-4A86-9C31-AAD51204120B}"
|
||||
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}"
|
||||
EndProject
|
||||
Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "OouiTemplates", "Templates\OouiTemplates\OouiTemplates.csproj", "{7D3B32CF-38A3-40DE-8123-2E7A0D87104D}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
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|x86.ActiveCfg = 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.Build.0 = 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|x86.ActiveCfg = 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
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
Loading…
Reference in New Issue