DFStringFieldControl.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using Avalonia.Controls;
  2. using Avalonia.Input;
  3. using Avalonia.Interactivity;
  4. using Avalonia.Layout;
  5. using Avalonia.Media;
  6. using CommunityToolkit.Mvvm.Input;
  7. using DialogHostAvalonia;
  8. using InABox.Avalonia;
  9. using InABox.Avalonia.Components;
  10. using InABox.Core;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Diagnostics.CodeAnalysis;
  14. using System.Globalization;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. namespace PRS.Avalonia.DigitalForms;
  19. partial class DFStringFieldControl : DigitalFormFieldControl<DFLayoutStringField, DFLayoutStringFieldProperties, string, string?>
  20. {
  21. private string? text;
  22. private TextBox? TextBox;
  23. private Button? Btn;
  24. private TextBlock? TextBlock;
  25. [NotNull]
  26. private string? Text
  27. {
  28. get => (Field.Properties.PopupEditor ? text : TextBox?.Text) ?? "";
  29. set
  30. {
  31. if (Field.Properties.PopupEditor)
  32. {
  33. text = value;
  34. TextBlock!.Text = value;
  35. }
  36. else if(TextBox is not null)
  37. {
  38. TextBox.Text = value;
  39. }
  40. }
  41. }
  42. public override void SetSerializedValue(string? value)
  43. {
  44. Text = value;
  45. }
  46. public override string? GetSerializedValue()
  47. {
  48. return Text;
  49. }
  50. protected override Control Create()
  51. {
  52. if (Field.Properties.PopupEditor)
  53. {
  54. var panel = new DockPanel();
  55. Btn = new Button { Content = "..." };
  56. Btn.Command = PopupCommand;
  57. TextBlock = new TextBlock();
  58. TextBlock.Classes.Add("DFStringFieldControl");
  59. DockPanel.SetDock(Btn, Dock.Left);
  60. DockPanel.SetDock(TextBlock, Dock.Right);
  61. panel.Children.Add(Btn);
  62. panel.Children.Add(TextBlock);
  63. return panel;
  64. }
  65. else
  66. {
  67. TextBox = new TextBox();
  68. TextBox.Text = Field.Properties.Default;
  69. TextBox.TextWrapping = Field.Properties.TextWrapping ? TextWrapping.Wrap : TextWrapping.NoWrap;
  70. TextBox.TextAlignment = TextAlignment.Left;
  71. TextBox.VerticalContentAlignment = VerticalAlignment.Center;
  72. TextBox.VerticalAlignment = VerticalAlignment.Stretch;
  73. TextBox.TextChanged += (sender, e) => ChangeField();
  74. return TextBox;
  75. }
  76. }
  77. public override void SetBackground(IBrush brush, bool defaultColour)
  78. {
  79. if (Field.Properties.PopupEditor)
  80. {
  81. Background = brush;
  82. }
  83. else
  84. {
  85. TextBox!.Background = brush;
  86. }
  87. }
  88. [RelayCommand]
  89. private async Task Popup()
  90. {
  91. var result = await Navigation.Popup<TextEditViewModel, string?>(x =>
  92. {
  93. x.Text = Text;
  94. x.Multiline = true;
  95. });
  96. if(result is not null)
  97. {
  98. Text = result;
  99. ChangeField();
  100. }
  101. }
  102. public override string GetValue() => Text;
  103. public override void SetValue(string? value) => Text = value;
  104. protected override bool IsEmpty() => string.IsNullOrWhiteSpace(Text);
  105. }