コード例 #1
0
ファイル: RealizedItems.cs プロジェクト: pdmartin101/Avalonia
        private int GetNumInView(double scrollPos)
        {
            var last = (int)scrollPos;

            RemoveOld();
            if (RealizedIndex.TryGetValue((int)scrollPos, out var first))
            {
                var firstLocation = first.RelativeOffset;
                foreach (var item in RealizedIndex)
                {
                    var offset = item.Value.RelativeOffset - firstLocation;
                    var res    = item.Value.Container.ContainerControl.TranslatePoint(new Point(0, 0), _panel);
                    if ((offset <= _scrollContentPresenter.DesiredSize.Height) && (last < item.Key))// Panel.DesiredSize.Height)
                    {
                        if (offset + item.Value.Container.ContainerControl.DesiredSize.Height <= _scrollContentPresenter.DesiredSize.Height)
                        {
                            last = item.Key;
                        }
                        else
                        {
                            last = item.Key - 1;
                        }
                    }
                }
            }
            PdmLogger.Log(3, PdmLogger.IndentEnum.Nothing, $"LastInView02 {scrollPos} {last}");
            return(last + 1 - (int)scrollPos);
        }
コード例 #2
0
        /// <inheritdoc/>
        protected override IControl CreateContainer(object item)
        {
            var container = item as GroupItem;

            if (container != null)
            {
                return(container);
            }
            else
            {
                var itemsControl = Owner as ItemsControl;
                var presenter    = itemsControl.Presenter as ItemsPresenter;
                var result       = new GroupItem(itemsControl, (GroupingViewInternal)item);
                PdmLogger.Log(4, PdmLogger.IndentEnum.Nothing, $"Create GroupItem {result.Id}  from {Id} with {item}");
                result.SetValue(GroupItem.TemplatedParentProperty, Owner, BindingPriority.TemplatedParent);
//                result.GroupControl = _groupControl;
                result.SetValue(GroupItem.ItemsPanelProperty, itemsControl.ItemsPanel);
                result.ItemTemplate = itemsControl?.ItemTemplate;
                if (presenter != null)
                {
                    result.VirtualizationMode = presenter.VirtualizationMode;
                    result.VirtualizingCache  = presenter.VirtualizingCache;
                }
                if (!(item is IControl))
                {
                    result.DataContext = item;
                }

                return(result);
            }
        }
コード例 #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GroupContainerGenerator"/> class.
 /// </summary>
 /// <param name="owner">The immediate owner of the control.</param>
 public GroupContainerGenerator(ItemsControl owner)
     : base(owner)
 {
     Contract.Requires <ArgumentNullException>(owner != null);
     //            _groupControl = new GroupController() { TemplatedParent = owner };
     PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"Construct GroupContainerGenerator  {Id} {_str}  {++_gcount00}");
 }
コード例 #4
0
        private void CreateContainers()
        {
            var generator = Owner.ItemContainerGenerator;

            if (Owner.Bounds.Size.IsDefault)
            {
                if ((Items.Count() > 0) && !_estimated)
                {
                    PdmLogger.Log(0, PdmLogger.IndentEnum.In, $"Estimate {Id} Items:{Items} ");
                    var materialized = generator.Materialize(0, Items.ElementAt(0));
                    VirtualizingPanel.Children.Insert(0, materialized.ContainerControl);
                    materialized.ContainerControl.Measure(Size.Infinity);
                    VirtualizingAverages.AddContainerSize(GroupControl.TemplatedParent, Items.ElementAt(0), materialized.ContainerControl);
                    //VirtualizingPanel.Children.RemoveAt(0);
                    //generator.Dematerialize(0, 1);
                    //ItemsPresenter.InvalidateMeasure();
                    _estimated = true;
                    PdmLogger.Log(1, PdmLogger.IndentEnum.Out, $"Estimated {Id} Items:{Items} ");
                }
            }
            else if (Items != null && VirtualizingPanel.IsAttachedToVisualTree)
            {
                _realizedChildren.AddChildren();
            }
            _estimatedSize = VirtualizingAverages.GetEstimatedExtent(GroupControl.TemplatedParent, Items, Vertical);
        }
コード例 #5
0
 public ItemVirtualizerSmooth(ItemsPresenter owner)
     : base(owner)
 {
     Id = _idCount++;
     _realizedChildren = new RealizedItems(Owner, GroupControl, Id);
     PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"Constructing {Id}, {Items} {++_gcount}");
 }
