internal SortedComicView( ComicView trackChangesFrom, IEnumerable <Comic> comics, ComicSortSelector sortSelector ) : this(trackChangesFrom, comicAccessor : new Dictionary <string, Comic>(), sortedComics : new List <Comic>(), sortSelector) { foreach (var comic in comics) { this.Instance_AddComic(comic); } }
/// <summary> /// A convenience constructor, for a pre-populated comicAccessor field /// </summary> private SortedComicView( ComicView trackChangesFrom, Dictionary <string, Comic> comicAccessor, List <Comic> sortedComics, ComicSortSelector sortSelector ) : base(trackChangesFrom) { this.comicAccessor = comicAccessor; this.sortedComics = sortedComics; this.sortSelector = sortSelector; }
public ComicPropertiesCollectionView(ComicView parent, Func <Comic, IEnumerable <string> > getProperties) { this.parent = parent; this.getProperties = getProperties; // note: because this.Properties[...].Comics are created after this, ViewChanged gets called for them // after it gets called for this. We have to monitor ComicsChanged for this. parent.ViewChanged += this.ParentComicView_ViewChanged; parent.ComicsChanged += this.ParentComicView_ComicsChanged; this.InitializeProperties(); }
private protected override void ParentComicView_ViewChanged(ComicView sender, ViewChangedEventArgs e) { switch (e.Type) // switch ChangeType { case ComicChangeType.ItemsChanged: this.RemoveComics(e.Remove); this.AddComics(e.Add); break; case ComicChangeType.Refresh: this.RefreshComics(sender); break; case ComicChangeType.ThumbnailChanged: // do nothing; propagate break; default: throw new ProgrammerError($"{nameof(MutableComicView)}.{nameof(this.ParentComicView_ViewChanged)}: unhandled switch case"); } this.OnComicChanged(e); }
private protected virtual void ParentComicView_ViewChanged(ComicView sender, ViewChangedEventArgs e) { this.OnComicChanged(e); }
private void ParentComicView_ComicsChanged(ComicView sender, ComicsChangedEventArgs __) { if (this.lastChange is not { } e) { return; } switch (e.Type) { case ComicChangeType.ItemsChanged: // here we get a list of added/removed/modified comics, and we need to create a list of // added/removed/modified properties. // note: we can do some proper deduction in terms of which properties are added/removed/modified, // but we're keeping it simple for now: basically, modified = removed + added var tryAddProperties = e.Add.SelectMany(this.getProperties); var tryRemoveProperties = e.Remove.SelectMany(this.getProperties); var addedProperties = new HashSet <string>(); var removedProperties = new HashSet <string>(); foreach (var property in tryRemoveProperties) { if (this.Properties.Contains(property)) { var propertyView = this.Properties.Remove(property); _ = removedProperties.Add(property); if (propertyView.Comics.Any()) { this.Properties.Add(propertyView); _ = addedProperties.Add(property); } } } foreach (var property in tryAddProperties) { if (this.Properties.Contains(property)) { _ = removedProperties.Add(property); } else { var view = this.parent.Filtered(comic => getProperties(comic).Contains(property)); this.Properties.Add(new ComicCollection(property, view)); } _ = addedProperties.Add(property); } this.OnCollectionsChanged(new(CollectionsChangeType.ItemsChanged, addedProperties, removedProperties)); break; case ComicChangeType.ThumbnailChanged: break; case ComicChangeType.Refresh: this.Properties.Clear(); this.ReinitializeProperties(); break; default: throw new ProgrammerError("unhandled switch case"); } }
private void ParentComicView_ViewChanged(ComicView sender, ComicView.ViewChangedEventArgs e) { this.lastChange = e; }