NavSearchViewModel.cs 6.2 KB

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