コード例 #6
0
ファイル: RealizedItems.cs プロジェクト: pdmartin101/Avalonia
        internal double AddOneChild(RealizedItemsInfo info)
        {
            var child = _generator.ContainerFromIndex(_info.Next);

            if (child == null)
            {
                var materialized = _generator.Materialize(_info.Next, _items.ElementAt(_info.Next));
                child = materialized.ContainerControl;
                _panel.Children.Add(child);
                child.Measure(Size.Infinity);
                PdmLogger.Log(2, PdmLogger.IndentEnum.Nothing, $"Add new Item {child.DataContext} to {this} {_info._currentOffset:0.00}");
                if (VirtualizingAverages.AddContainerSize(_groupControl.TemplatedParent, _items.ElementAt(_info.Next), child))
                {
                    _owner.InvalidateMeasure();
                }
            }
            else
            {
                if (child is GroupItem gi)
                {
                    gi.Presenter?.InvalidateMeasure();
                }
                if (_id == 402)
                {
                }
                child.Measure(Size.Infinity);
                PdmLogger.Log(2, PdmLogger.IndentEnum.Nothing, $"Add old Item {child.DataContext} to {this} {_info._currentOffset:0.00}");
                if (VirtualizingAverages.AddContainerSize(_groupControl.TemplatedParent, _items.ElementAt(_info.Next), child))
                {
                    _owner.InvalidateMeasure();
                }
            }
            return(_info.Vert ? child.DesiredSize.Height : child.DesiredSize.Width);
        }
コード例 #7
0
ファイル: RealizedItems.cs プロジェクト: pdmartin101/Avalonia
        public void RemoveChildren()
        {
            var toRemove = new List <ItemContainerInfo>();

            foreach (var item in _generator.Containers)
            {
                if (_info.CheckForRemoval(item.Index))
                {
                    toRemove.Add(item);
                }
            }
            if (toRemove.Count != 0)
            {
                PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"RemoveChildren {this}  Info {_info} {toRemove.Count}");
            }
            foreach (var toRem in toRemove)
            {
                foreach (var container in _generator.Dematerialize(toRem.Index, 1))
                {
                    PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"Remove Child {container.ContainerControl}");
                    _panel.Children.Remove(container.ContainerControl);
                    _groupControl.RemoveItem(container.ContainerControl);
                }
                //                _groupControl.RemoveGroup(toRem.Item);
            }
        }
コード例 #8
0
        public ItemVirtualizerLogical(ItemsPresenter owner)
            : base(owner)
        {
            Id = _idCount++;
            _realizedChildren       = new RealizedItems(Owner, GroupControl, Id);
            _scrollContentPresenter = Owner.FindAncestorOfType <ScrollContentPresenter>();

            PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"Constructing {Id}, {Items} {++_gcount}");
        }
コード例 #9
0
ファイル: GroupItem.cs プロジェクト: pdmartin101/Avalonia
 public GroupItem(ItemsControl itemsControl, IGroupingView items)
 {
     if (itemsControl is GroupItem gi)
     {
         Level = gi.Level + 1;
     }
     Name  = $"Level{Level,2:00}";
     Id    = _idCount++;
     Items = items;
     PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"Construct GroupItem   {Id} {Items} {++_gcount}");
 }
コード例 #10
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ItemContainerGenerator"/> class.
        /// </summary>
        /// <param name="owner">The owner control.</param>
        public ItemContainerGenerator(IControl owner)
        {
            Contract.Requires <ArgumentNullException>(owner != null);

            Owner = owner;
            Id    = _count++;
            if (Owner is ItemsControl ic)
            {
                _str = $"{ic.Items}";
            }
            PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"Construct ItemContainerGenerator  {Id} {_str}  {++_gcount}");
        }
コード例 #11
0
 /// <inheritdoc/>
 public override void ItemsChanged(IEnumerable items, NotifyCollectionChangedEventArgs e)
 {
     PdmLogger.Log(2, PdmLogger.IndentEnum.Nothing, $"ItemsChanged {Id} Current Items {Items}   New Items {items} ");
     base.ItemsChanged(items, e);
     if (e.Action != NotifyCollectionChangedAction.Add)
     {
         ItemContainerSync.ItemsChanged(Owner, null, e);
     }
     else
     {
         Owner.InvalidateMeasure();
     }
 }
コード例 #12
0
 /// <inheritdoc/>
 public override Size MeasureOverride(Size availableSize)
 {
     PdmLogger.Log(0, PdmLogger.IndentEnum.In, $"Measure Realized {_realizedChildren}  {availableSize}  {++_measureCount}  {!Owner.Bounds.Size.IsDefault}");
     UpdateControls();
     if (!_scrollViewer.Bounds.Size.IsDefault)
     {
         _realizedChildren.RemoveChildren();
     }
     PdmLogger.Log(1, PdmLogger.IndentEnum.Out, $"Measured Realized {_realizedChildren}  {_estimatedSize}  {_measureCount}  {!Owner.Bounds.Size.IsDefault}");
     if (VirtualizingPanel.ScrollDirection == Layout.Orientation.Vertical)
     {
         return(_estimatedSize);
     }
     return(_estimatedSize);
 }
