DynamicMapColumn.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4. using System.Windows.Media.Imaging;
  5. using InABox.Core;
  6. using InABox.DynamicGrid;
  7. using InABox.WPF;
  8. using PRSDesktop.Forms;
  9. namespace PRSDesktop
  10. {
  11. internal class DynamicMapColumn<T> : DynamicImageColumn where T : Entity, new()
  12. {
  13. private readonly string Latitude = "";
  14. private readonly string Longitude = "";
  15. private readonly BitmapImage milestone = Resources.milestone.AsBitmapImage();
  16. private readonly string Timestamp = "";
  17. public DynamicMapColumn(DynamicGrid<T> grid, Expression<Func<T, object>> property) : base(r => null)
  18. {
  19. Latitude = CoreUtils.GetFullPropertyName(property, ".") + ".Latitude";
  20. Longitude = CoreUtils.GetFullPropertyName(property, ".") + ".Longitude";
  21. Timestamp = CoreUtils.GetFullPropertyName(property, ".") + ".Timestamp";
  22. grid.HiddenColumns.Add(CoreUtils.GetPropertyExpression<T>(Latitude));
  23. grid.HiddenColumns.Add(CoreUtils.GetPropertyExpression<T>(Longitude));
  24. grid.HiddenColumns.Add(CoreUtils.GetPropertyExpression<T>(Timestamp));
  25. Property = property;
  26. Image = MapImage;
  27. Action = MapClick;
  28. GetFilter = () => new StaticColumnFilter<bool>(HasLocation, [
  29. new("(Blank)", false),
  30. new("(Not Blank)", true)
  31. ]);
  32. }
  33. public Expression<Func<T, object>> Property { get; }
  34. private bool HasLocation(CoreRow row)
  35. {
  36. var lat = row.Get<double>(Latitude);
  37. var lng = row.Get<double>(Longitude);
  38. return lat != 0.0F && lng != 0.0F;
  39. }
  40. private BitmapImage? MapImage(CoreRow? row)
  41. {
  42. return row is null || HasLocation(row) ? milestone : null;
  43. }
  44. private bool MapClick(CoreRow? row)
  45. {
  46. if (row is not null && HasLocation(row))
  47. {
  48. var form = new MapForm(row.Get<double>(Latitude), row.Get<double>(Longitude), row.Get<DateTime>(Timestamp));
  49. form.ShowDialog();
  50. }
  51. return false;
  52. }
  53. }
  54. }