public void AddTriggerThenManyOnNextOneAdd() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); using var trigger = new Subject <object?>(); using var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger); using var actual = view.SubscribeAll(); source.Add(4); for (var i = 0; i < 10; i++) { trigger.OnNext(null); } CollectionAssert.IsEmpty(actual); CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view); scheduler.Start(); var expected = new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, Diff.CreateAddEventArgs(4, 3), }; CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); CollectionAssert.AreEqual(new[] { 1, 2, 3, 4 }, view); }
public void ManyOnNextsOneReset() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); using (var trigger = new Subject <object>()) { using (var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger)) { using (var actual = view.SubscribeAll()) { source.Clear(); for (var i = 0; i < 10; i++) { trigger.OnNext(null); } CollectionAssert.IsEmpty(actual); CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view); scheduler.Start(); var expected = new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset }; CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); CollectionAssert.IsEmpty(view); } } } }
public void Repro1() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); var max = 5; using (var trigger = new Subject <object>()) { // ReSharper disable once AccessToModifiedClosure using (var view = new FilteredView <int>(source, x => x < max, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger)) { using (var actual = view.SubscribeAll()) { CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view); CollectionAssert.IsEmpty(actual); max = 2; trigger.OnNext(null); scheduler.Start(); var expected = new List <EventArgs> { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }; CollectionAssert.AreEqual(new[] { 1 }, view); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); for (var i = 0; i < 10; i++) { source.Add(i); } scheduler.Start(); CollectionAssert.AreEqual(new[] { 1, 0, 1 }, view); expected.AddRange(new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); source.Clear(); scheduler.Start(); CollectionAssert.IsEmpty(view); expected.AddRange(new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); } } } }
codePane.CodeAreaHeight - codePane.Cursor.Row >= VerticalPaddingHeight + configuration.MinCompletionItemsCount; // offset + top border + MinCompletionItemsCount + bottom border async Task IKeyPressHandler.OnKeyUp(KeyPress key, CancellationToken cancellationToken) { if (!EnoughRoomToDisplay(codePane)) { return; } bool wasAlreadyOpen = IsOpen; if (!IsOpen) { if (!char.IsControl(key.ConsoleKeyInfo.KeyChar) && !completionListTriggeredOnKeyDown && await promptCallbacks.ShouldOpenCompletionWindowAsync(codePane.Document.GetText(), codePane.Document.Caret, key, cancellationToken).ConfigureAwait(false)) { Open(); } } if (IsOpen) { var documentText = codePane.Document.GetText(); int documentCaret = codePane.Document.Caret; var spanToReplace = await promptCallbacks.GetSpanToReplaceByCompletionkAsync(documentText, documentCaret, cancellationToken).ConfigureAwait(false); if (wasAlreadyOpen && lastSpanToReplaceOnKeyDown.TryGet(out var spanToReplaceOld)) { if (spanToReplace.Start != spanToReplaceOld.Start && spanToReplace.End != spanToReplaceOld.End) { Close(); return; } } if (allCompletions.Count == 0) { var completions = await promptCallbacks.GetCompletionItemsAsync(documentText, documentCaret, spanToReplace, cancellationToken).ConfigureAwait(false); if (completions.Any()) { allCompletions = completions; if (completions.Any()) { int height = Math.Min(codePane.CodeAreaHeight - VerticalPaddingHeight, configuration.MaxCompletionItemsCount); FilteredView.UpdateItems(completions, documentText, documentCaret, spanToReplace, height); } } else { Close(); } } else if (!key.Handled) { FilteredView.Match(documentText, documentCaret, spanToReplace); } } }
private void UpdateViewFilter() { using (FilteredView.DeferRefresh()) { if (string.IsNullOrEmpty(FilterValue) || Mode == BuiltInGridMode.SameCar || Mode == BuiltInGridMode.Custom) { FilteredView.Filter = null; } else { var filter = StringBasedFilter.Filter.Create(CarObjectTester.Instance, FilterValue); FilteredView.Filter = o => filter.Test(((RaceGridEntry)o).Car); } } }
public void Clear() { var source = new ObservableCollection <int> { 1, 2, 3 }; using var expected = source.SubscribeAll(); var scheduler = new TestScheduler(); using var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true); using var actual = view.SubscribeAll(); source.Clear(); CollectionAssert.IsEmpty(actual); scheduler.Start(); CollectionAssert.AreEqual(source, view); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); }
public async Task BindItemsSource() { var listBox = new ListBox(); var source = new ObservableCollection <int> { 1, 2, 3 }; using (var view = new FilteredView <int>(source, x => x == 2, TimeSpan.Zero, WpfSchedulers.Dispatcher, leaveOpen: true, triggers: new Subject <object>())) { var binding = new Binding { Source = view, }; BindingOperations.SetBinding(listBox, ItemsControl.ItemsSourceProperty, binding); view.Refresh(); await Application.Current.Dispatcher.SimulateYield(); CollectionAssert.AreEqual(new[] { 2 }, listBox.Items); // Filtered } }
public void UpdatesAndNotifiesOnCollectionChanged() { var ints = new ObservableCollection <int> { 1, 2, 3 }; using (var expected = ints.SubscribeAll()) { var scheduler = new TestScheduler(); using (var view = new FilteredView <int>(ints, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true)) { using (var actual = view.SubscribeAll()) { ints.Add(4); CollectionAssert.IsEmpty(actual); scheduler.Start(); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); } } } }
public void Test_Construction() { SoftwareSystem softwareSystem = Model.AddSoftwareSystem("Name", "Description"); SystemContextView systemContextView = Views.CreateSystemContextView(softwareSystem, "SystemContext", "Description"); FilteredView filteredView = Views.CreateFilteredView( systemContextView, "CurrentStateSystemContext", "The system context as-is.", FilterMode.Exclude, "v2", "v3" ); Assert.Equal("CurrentStateSystemContext", filteredView.Key); Assert.Equal("SystemContext", filteredView.BaseViewKey); Assert.Same(systemContextView, filteredView.View); Assert.Equal("The system context as-is.", filteredView.Description); Assert.Equal(FilterMode.Exclude, filteredView.Mode); Assert.Equal(2, filteredView.Tags.Count); Assert.True(filteredView.Tags.Contains("v2")); Assert.True(filteredView.Tags.Contains("v3")); }
public void Repro3() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); var max = 5; using var trigger = new Subject <object?>(); //// ReSharper disable once AccessToModifiedClosure using var view = new FilteredView <int>(source, x => x < max, TimeSpan.Zero, scheduler, leaveOpen: true, triggers: trigger); using var actual = view.SubscribeAll(); CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view); CollectionAssert.IsEmpty(actual); max = 2; trigger.OnNext(null); scheduler.Start(); var expected = new List <EventArgs> { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }; CollectionAssert.AreEqual(new[] { 1 }, view); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); source.Clear(); view.Refresh(); scheduler.Start(); CollectionAssert.IsEmpty(view); expected.AddRange(new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, Diff.CreateRemoveEventArgs(1, 0), }); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); }
public void Move() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); using var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true); using var actual = view.SubscribeAll(); source.Move(0, 2); CollectionAssert.IsEmpty(actual); scheduler.Start(); CollectionAssert.AreEqual(source, view); var expected = new List <EventArgs> { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }; CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); }
FilteredView GetCommitView(CSVersion excluded) { Debug.Assert(excluded == null || _repoVersions.Versions.Any(t => t.ThisTag == excluded)); if (excluded == null) { if (_default == null) { _default = new FilteredView(this, null); } return(_default); } if (_filtered == null) { _filtered = new Dictionary <CSVersion, FilteredView>(); } else if (_filtered.TryGetValue(excluded, out var view)) { return(view); } var v = new FilteredView(this, excluded); _filtered.Add(excluded, v); return(v); }
private void treeViewDoc_AfterSelect(object sender, TreeViewEventArgs e) { this.CurrentView = e.Node.Tag as FilteredView <DataItemBase>; if (this.CurrentView == null) { return; } // *** DataGridView population *** // SendMessage(this.dataGridViewMain.Handle, WM_SETREDRAW, false, 0); Debug.WriteLine("Suspend layout"); this.dataGridViewMain.Rows.Clear(); Debug.WriteLine("rows cleared"); if (!this.CurrentView.IsInitialized) { this.progressBarMain.Value = 0; this.progressBarMain.Visible = true; var bw = new BackgroundWorker(); bw.WorkerReportsProgress = true; bw.RunWorkerCompleted += (s, e1) => { this.progressBarMain.Visible = false; this.toolStripStatusLabel.Text = "Ready"; this.dataGridViewMain.RowCount = this.CurrentView.TotalCount; bw.Dispose(); }; bw.ProgressChanged += (s, e1) => { if (this.progressBarMain.Value != e1.ProgressPercentage) { this.progressBarMain.Value = e1.ProgressPercentage; this.dataGridViewMain.RowCount = this.CurrentView.TotalCount; this.toolStripStatusLabel.Text = $"Filtering ... {e1.ProgressPercentage}%"; } }; bw.DoWork += (s, e1) => { foreach (int progress in this.CurrentView.Initialize(Settings.Default.Display_Statistics, this.cts.Token)) { bw.ReportProgress(progress); } }; bw.RunWorkerAsync(); this.toolStripStatusLabel.Text = "Filtering ..."; } else { this.dataGridViewMain.RowCount = this.CurrentView.TotalCount; } Debug.WriteLine("Setting scroll index"); if (this.CurrentView.FirstDisplayedScrollingRowIndex.HasValue) { this.dataGridViewMain.FirstDisplayedScrollingRowIndex = this.CurrentView.FirstDisplayedScrollingRowIndex.Value; } // Add rows to DGV here // SendMessage(this.dataGridViewMain.Handle, WM_SETREDRAW, true, 0); this.dataGridViewMain.Refresh(); Debug.WriteLine("Resume layout"); }
public async Task <IList <Game.AiCar> > GenerateGameEntries(CancellationToken cancellation = default(CancellationToken)) { if (IsBusy) { await RebuildGridAsync(); if (cancellation.IsCancellationRequested) { return(null); } } var opponentsNumber = OpponentsNumberLimited; if (FilteredView.Count == 0 || opponentsNumber == 0) { return(new Game.AiCar[0]); } var skins = new Dictionary <string, GoodShuffle <CarSkinObject> >(); foreach (var car in FilteredView.OfType <RaceGridEntry>().Where(x => x.CarSkin == null).Select(x => x.Car).Distinct()) { await car.SkinsManager.EnsureLoadedAsync(); if (cancellation.IsCancellationRequested) { return(null); } skins[car.Id] = GoodShuffle.Get(car.EnabledOnlySkins); } NameNationality[] nameNationalities; if (opponentsNumber == 7 && OptionNfsPorscheNames) { nameNationalities = new[] { new NameNationality { Name = "Dylan", Nationality = "Wales" }, new NameNationality { Name = "Parise", Nationality = "Italy" }, new NameNationality { Name = "Steele", Nationality = "United States" }, new NameNationality { Name = "Wingnut", Nationality = "England" }, new NameNationality { Name = "Leadfoot", Nationality = "Australia" }, new NameNationality { Name = "Amazon", Nationality = "United States" }, new NameNationality { Name = "Backlash", Nationality = "United States" } }; } else if (DataProvider.Instance.NationalitiesAndNames.Any()) { nameNationalities = GoodShuffle.Get(DataProvider.Instance.NationalitiesAndNamesList).Take(opponentsNumber).ToArray(); } else { nameNationalities = null; } List <int> aiLevels; if (AiLevelFixed) { aiLevels = null; } else { var aiLevelsInner = from i in Enumerable.Range(0, opponentsNumber) select AiLevelMin + ((opponentsNumber < 2 ? 1d : 1d - i / (opponentsNumber - 1d)) * (AiLevel - AiLevelMin)).RoundToInt(); if (AiLevelArrangeReverse) { aiLevelsInner = aiLevelsInner.Reverse(); } if (Equals(AiLevelArrangeRandom, 1d)) { aiLevelsInner = GoodShuffle.Get(aiLevelsInner); } else if (AiLevelArrangeRandom > 0d) { aiLevelsInner = LimitedShuffle.Get(aiLevelsInner, AiLevelArrangeRandom); } aiLevels = aiLevelsInner.Take(opponentsNumber).ToList(); Logging.Debug("AI levels: " + aiLevels.Select(x => $@"{x}%").JoinToString(@", ")); } IEnumerable <RaceGridEntry> final; if (Mode.CandidatesMode) { var list = FilteredView.OfType <RaceGridEntry>().SelectMany(x => new[] { x }.Repeat(x.CandidatePriority)).ToList(); if (ShuffleCandidates) { var shuffled = GoodShuffle.Get(list); if (_playerCar != null) { var same = list.FirstOrDefault(x => x.Car == _playerCar); if (same != null) { shuffled.IgnoreOnce(same); } } final = shuffled.Take(opponentsNumber); } else { var skip = _playerCar; final = LinqExtension.RangeFrom().Select(x => list.RandomElement()).Where(x => { if (x.Car == skip) { skip = null; return(false); } return(true); }).Take(opponentsNumber); } } else { final = NonfilteredList.Where(x => !x.SpecialEntry); } if (_playerCar != null) { skins.GetValueOrDefault(_playerCar.Id)?.IgnoreOnce(_playerCar.SelectedSkin); } var takenNames = new List <string>(opponentsNumber); return(final.Take(opponentsNumber).Select((entry, i) => { var level = entry.AiLevel ?? aiLevels?[i] ?? 100; var skin = entry.CarSkin; if (skin == null) { skin = skins.GetValueOrDefault(entry.Car.Id)?.Next; } var name = entry.Name; if (string.IsNullOrWhiteSpace(name) && SettingsHolder.Drive.QuickDriveUseSkinNames) { var skinDriverNames = skin?.DriverName?.Split(',').Select(x => x.Trim()).Where(x => x.Length > 0).ToList(); if (skinDriverNames?.Count > 0) { name = GoodShuffle.Get(skinDriverNames).Take(skinDriverNames.Count).FirstOrDefault(x => !takenNames.Contains(x)) ?? name; takenNames.Add(name); } } if (string.IsNullOrWhiteSpace(name)) { name = nameNationalities?[i].Name ?? @"AI #" + i; takenNames.Add(name); } var nationality = entry.Nationality ?? nameNationalities?[i].Nationality ?? @"Italy"; var skinId = skin?.Id; return new Game.AiCar { AiLevel = level, CarId = entry.Car.Id, DriverName = AiLevelInDriverName ? $@"{name} ({level}%)" : name, Nationality = nationality, Setup = "", SkinId = skinId }; }).ToList()); }