Skip to content

Commit bdc8d2b

Browse files
committed
updated
1 parent d2d3752 commit bdc8d2b

File tree

3 files changed

+69
-5
lines changed

3 files changed

+69
-5
lines changed

Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ public class OutlineViewDiffableDataSource<ItemIdentifierType: Hashable>: NSObje
498498
return nil
499499
}
500500

501-
/// Returns a preview image of the table row for the specified item.
501+
/// Returns a preview image of the table row for the specified items.
502502
public func previewImage(for item: ItemIdentifierType) -> NSImage? {
503503
let columns = outlineView.tableColumns
504504
guard !columns.isEmpty else { return nil }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//
2+
// NSCollectionViewDiffableDataSource+.swift
3+
//
4+
//
5+
// Created by Florian Zand on 16.03.25.
6+
//
7+
8+
import AppKit
9+
import FZSwiftUtils
10+
11+
extension NSCollectionViewDiffableDataSource {
12+
/// The item provider of the datasource.
13+
public var itemProvider: ItemProvider {
14+
typealias itemProviderBlock = @convention(block) (NSCollectionView, IndexPath, Any) -> NSCollectionViewItem?
15+
guard let object: NSObject = getIvarValue(for: "_impl"), let cellProvider: itemProviderBlock = object.getIvarValue(for: "_collectionViewItemProvider") else { return { _,_,_ in return nil } }
16+
return cellProvider
17+
}
18+
19+
/// Creates a new collection view item for the specified item identifier using the item provider.
20+
public func createItem(for itemIdentifier: ItemIdentifierType) -> NSCollectionViewItem? {
21+
itemProvider(collectionView, IndexPath(item: 0, section: 0), itemIdentifier)
22+
}
23+
24+
/// Returns a preview image of the collection view item for the specified element.
25+
public func previewImage(for item: ItemIdentifierType) -> NSImage? {
26+
_previewImage(for: item, size: nil)
27+
}
28+
29+
/// Returns a preview image of the collection view item for the specified element and item size.
30+
public func previewImage(for item: ItemIdentifierType, size: CGSize) -> NSImage? {
31+
_previewImage(for: item, size: size)
32+
}
33+
34+
private func _previewImage(for item: ItemIdentifierType, size: CGSize? = nil, width: CGFloat? = nil, height: CGFloat? = nil) -> NSImage? {
35+
guard let item = createItem(for: item) else { return nil }
36+
if width != nil || height != nil {
37+
item.view.frame.size = item.view.systemLayoutSizeFitting(width: width, height: height)
38+
item.view.frame.size.width = width ?? item.view.frame.size.width
39+
item.view.frame.size.height = height ?? item.view.frame.size.height
40+
} else {
41+
item.view.frame.size = size ?? collectionView.frameForItem(at: IndexPath(item: 0, section: 0))?.size ?? CGSize(512, 512)
42+
}
43+
return item.view.renderedImage
44+
}
45+
46+
private var collectionView: NSCollectionView {
47+
guard let object: NSObject = getIvarValue(for: "_impl"), let collectionView: NSCollectionView = object.getIvarValue(for: "_nsCollectionView") else { return NSCollectionView() }
48+
return collectionView
49+
}
50+
}

Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+.swift

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,21 +75,35 @@ public extension NSTableViewDiffableDataSource {
7575
}
7676

7777
/// The cell provider of the datasource.
78-
private var cellProvider: ((NSTableView, NSTableColumn, Int, ItemIdentifierType)->(Any)) {
79-
guard let cellProvider: ((NSTableView, NSTableColumn, Int, ItemIdentifierType)->(NSView?)) = getIvarValue(for: "cellProvider") else { return { _,_,_,_ in return NSTableCellView() } }
78+
public var cellProvider: ((NSTableView, NSTableColumn, Int, ItemIdentifierType)->(NSView)) {
79+
typealias CellProviderBlock = @convention(block) (_ tableView: NSTableView, _ tableColumn: NSTableColumn, _ row: Int, _ identifier: Any) -> NSView
80+
guard let cellProvider: CellProviderBlock = getIvarValue(for: "_cellProvider") else { return { _,_,_,_ in return NSTableCellView() } }
8081
return cellProvider
8182
}
8283

83-
private func previewImage(for item: ItemIdentifierType, tableView: NSTableView) -> NSImage? {
84+
/// Creates a new table cell view for the specified item using the cell provider.
85+
public func createCellView(for item: ItemIdentifierType, tableColumn: NSTableColumn? = nil, tableView: NSTableView) -> NSView? {
86+
guard let tableColumn = tableColumn ?? tableView.tableColumns.first, tableView.tableColumns.contains(tableColumn) else { return nil }
87+
return cellProvider(tableView, tableColumn, 0, item)
88+
}
89+
90+
/// Returns a preview image of the table cell for the specified item and table column.
91+
public func previewImage(for item: ItemIdentifierType, tableView: NSTableView) -> NSImage? {
8492
let columns = tableView.tableColumns
8593
guard !columns.isEmpty else { return nil }
8694
return NSImage(combineHorizontal: columns.compactMap({ _previewImage(for: item, tableColumn: $0, tableView: tableView, useColumnWidth: $0 !== columns.last!) }), alignment: .top)
8795
}
8896

89-
private func previewImage(for item: ItemIdentifierType, tableColumn: NSTableColumn, tableView: NSTableView) -> NSImage? {
97+
/// Returns a preview image of the table row for the specified item.
98+
public func previewImage(for item: ItemIdentifierType, tableColumn: NSTableColumn, tableView: NSTableView) -> NSImage? {
9099
_previewImage(for: item, tableColumn: tableColumn, tableView: tableView)
91100
}
92101

102+
/// Returns a preview image of the table rows for the specified items.
103+
public func previewImage(for items: [ItemIdentifierType], tableView: NSTableView) -> NSImage? {
104+
return NSImage(combineVertical: items.compactMap({ previewImage(for: $0, tableView: tableView)}).reversed(), alignment: .left)
105+
}
106+
93107
private func _previewImage(for item: ItemIdentifierType, tableColumn: NSTableColumn, tableView: NSTableView, useColumnWidth: Bool = true) -> NSImage? {
94108
guard let index = tableView.tableColumns.firstIndex(of: tableColumn) else { return nil }
95109
let view: NSView

0 commit comments

Comments
 (0)