NavSearchViewModel.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.Diagnostics;
  6. using System.Linq;
  7. using System.Reactive.Linq;
  8. using qmonlib.ui.Models.General;
  9. using Quadarax.Foundation.Core.QMonitor;
  10. using Quadarax.Foundation.Core.Value;
  11. using ReactiveUI;
  12. namespace qmonlib.ui.ViewModels.Navigator
  13. {
  14. public class NavSearchViewModel : ReceiverViewModelBase
  15. {
  16. #region *** Private Fields ***
  17. private readonly ObservableCollection<MonGeneral> _allData;
  18. private readonly ConcurrentDictionary<string,CheckBoxListItem> _instancesCache = new ConcurrentDictionary<string, CheckBoxListItem>();
  19. private readonly IEqualityComparer<string> _eq = new StringPatternComparer();
  20. private string? _searchText;
  21. #endregion
  22. /// <summary>
  23. /// Filter pattern expression
  24. /// </summary>
  25. public string? SearchText
  26. {
  27. get => _searchText;
  28. set => this.RaiseAndSetIfChanged(ref _searchText, value);
  29. }
  30. /// <summary>
  31. /// List of general metadata (filtered by <see cref="SearchText"/>)
  32. /// </summary>
  33. public ObservableCollection<MonItemGeneral> DataFiltered
  34. {
  35. get
  36. {
  37. var instances = DataInstances;
  38. var dataInstances = _allData.Where(x =>
  39. instances.Any(y =>
  40. string.Equals(y.Name, x.InstanceIdentifier, StringComparison.InvariantCultureIgnoreCase) &&
  41. y.IsChecked));
  42. Debug.WriteLine($"*DataFiltered.dataInstances cnt = {dataInstances.Count()}");
  43. var result = new ObservableCollection<MonItemGeneral>(
  44. dataInstances.SelectMany(x => x.Items).Where(x => _eq.Equals(x.Name, SearchText))
  45. );
  46. Debug.WriteLine($"*DataFiltered cnt = {result.Count}");
  47. return result;
  48. }
  49. set => throw new NotSupportedException();
  50. }
  51. /// <summary>
  52. /// List of general metadata source instances
  53. /// </summary>
  54. public ObservableCollection<CheckBoxListItem> DataInstances
  55. {
  56. get
  57. {
  58. var newInstances = _allData.Select(x => x.InstanceIdentifier).Distinct().Select(x => new CheckBoxListItem(x));
  59. foreach (var newInstance in newInstances)
  60. {
  61. if (_instancesCache.ContainsKey(newInstance.Name))
  62. continue;
  63. _instancesCache.TryAdd(newInstance.Name, newInstance);
  64. }
  65. return new ObservableCollection<CheckBoxListItem>(_instancesCache.Select(x=>x.Value));
  66. }
  67. set => throw new NotSupportedException();
  68. }
  69. public int DataInstancesCount
  70. {
  71. get => DataInstances.Count;
  72. set => throw new NotSupportedException();
  73. }
  74. public int DataInstancesSelectedCount
  75. {
  76. get => DataInstances.Count(x => x.IsChecked);
  77. set => throw new NotSupportedException();
  78. }
  79. /// <summary>
  80. /// Count of general metadata total count (not filtered)
  81. /// </summary>
  82. public int DataTotalCount
  83. {
  84. get => _allData.SelectMany(x=>x.Items).Count();
  85. set => throw new NotSupportedException();
  86. }
  87. /// <summary>
  88. /// Count of general metadata filtered count (what returns in <see cref="DataFiltered"/>
  89. /// </summary>
  90. public int DataFilteredCount
  91. {
  92. get => DataFiltered.Count;
  93. set => throw new NotSupportedException();
  94. }
  95. public NavSearchViewModel()
  96. {
  97. _allData = new ObservableCollection<MonGeneral>();
  98. // refresh handling subscriptions
  99. // SearchText
  100. this.WhenAnyValue(o => o.SearchText)
  101. .Subscribe(o => this.RaisePropertyChanged(nameof(DataFiltered)));
  102. this.WhenAnyValue(o => o.DataFiltered)
  103. .Subscribe(o => this.RaisePropertyChanged(nameof(DataFilteredCount)));
  104. // DataInstances
  105. this.WhenAnyValue(o => o.DataInstances)
  106. .Subscribe(o => this.RaisePropertyChanged(nameof(DataFiltered)));
  107. #if MOCKED
  108. var gen1 = new MonGeneral()
  109. {
  110. InstanceIdentifier = "inst1",
  111. };
  112. gen1.Items.Add(new MonItemGeneral() { Name = "Fee.Foo.Item1", Caption = "this is item1", ViewType = MonItemGeneral.MonViewType.Item });
  113. gen1.Items.Add(new MonItemGeneral() { Name = "Fee.Foo.Item2", Caption = "this is item2", ViewType = MonItemGeneral.MonViewType.List });
  114. gen1.Items.Add(new MonItemGeneral() { Name = "Fee.Foo.Item3", Caption = "this is item3", ViewType = MonItemGeneral.MonViewType.Item });
  115. var gen2 = new MonGeneral()
  116. {
  117. InstanceIdentifier = "inst2",
  118. };
  119. gen2.Items.Add(new MonItemGeneral() { Name = "Fee.Frr.Item1", Caption = "this is item1", ViewType = MonItemGeneral.MonViewType.Item });
  120. gen2.Items.Add(new MonItemGeneral() { Name = "Fee.Frr.Item2", Caption = "this is item2", ViewType = MonItemGeneral.MonViewType.Item });
  121. gen2.Items.Add(new MonItemGeneral() { Name = "Fee.Frr.Item3", Caption = "this is item3", ViewType = MonItemGeneral.MonViewType.Item });
  122. _allData.Add(gen1);
  123. _allData.Add(gen2);
  124. #endif
  125. }
  126. }
  127. }