DigitalFormHeader.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using System;
  2. using InABox.Core;
  3. using InABox.Mobile;
  4. using Xamarin.Forms;
  5. namespace PRS.Mobile
  6. {
  7. public class DigitalFormHeader : MobileCard, IDigitalFormControl<DFLayoutHeader>
  8. {
  9. private readonly Image _image;
  10. private readonly Label _label;
  11. private DFLayoutHeader _definition;
  12. public DFLayoutHeader Definition
  13. {
  14. get => _definition;
  15. set
  16. {
  17. _definition = value;
  18. Initialize(value ?? new DFLayoutHeader());
  19. }
  20. }
  21. private bool _collapsed;
  22. public bool Collapsed
  23. {
  24. get => _collapsed;
  25. set
  26. {
  27. _collapsed = value;
  28. _image.Source = value
  29. ? ImageSource.FromFile("arrow_white_up")
  30. : ImageSource.FromFile("arrow_white_down");
  31. }
  32. }
  33. public event EventHandler CollapsedChanged;
  34. public DigitalFormHeader()
  35. {
  36. HeightRequest = 40;
  37. Padding = 5;
  38. BorderColor = Color.Gray;
  39. BackgroundColor = Color.Silver;
  40. Grid grid = new Grid()
  41. {
  42. ColumnSpacing = 0,
  43. RowSpacing = 0
  44. };
  45. grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto});
  46. grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Star});
  47. grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto});
  48. grid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Star });
  49. _image = new Image()
  50. {
  51. HeightRequest = 20,
  52. WidthRequest = 20,
  53. VerticalOptions = LayoutOptions.Center,
  54. HorizontalOptions = LayoutOptions.Center
  55. };
  56. _image.GestureRecognizers.Add(new TapGestureRecognizer() { Command = new Command(OnTap)});
  57. grid.Children.Add(_image);
  58. _label = new Label()
  59. {
  60. Margin = new Thickness(5,0,5,0),
  61. VerticalOptions = LayoutOptions.Fill,
  62. VerticalTextAlignment = TextAlignment.Center,
  63. HorizontalOptions = LayoutOptions.Fill,
  64. };
  65. _label.GestureRecognizers.Add(new TapGestureRecognizer() { Command = new Command(OnTap)});
  66. _label.SetValue(Grid.ColumnProperty,1);
  67. grid.Children.Add(_label);
  68. Content = grid;
  69. }
  70. private void OnTap()
  71. {
  72. Collapsed = !Collapsed;
  73. CollapsedChanged?.Invoke(this, EventArgs.Empty);
  74. }
  75. private void Initialize(DFLayoutHeader definition)
  76. {
  77. Collapsed = definition.Collapsed;
  78. _image.SetValue(Grid.ColumnProperty, definition.Alignment == DFLayoutHeaderAlignment.Left ? 0 : 2);
  79. _image.Source = definition.Collapsed
  80. ? ImageSource.FromFile("arrow_white_up")
  81. : ImageSource.FromFile("arrow_white_down");
  82. _label.Text = definition.Header?.Trim();
  83. _label.LineBreakMode = definition.Style.TextWrapping ? LineBreakMode.WordWrap : LineBreakMode.NoWrap;
  84. _label.BackgroundColor = definition.Style.BackgroundColour.IsEmpty ? Color.Transparent : definition.Style.BackgroundColour;
  85. _label.FontAttributes = definition.Style.IsBold ? FontAttributes.Bold
  86. : definition.Style.IsItalic ? FontAttributes.Italic
  87. : FontAttributes.None;
  88. _label.TextDecorations = definition.Style.Underline == UnderlineType.Single || definition.Style.Underline == UnderlineType.Double ?
  89. TextDecorations.Underline : TextDecorations.None;
  90. _label.FontSize = definition.Style.FontSize > 5 && definition.Style.FontSize < 37 ? definition.Style.FontSize
  91. : Device.GetNamedSize(NamedSize.Small, _label);
  92. _label.TextColor = definition.Style.ForegroundColour.IsEmpty ? Color.Black : definition.Style.ForegroundColour;
  93. _label.HorizontalTextAlignment = definition.Style.HorizontalTextAlignment == DFLayoutAlignment.Start
  94. ? TextAlignment.Start
  95. : definition.Style.HorizontalTextAlignment == DFLayoutAlignment.Middle
  96. ? TextAlignment.Center
  97. : TextAlignment.End;
  98. _label.VerticalTextAlignment = definition.Style.VerticalTextAlignment == DFLayoutAlignment.Start
  99. ? TextAlignment.Start
  100. : definition.Style.HorizontalTextAlignment == DFLayoutAlignment.Middle
  101. ? TextAlignment.Center
  102. : TextAlignment.End;
  103. }
  104. }
  105. }