158 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections;
 | |
| using Xamarin.Forms;
 | |
| 
 | |
| namespace Gallery.Resources.UI
 | |
| {
 | |
|     public class OptionEntry : Entry { }
 | |
| 
 | |
|     public class OptionPicker : Picker { }
 | |
| 
 | |
|     public abstract class OptionCell : ViewCell
 | |
|     {
 | |
|         public static readonly BindableProperty TitleProperty = BindableProperty.Create(nameof(Title), typeof(string), typeof(OptionCell));
 | |
| 
 | |
|         public string Title
 | |
|         {
 | |
|             get => (string)GetValue(TitleProperty);
 | |
|             set => SetValue(TitleProperty, value);
 | |
|         }
 | |
| 
 | |
|         protected abstract View Content { get; }
 | |
| 
 | |
|         public OptionCell()
 | |
|         {
 | |
|             View = new Grid
 | |
|             {
 | |
|                 BindingContext = this,
 | |
|                 Padding = new Thickness(20, 0),
 | |
|                 ColumnDefinitions =
 | |
|                 {
 | |
|                     new ColumnDefinition { Width = new GridLength(.3, GridUnitType.Star) },
 | |
|                     new ColumnDefinition { Width = new GridLength(.7, GridUnitType.Star) }
 | |
|                 },
 | |
|                 Children =
 | |
|                 {
 | |
|                     new Label
 | |
|                     {
 | |
|                         LineBreakMode = LineBreakMode.TailTruncation,
 | |
|                         VerticalOptions = LayoutOptions.Center
 | |
|                     }
 | |
|                     .Binding(Label.TextProperty, nameof(Title))
 | |
|                     .DynamicResource(Label.TextColorProperty, Extensions.TextColor),
 | |
| 
 | |
|                     Content.GridColumn(1)
 | |
|                 }
 | |
|             }
 | |
|             .DynamicResource(VisualElement.BackgroundColorProperty, Extensions.OptionTintColor);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public class OptionTextCell : OptionCell
 | |
|     {
 | |
|         public static readonly BindableProperty DetailProperty = BindableProperty.Create(nameof(Detail), typeof(string), typeof(OptionTextCell));
 | |
| 
 | |
|         public string Detail
 | |
|         {
 | |
|             get => (string)GetValue(DetailProperty);
 | |
|             set => SetValue(DetailProperty, value);
 | |
|         }
 | |
| 
 | |
|         protected override View Content =>
 | |
|             new Label
 | |
|             {
 | |
|                 HorizontalOptions = LayoutOptions.End,
 | |
|                 VerticalOptions = LayoutOptions.Center
 | |
|             }
 | |
|             .Binding(Label.TextProperty, nameof(Detail))
 | |
|             .DynamicResource(Label.TextColorProperty, Extensions.SubTextColor);
 | |
|     }
 | |
| 
 | |
|     public class OptionSwitchCell : OptionCell
 | |
|     {
 | |
|         public static readonly BindableProperty IsToggledProperty = BindableProperty.Create(nameof(IsToggled), typeof(bool), typeof(OptionSwitchCell));
 | |
| 
 | |
|         public bool IsToggled
 | |
|         {
 | |
|             get => (bool)GetValue(IsToggledProperty);
 | |
|             set => SetValue(IsToggledProperty, value);
 | |
|         }
 | |
| 
 | |
|         protected override View Content =>
 | |
|             new Switch
 | |
|             {
 | |
|                 HorizontalOptions = LayoutOptions.End,
 | |
|                 VerticalOptions = LayoutOptions.Center
 | |
|             }
 | |
|             .Binding(Switch.IsToggledProperty, nameof(IsToggled), mode: BindingMode.TwoWay);
 | |
|     }
 | |
| 
 | |
|     public class OptionDropCell : OptionCell
 | |
|     {
 | |
|         public static readonly BindableProperty ItemsProperty = BindableProperty.Create(nameof(Items), typeof(IList), typeof(OptionDropCell));
 | |
|         public static readonly BindableProperty SelectedIndexProperty = BindableProperty.Create(nameof(SelectedIndex), typeof(int), typeof(OptionDropCell));
 | |
| 
 | |
|         public IList Items
 | |
|         {
 | |
|             get => (IList)GetValue(ItemsProperty);
 | |
|             set => SetValue(ItemsProperty, value);
 | |
|         }
 | |
| 
 | |
|         public int SelectedIndex
 | |
|         {
 | |
|             get => (int)GetValue(SelectedIndexProperty);
 | |
|             set => SetValue(SelectedIndexProperty, value);
 | |
|         }
 | |
| 
 | |
|         protected override View Content =>
 | |
|             new OptionPicker
 | |
|             {
 | |
|                 HorizontalOptions = LayoutOptions.Fill,
 | |
|                 VerticalOptions = LayoutOptions.Center
 | |
|             }
 | |
|             .Binding(Picker.ItemsSourceProperty, nameof(Items))
 | |
|             .Binding(Picker.SelectedIndexProperty, nameof(SelectedIndex), mode: BindingMode.TwoWay)
 | |
|             .DynamicResource(Picker.TextColorProperty, Extensions.TextColor)
 | |
|             .DynamicResource(VisualElement.BackgroundColorProperty, Extensions.OptionTintColor);
 | |
|     }
 | |
| 
 | |
|     public class OptionEntryCell : OptionCell
 | |
|     {
 | |
|         public static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(OptionEntryCell));
 | |
|         public static readonly BindableProperty KeyboardProperty = BindableProperty.Create(nameof(Keyboard), typeof(Keyboard), typeof(OptionEntryCell));
 | |
|         public static readonly BindableProperty PlaceholderProperty = BindableProperty.Create(nameof(Placeholder), typeof(string), typeof(OptionEntryCell));
 | |
| 
 | |
|         public string Text
 | |
|         {
 | |
|             get => (string)GetValue(TextProperty);
 | |
|             set => SetValue(TextProperty, value);
 | |
|         }
 | |
| 
 | |
|         public Keyboard Keyboard
 | |
|         {
 | |
|             get => (Keyboard)GetValue(KeyboardProperty);
 | |
|             set => SetValue(KeyboardProperty, value);
 | |
|         }
 | |
| 
 | |
|         public string Placeholder
 | |
|         {
 | |
|             get => (string)GetValue(PlaceholderProperty);
 | |
|             set => SetValue(PlaceholderProperty, value);
 | |
|         }
 | |
| 
 | |
|         protected override View Content =>
 | |
|             new OptionEntry
 | |
|             {
 | |
|                 HorizontalOptions = LayoutOptions.Fill,
 | |
|                 HorizontalTextAlignment = TextAlignment.End,
 | |
|                 VerticalOptions = LayoutOptions.Center,
 | |
|                 ReturnType = ReturnType.Next
 | |
|             }
 | |
|             .Binding(Entry.TextProperty, nameof(Text), mode: BindingMode.TwoWay)
 | |
|             .Binding(Entry.PlaceholderProperty, nameof(Placeholder))
 | |
|             .Binding(InputView.KeyboardProperty, nameof(Keyboard))
 | |
|             .DynamicResource(Entry.TextColorProperty, Extensions.TextColor)
 | |
|             .DynamicResource(Entry.PlaceholderColorProperty, Extensions.SubTextColor)
 | |
|             .DynamicResource(VisualElement.BackgroundColorProperty, Extensions.OptionTintColor);
 | |
|     }
 | |
| }
 |