コード例 #13
0
ファイル: RealizedItems.cs プロジェクト: pdmartin101/Avalonia
        public void AddChildren()
        {
            //            _groupControl.RemoveGroup(_items);
            var numItems = _items.Count();

            _info.SetPanelRelative(-_panel.TranslatePoint(new Point(0, 0), _scrollViewer).Value, _scrollViewer.Bounds.Size);
            _info.SetFirst(_scrollViewer.Offset);
            PdmLogger.Log(3, PdmLogger.IndentEnum.Nothing, $"BeforeAdd {this} {_info}");
            while (_info.RealizeNeeded(numItems))
            {
                _info.AddOffset(AddOneChild(_info));
                PdmLogger.Log(3, PdmLogger.IndentEnum.Nothing, $"Add Item {this} {_info}");
            }
            PdmLogger.Log(2, PdmLogger.IndentEnum.Nothing, $"AddChildren Realized {this} Info {_info}  Scroller Height {_scrollViewer.Bounds.Height:0.00}");
            //            _groupControl.AddGroup(_info, _items, _generator);
        }
コード例 #14
0
ファイル: RealizedItems.cs プロジェクト: pdmartin101/Avalonia
        private void RemoveOld()
        {
//            PdmLogger.Log(3, PdmLogger.IndentEnum.Nothing, $"Rem Group");
            var toRemove = new List <int>();

            foreach (var item in RealizedIndex)
            {
                if ((item.Value.Container == null) || (item.Value.Container.ContainerControl.Parent == null))
                {
                    toRemove.Add(item.Key);
                }
            }
            foreach (var item in toRemove)
            {
                PdmLogger.Log(3, PdmLogger.IndentEnum.Nothing, $"Rem Item02 {RealizedIndex[item].Container.ContainerControl.DataContext}");

                RealizedIndex.Remove(item);
            }
        }
コード例 #15
0
ファイル: RealizedItems.cs プロジェクト: pdmartin101/Avalonia
        public void RemoveItem(IControl control)
        {
            PdmLogger.Log(3, PdmLogger.IndentEnum.Nothing, $"Rem Item");
            var toRemove = new List <int>();

            foreach (var item in RealizedIndex)
            {
                if (item.Value.Container.ContainerControl == control)
                {
                    toRemove.Add(item.Key);
                }
            }
            foreach (var item in toRemove)
            {
                PdmLogger.Log(3, PdmLogger.IndentEnum.Nothing, $"Rem Item00 {RealizedIndex[item].Container.ContainerControl.DataContext}");

                RealizedIndex.Remove(item);
            }
        }
コード例 #16
0
 public override Size ArrangeOverride(Size finalSize)
 {
     PdmLogger.Log(0, PdmLogger.IndentEnum.In, $"Arrange Realized {_realizedChildren}  {finalSize}  {++_overrideCount}  {Owner.Bounds}");
     foreach (var container in _realizedChildren)
     {
         var control     = container.ContainerControl;
         var startOffset = VirtualizingAverages.GetOffsetForIndex(GroupControl.TemplatedParent, container.Index, Items, Vertical);
         if (Vertical)
         {
             control.Arrange(new Rect(new Point(0, startOffset), new Size(finalSize.Width, control.DesiredSize.Height)));
         }
         else
         {
             control.Arrange(new Rect(new Point(startOffset, 0), new Size(control.DesiredSize.Width, finalSize.Height)));
         }
     }
     Owner.Panel.Arrange(new Rect(finalSize));
     PdmLogger.Log(1, PdmLogger.IndentEnum.Out, $"Arranged Realized {_realizedChildren}  {finalSize}  {_overrideCount}  {Owner.Bounds}");
     return(finalSize);
 }
コード例 #17
0
ファイル: RealizedItems.cs プロジェクト: pdmartin101/Avalonia
        internal void RemoveItems(IItemContainerGenerator itemContainerGenerator)
        {
            var toRemove = new List <int>();

            foreach (var container in itemContainerGenerator.Containers)
            {
                foreach (var item in RealizedIndex)
                {
                    if (item.Value.Container == container)
                    {
                        toRemove.Add(item.Key);
                    }
                }
            }
            foreach (var item in toRemove)
            {
                PdmLogger.Log(3, PdmLogger.IndentEnum.Nothing, $"Rem Item01 {RealizedIndex[item].Container.ContainerControl.DataContext}");

                RealizedIndex.Remove(item);
            }
        }
コード例 #18
0
 public ItemsPresenter()
 {
     Id = _idCount++;
     PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"Constructing ItemsPresenter, {Id} {Items} {++_gcount}");
 }
コード例 #19
0
 public ListBoxItem()
 {
     Id = _idCount++;
     PdmLogger.Log(30, PdmLogger.IndentEnum.Nothing, $"Constructing ListBoxItem, {Id}  {++_gcount}");
 }