diff --git a/TablePro/Models/Query/RowProvider.swift b/TablePro/Models/Query/RowProvider.swift index 2a81e1a1..8af31183 100644 --- a/TablePro/Models/Query/RowProvider.swift +++ b/TablePro/Models/Query/RowProvider.swift @@ -217,6 +217,23 @@ final class InMemoryRowProvider: RowProvider { return columnIndex < rowCache.count ? rowCache[columnIndex] : nil } + @MainActor + func preWarmDisplayCache(upTo rowCount: Int) { + let count = min(rowCount, totalRowCount) + for row in 0.. = [] + private(set) var fkColumns: Set = [] var isSyncingSortDescriptors: Bool = false /// Suppresses selection delegate callbacks during programmatic selection sync var isSyncingSelection = false @@ -263,6 +265,30 @@ final class TableViewCoordinator: NSObject, NSTableViewDelegate, NSTableViewData cachedColumnCount = rowProvider.columns.count } + func rebuildColumnMetadataCache() { + var enumSet = Set() + var fkSet = Set() + let columns = rowProvider.columns + let types = rowProvider.columnTypes + let enumValues = rowProvider.columnEnumValues + let fkKeys = rowProvider.columnForeignKeys + + for i in 0.. 0 { + let visibleRows = Int(tableView.visibleRect.height / rowH) + 5 + coordinator.rowProvider.preWarmDisplayCache(upTo: visibleRows) + } + } + coordinator.changeManager = changeManager coordinator.isEditable = isEditable coordinator.onRefresh = onRefresh diff --git a/TablePro/Views/Results/Extensions/DataGridView+Columns.swift b/TablePro/Views/Results/Extensions/DataGridView+Columns.swift index f8f61ffd..7a6b6851 100644 --- a/TablePro/Views/Results/Extensions/DataGridView+Columns.swift +++ b/TablePro/Views/Results/Extensions/DataGridView+Columns.swift @@ -43,20 +43,8 @@ extension TableViewCoordinator { let isDropdown = dropdownColumns?.contains(columnIndex) == true let isTypePicker = typePickerColumns?.contains(columnIndex) == true - let isEnumOrSet: Bool = { - guard columnIndex < rowProvider.columnTypes.count, - columnIndex < rowProvider.columns.count else { return false } - let ct = rowProvider.columnTypes[columnIndex] - let columnName = rowProvider.columns[columnIndex] - guard ct.isEnumType || ct.isSetType else { return false } - return rowProvider.columnEnumValues[columnName]?.isEmpty == false - }() - - let isFKColumn: Bool = { - guard columnIndex < rowProvider.columns.count else { return false } - let columnName = rowProvider.columns[columnIndex] - return rowProvider.columnForeignKeys[columnName] != nil - }() + let isEnumOrSet = enumOrSetColumns.contains(columnIndex) + let isFKColumn = fkColumns.contains(columnIndex) return cellFactory.makeDataCell( tableView: tableView,