using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Reactive; using System.Reactive.Linq; using qmonlib.ui.Models.General; using qmonlib.ui.Models.QMonitor; using Quadarax.Foundation.Core.QMonitor; using Quadarax.Foundation.Core.Value; using Quadarax.Foundation.Core.Value.Extensions; using ReactiveUI; namespace qmonlib.ui.ViewModels.Navigator { public class NavSearchViewModel : ReceiverViewModelBase { #region *** Private Fields *** private readonly ObservableCollection _allData; private readonly ConcurrentDictionary _instancesCache = new ConcurrentDictionary(); private string? _searchText; #endregion #region *** Commands *** public ReactiveCommand CmdOpenChannel { get; } private void OnCmdOpenChannel(MonItemGeneralModel item) { throw new NotImplementedException(); } #endregion /// /// Filter pattern expression /// public string? SearchText { get => _searchText; set => this.RaiseAndSetIfChanged(ref _searchText, value); } /// /// List of general metadata (filtered by ) /// public ObservableCollection DataFiltered { get { var instances = DataInstances; var dataInstances = _allData.Where(x => instances.Any(y => string.Equals(y.Name, x.InstanceIdentifier, StringComparison.InvariantCultureIgnoreCase) && y.IsChecked)); Debug.WriteLine($"*DataFiltered.dataInstances cnt = {dataInstances.Count()}"); var result = new ObservableCollection( dataInstances.SelectMany(x => x.Items).Where(x => x.Name.Like(SearchText)).Select(x => new MonItemGeneralModel(x)) ); Debug.WriteLine($"*DataFiltered cnt = {result.Count}"); return result; } set => throw new NotSupportedException(); } /// /// List of general metadata source instances /// public ObservableCollection DataInstances { get { var newInstances = _allData.Select(x => x.InstanceIdentifier).Distinct().Select(x => new CheckBoxListItemModel(x)); foreach (var newInstance in newInstances) { if (_instancesCache.ContainsKey(newInstance.Name)) continue; _instancesCache.TryAdd(newInstance.Name, newInstance); } return new ObservableCollection(_instancesCache.Select(x=>x.Value)); } set => throw new NotSupportedException(); } public int DataInstancesCount { get => DataInstances.Count; set => throw new NotSupportedException(); } public int DataInstancesSelectedCount { get => DataInstances.Count(x => x.IsChecked); set => throw new NotSupportedException(); } /// /// Count of general metadata total count (not filtered) /// public int DataTotalCount { get => _allData.SelectMany(x=>x.Items).Count(); set => throw new NotSupportedException(); } /// /// Count of general metadata filtered count (what returns in /// public int DataFilteredCount { get => DataFiltered.Count; set => throw new NotSupportedException(); } public NavSearchViewModel() { // Commands binding CmdOpenChannel = ReactiveCommand.Create(OnCmdOpenChannel); _allData = new ObservableCollection(); // refresh handling subscriptions // SearchText this.WhenAnyValue(o => o.SearchText) .Subscribe(o => this.RaisePropertyChanged(nameof(DataFiltered))); this.WhenAnyValue(o => o.DataFiltered) .Subscribe(o => this.RaisePropertyChanged(nameof(DataFilteredCount))); // DataInstances this.WhenAnyValue(o => o.DataInstances) .Subscribe(o => this.RaisePropertyChanged(nameof(DataFiltered))); #if MOCKED var gen1 = new MonGeneral() { InstanceIdentifier = "inst1", }; gen1.Items.Add(new MonItemGeneralModel() { Name = "Fee.Foo.Item1", Caption = "this is item1", ViewType = MonItemGeneral.MonViewType.Item }); gen1.Items.Add(new MonItemGeneralModel() { Name = "Fee.Foo.Item2", Caption = "this is item2", ViewType = MonItemGeneral.MonViewType.List }); gen1.Items.Add(new MonItemGeneralModel() { Name = "Fee.Foo.Item3", Caption = "this is item3", ViewType = MonItemGeneral.MonViewType.Item }); var gen2 = new MonGeneral() { InstanceIdentifier = "inst2", }; gen2.Items.Add(new MonItemGeneralModel() { Name = "Fee.Frr.Item1", Caption = "this is item1", ViewType = MonItemGeneral.MonViewType.Item }); gen2.Items.Add(new MonItemGeneralModel() { Name = "Fee.Frr.Item2", Caption = "this is item2", ViewType = MonItemGeneral.MonViewType.Item }); gen2.Items.Add(new MonItemGeneralModel() { Name = "Fee.Frr.Item3", Caption = "this is item3", ViewType = MonItemGeneral.MonViewType.Item }); _allData.Add(gen1); _allData.Add(gen2); #endif } } }