add account page detail
This commit is contained in:
@ -7,13 +7,13 @@ namespace Billing.UI
|
||||
{
|
||||
#region UI Properties
|
||||
|
||||
private static readonly BindableProperty SundayProperty = BindableProperty.Create(nameof(Sunday), typeof(BillingDay), typeof(BillingDate));
|
||||
private static readonly BindableProperty MondayProperty = BindableProperty.Create(nameof(Monday), typeof(BillingDay), typeof(BillingDate));
|
||||
private static readonly BindableProperty TuesdayProperty = BindableProperty.Create(nameof(Tuesday), typeof(BillingDay), typeof(BillingDate));
|
||||
private static readonly BindableProperty WednesdayProperty = BindableProperty.Create(nameof(Wednesday), typeof(BillingDay), typeof(BillingDate));
|
||||
private static readonly BindableProperty ThursdayProperty = BindableProperty.Create(nameof(Thursday), typeof(BillingDay), typeof(BillingDate));
|
||||
private static readonly BindableProperty FridayProperty = BindableProperty.Create(nameof(Friday), typeof(BillingDay), typeof(BillingDate));
|
||||
private static readonly BindableProperty SaturdayProperty = BindableProperty.Create(nameof(Saturday), typeof(BillingDay), typeof(BillingDate));
|
||||
public static readonly BindableProperty SundayProperty = BindableProperty.Create(nameof(Sunday), typeof(BillingDay), typeof(BillingDate));
|
||||
public static readonly BindableProperty MondayProperty = BindableProperty.Create(nameof(Monday), typeof(BillingDay), typeof(BillingDate));
|
||||
public static readonly BindableProperty TuesdayProperty = BindableProperty.Create(nameof(Tuesday), typeof(BillingDay), typeof(BillingDate));
|
||||
public static readonly BindableProperty WednesdayProperty = BindableProperty.Create(nameof(Wednesday), typeof(BillingDay), typeof(BillingDate));
|
||||
public static readonly BindableProperty ThursdayProperty = BindableProperty.Create(nameof(Thursday), typeof(BillingDay), typeof(BillingDate));
|
||||
public static readonly BindableProperty FridayProperty = BindableProperty.Create(nameof(Friday), typeof(BillingDay), typeof(BillingDate));
|
||||
public static readonly BindableProperty SaturdayProperty = BindableProperty.Create(nameof(Saturday), typeof(BillingDay), typeof(BillingDate));
|
||||
|
||||
public BillingDay Sunday => (BillingDay)GetValue(SundayProperty);
|
||||
public BillingDay Monday => (BillingDay)GetValue(MondayProperty);
|
||||
@ -219,12 +219,12 @@ namespace Billing.UI
|
||||
|
||||
public class BillingDay : BindableObject
|
||||
{
|
||||
private static readonly BindableProperty DateProperty = BindableProperty.Create(nameof(Date), typeof(DateTime), typeof(BillingDay), propertyChanged: OnDatePropertyChanged);
|
||||
private static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(BillingDay));
|
||||
private static readonly BindableProperty FontFamilyProperty = BindableProperty.Create(nameof(FontFamily), typeof(string), typeof(BillingDay), defaultValue: Definition.GetCascadiaRegularFontFamily());
|
||||
private static readonly BindableProperty IsSelectedProperty = BindableProperty.Create(nameof(IsSelected), typeof(bool), typeof(BillingDay));
|
||||
private static readonly BindableProperty OpacityProperty = BindableProperty.Create(nameof(Opacity), typeof(double), typeof(BillingDay), defaultValue: 1.0);
|
||||
private static readonly BindableProperty TextOpacityProperty = BindableProperty.Create(nameof(TextOpacity), typeof(double), typeof(BillingDay), defaultValue: 1.0);
|
||||
public static readonly BindableProperty DateProperty = BindableProperty.Create(nameof(Date), typeof(DateTime), typeof(BillingDay), propertyChanged: OnDatePropertyChanged);
|
||||
public static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(BillingDay));
|
||||
public static readonly BindableProperty FontFamilyProperty = BindableProperty.Create(nameof(FontFamily), typeof(string), typeof(BillingDay), defaultValue: Definition.GetCascadiaRegularFontFamily());
|
||||
public static readonly BindableProperty IsSelectedProperty = BindableProperty.Create(nameof(IsSelected), typeof(bool), typeof(BillingDay));
|
||||
public static readonly BindableProperty OpacityProperty = BindableProperty.Create(nameof(Opacity), typeof(double), typeof(BillingDay), defaultValue: 1.0);
|
||||
public static readonly BindableProperty TextOpacityProperty = BindableProperty.Create(nameof(TextOpacity), typeof(double), typeof(BillingDay), defaultValue: 1.0);
|
||||
|
||||
private static void OnDatePropertyChanged(BindableObject obj, object old, object @new)
|
||||
{
|
||||
|
159
Billing.Shared/UI/GroupStackLayout.cs
Normal file
159
Billing.Shared/UI/GroupStackLayout.cs
Normal file
@ -0,0 +1,159 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Linq;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Billing.UI
|
||||
{
|
||||
public class GroupStackLayout : Layout<View>
|
||||
{
|
||||
public static readonly BindableProperty GroupHeaderTemplateProperty = BindableProperty.Create(nameof(GroupHeaderTemplate), typeof(DataTemplate), typeof(GroupStackLayout));
|
||||
public static readonly BindableProperty ItemTemplateProperty = BindableProperty.Create(nameof(ItemTemplate), typeof(DataTemplate), typeof(GroupStackLayout));
|
||||
public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create(nameof(ItemsSource), typeof(IList), typeof(GroupStackLayout), propertyChanged: OnItemsSourcePropertyChanged);
|
||||
public static readonly BindableProperty SpacingProperty = BindableProperty.Create(nameof(Spacing), typeof(double), typeof(GroupStackLayout), defaultValue: 4d);
|
||||
|
||||
public DataTemplate GroupHeaderTemplate
|
||||
{
|
||||
get => (DataTemplate)GetValue(GroupHeaderTemplateProperty);
|
||||
set => SetValue(GroupHeaderTemplateProperty, value);
|
||||
}
|
||||
public DataTemplate ItemTemplate
|
||||
{
|
||||
get => (DataTemplate)GetValue(ItemTemplateProperty);
|
||||
set => SetValue(ItemTemplateProperty, value);
|
||||
}
|
||||
public IList ItemsSource
|
||||
{
|
||||
get => (IList)GetValue(ItemsSourceProperty);
|
||||
set => SetValue(ItemsSourceProperty, value);
|
||||
}
|
||||
public double Spacing
|
||||
{
|
||||
get => (double)GetValue(SpacingProperty);
|
||||
set => SetValue(SpacingProperty, value);
|
||||
}
|
||||
|
||||
private static void OnItemsSourcePropertyChanged(BindableObject obj, object old, object @new)
|
||||
{
|
||||
var stack = (GroupStackLayout)obj;
|
||||
stack.lastWidth = -1;
|
||||
if (@new == null)
|
||||
{
|
||||
stack.cachedLayout.Clear();
|
||||
stack.Children.Clear();
|
||||
stack.InvalidateLayout();
|
||||
}
|
||||
else if (@new is IList list)
|
||||
{
|
||||
stack.freezed = true;
|
||||
stack.cachedLayout.Clear();
|
||||
stack.Children.Clear();
|
||||
var groupTemplate = stack.GroupHeaderTemplate;
|
||||
var itemTemplate = stack.ItemTemplate;
|
||||
for (var i = 0; i < list.Count; i++)
|
||||
{
|
||||
var item = list[i];
|
||||
if (item is IList sublist)
|
||||
{
|
||||
if (groupTemplate != null)
|
||||
{
|
||||
var child = groupTemplate.CreateContent();
|
||||
if (child is View view)
|
||||
{
|
||||
view.BindingContext = item;
|
||||
stack.Children.Add(view);
|
||||
}
|
||||
}
|
||||
foreach (var it in sublist)
|
||||
{
|
||||
var child = itemTemplate.CreateContent();
|
||||
if (child is View view)
|
||||
{
|
||||
view.BindingContext = it;
|
||||
stack.Children.Add(view);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var child = itemTemplate.CreateContent();
|
||||
if (child is View view)
|
||||
{
|
||||
view.BindingContext = list[i];
|
||||
stack.Children.Add(view);
|
||||
}
|
||||
}
|
||||
}
|
||||
stack.freezed = false;
|
||||
stack.UpdateChildrenLayout();
|
||||
stack.InvalidateLayout();
|
||||
}
|
||||
}
|
||||
|
||||
private readonly Dictionary<View, Rectangle> cachedLayout = new();
|
||||
|
||||
private bool freezed;
|
||||
private double lastWidth = -1;
|
||||
private SizeRequest lastSizeRequest;
|
||||
|
||||
public void Refresh(IList list)
|
||||
{
|
||||
OnItemsSourcePropertyChanged(this, null, list);
|
||||
}
|
||||
|
||||
protected override void LayoutChildren(double x, double y, double width, double height)
|
||||
{
|
||||
if (freezed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var source = ItemsSource;
|
||||
if (source == null || source.Count <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var spacing = Spacing;
|
||||
var lastHeight = 0.0;
|
||||
foreach (var item in Children)
|
||||
{
|
||||
var measured = item.Measure(width, height, MeasureFlags.IncludeMargins);
|
||||
var rect = new Rectangle(
|
||||
0, lastHeight, width,
|
||||
measured.Request.Height);
|
||||
if (cachedLayout.TryGetValue(item, out var v))
|
||||
{
|
||||
if (v != rect)
|
||||
{
|
||||
cachedLayout[item] = rect;
|
||||
item.Layout(rect);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cachedLayout.Add(item, rect);
|
||||
item.Layout(rect);
|
||||
}
|
||||
lastHeight += rect.Height + spacing;
|
||||
}
|
||||
}
|
||||
|
||||
protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint)
|
||||
{
|
||||
if (lastWidth == widthConstraint)
|
||||
{
|
||||
return lastSizeRequest;
|
||||
}
|
||||
lastWidth = widthConstraint;
|
||||
var spacing = Spacing;
|
||||
var lastHeight = 0.0;
|
||||
foreach (var item in Children)
|
||||
{
|
||||
var measured = item.Measure(widthConstraint, heightConstraint, MeasureFlags.IncludeMargins);
|
||||
lastHeight += measured.Request.Height + spacing;
|
||||
}
|
||||
lastSizeRequest = new SizeRequest(new Size(widthConstraint, lastHeight));
|
||||
return lastSizeRequest;
|
||||
}
|
||||
}
|
||||
}
|
51
Billing.Shared/UI/ItemSelectPage.cs
Normal file
51
Billing.Shared/UI/ItemSelectPage.cs
Normal file
@ -0,0 +1,51 @@
|
||||
using Billing.Themes;
|
||||
using System.Collections;
|
||||
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Billing.UI
|
||||
{
|
||||
public class ItemSelectPage : ContentPage
|
||||
{
|
||||
public ItemSelectPage(IList source)
|
||||
{
|
||||
Content = new ListView
|
||||
{
|
||||
ItemsSource = source,
|
||||
ItemTemplate = new DataTemplate(() => new StackLayout
|
||||
{
|
||||
Orientation = StackOrientation.Horizontal,
|
||||
Padding = new Thickness(20, 0),
|
||||
Spacing = 10,
|
||||
Children =
|
||||
{
|
||||
new Image
|
||||
{
|
||||
WidthRequest = 22,
|
||||
HeightRequest = 22,
|
||||
Aspect = Aspect.AspectFit,
|
||||
VerticalOptions = LayoutOptions.Center
|
||||
}
|
||||
.Binding(Image.SourceProperty, "Icon"),
|
||||
|
||||
new Label
|
||||
{
|
||||
VerticalOptions = LayoutOptions.Center,
|
||||
LineBreakMode = LineBreakMode.TailTruncation
|
||||
}
|
||||
.Binding(Label.TextProperty, "Name")
|
||||
.DynamicResource(Label.TextColorProperty, BaseTheme.TextColor)
|
||||
}
|
||||
})
|
||||
}
|
||||
.DynamicResource(BackgroundColorProperty, BaseTheme.WindowBackgroundColor);
|
||||
}
|
||||
}
|
||||
|
||||
public class SelectItem<T>
|
||||
{
|
||||
public string Icon { get; set; }
|
||||
public T Value { get; set; }
|
||||
public string Name { get; set; }
|
||||
}
|
||||
}
|
@ -4,7 +4,6 @@ using Xamarin.Forms;
|
||||
|
||||
namespace Billing.UI
|
||||
{
|
||||
|
||||
public class OptionEntry : Entry { }
|
||||
public class OptionEditor : Editor { }
|
||||
|
||||
|
Reference in New Issue
Block a user