Cocoa/ListView: get accurate visibleItems

NSCollectionView.visibleItems() returns the items that have been displayed.
This commit is contained in:
rich2014 2024-07-14 21:53:02 +08:00
parent 6715cb64ed
commit b6561e4316
2 changed files with 20 additions and 3 deletions

View File

@ -95,6 +95,7 @@ type
function AllocCocoaCollectionView: TCocoaCollectionView;
function indexPathsWithOneIndex( cv: NSCollectionView; AIndex: Integer ): NSSet;
function realVisibleItems( cv: NSCollectionView ): NSArray;
implementation
@ -131,6 +132,22 @@ begin
Result:= NSSet.setWithObject( indexPath );
end;
// get the Real Visible Items.
// NSCollectionView returns the items that have been displayed.
function realVisibleItems( cv: NSCollectionView ): NSArray;
var
visibleRect: NSRect;
item: NSCollectionViewItem;
items: NSMutableArray Absolute Result;
begin
Result:= NSMutableArray.new;
visibleRect:= cv.visibleRect;
for item in cv.visibleItems do begin
if NSIntersectsRect( item.view.frame, visibleRect ) then
items.addObject( item );
end;
end;
{ TCocoaCollectionItem }
procedure TCocoaCollectionItem.loadView;
@ -247,7 +264,7 @@ procedure TCocoaCollectionView.redrawVisibleItems;
var
item: NSCollectionViewItem;
begin
for item in self.visibleItems do begin
for item in realVisibleItems(self) do begin
item.view.setNeedsDisplay_( True );
end;
end;

View File

@ -1200,7 +1200,7 @@ var
item: NSCollectionViewItem;
begin
Result:= -1;
items:= _collectionView.visibleItems;
items:= CocoaCollectionView.realVisibleItems( _collectionView );
if items.count > 0 then begin
item:= NSCollectionViewItem(items.firstObject);
Result:= _collectionView.indexPathForItem(item).item;
@ -1209,7 +1209,7 @@ end;
function TCocoaWSListView_CollectionViewHandler.GetVisibleRowCount: Integer;
begin
Result:= _collectionView.visibleItems.count;
Result:= CocoaCollectionView.realVisibleItems(_collectionView).count;
end;
procedure TCocoaWSListView_CollectionViewHandler.SelectAll(const AIsSet: Boolean