public RelationSignatureViewModel(TreeViewModelBase parent, RelationSignatureInfo model) : base(parent) { this.Model = model; this.Name = model.ObserveProperty(n => n.Signature).Select(n => n.ToString()).ToReactiveProperty().AddTo(_disposable); this.IsSelected = new ReactiveProperty <bool>().AddTo(_disposable); this.IsExpanded = new ReactiveProperty <bool>(true).AddTo(_disposable); this.Children = model.Children.ToReadOnlyReactiveCollection(n => new RelationSignatureViewModel(this, n)).AddTo(_disposable); }
private RelationSignatureInfo GetRelationSignatureInfo(Signature leaderSignature) { var infos = new List <RelationSignatureInfo>(); var workInfos = new List <RelationSignatureInfo>(); var checkedSignatures = new HashSet <Signature>(); var workCheckedSignatures = new HashSet <Signature>(); { _cacheProfiles.TryGetValue(leaderSignature, out var leaderProfile); var info = new RelationSignatureInfo(); info.Signature = leaderSignature; info.Profile = leaderProfile; infos.Add(info); checkedSignatures.Add(leaderSignature); } { int index = 0; for (; ;) { for (; index < infos.Count && index < 32 * 1024; index++) { var targetInfo = infos[index]; if (targetInfo.Profile == null) { continue; } var sortedList = targetInfo.Profile.Value.TrustSignatures.ToList(); sortedList.Sort((x, y) => x.ToString().CompareTo(y.ToString())); foreach (var trustSignature in sortedList) { if (checkedSignatures.Contains(trustSignature)) { continue; } _cacheProfiles.TryGetValue(trustSignature, out var trustProfile); var info = new RelationSignatureInfo(); info.Signature = trustSignature; info.Profile = trustProfile; infos[index].Children.Add(info); workInfos.Add(info); workCheckedSignatures.Add(trustSignature); } } if (workInfos.Count == 0) { break; } infos.AddRange(workInfos); workInfos.Clear(); checkedSignatures.UnionWith(workCheckedSignatures); workCheckedSignatures.Clear(); } } return(infos[0]); }