Example #1
0
 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);
     }
 }
Example #2
0
 /// <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;
 }
Example #3
0
        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();
        }
Example #4
0
        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);
        }
Example #5
0
 private protected virtual void ParentComicView_ViewChanged(ComicView sender, ViewChangedEventArgs e)
 {
     this.OnComicChanged(e);
 }
Example #6
0
        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");
            }
        }
Example #7
0
 private void ParentComicView_ViewChanged(ComicView sender, ComicView.ViewChangedEventArgs e)
 {
     this.lastChange = e;
 }