From 1878967da1faccc7a69ac17ee2b3f5cbc3fb2333 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Tue, 11 Aug 2026 19:11:36 +0200 Subject: [PATCH] fixed: CPOutlineView and CPTableView corner cases --- AppKit/CPOutlineView.j | 16 ++++++++++++---- AppKit/CPTableView.j | 9 +++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 07e140ebb..b9c55e046 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -1515,8 +1515,12 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff = 0, { if (_disclosureControlsForRows.length) { - var indexes = [_selectedRowIndexes copy]; - [indexes removeIndexesInRange:CPMakeRange(_disclosureControlsForRows.length, _itemsForRows.length - _disclosureControlsForRows.length)]; + var indexes = [_selectedRowIndexes copy], + diff = _itemsForRows.length - _disclosureControlsForRows.length; + + if (diff > 0) + [indexes removeIndexesInRange:CPMakeRange(_disclosureControlsForRows.length, diff)]; + [[_disclosureControlsForRows objectsAtIndexes:indexes] makeObjectsPerformSelector:@selector(unsetThemeState:) withObject:CPThemeStateSelected]; } @@ -1524,8 +1528,12 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff = 0, if (_disclosureControlsForRows.length) { - var indexes = [_selectedRowIndexes copy]; - [indexes removeIndexesInRange:CPMakeRange(_disclosureControlsForRows.length, _itemsForRows.length - _disclosureControlsForRows.length)]; + var indexes = [_selectedRowIndexes copy], + diff = _itemsForRows.length - _disclosureControlsForRows.length; + + if (diff > 0) + [indexes removeIndexesInRange:CPMakeRange(_disclosureControlsForRows.length, diff)]; + [[_disclosureControlsForRows objectsAtIndexes:indexes] makeObjectsPerformSelector:@selector(setThemeState:) withObject:CPThemeStateSelected]; } } diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index fe8f078ef..a9686a6f1 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -2092,6 +2092,9 @@ NOT YET IMPLEMENTED if (lastRow < 0) lastRow = _numberOfRows - 1; + if (firstRow > lastRow) + return CPMakeRange(0, 0); + return CPMakeRange(firstRow, lastRow - firstRow + 1); } @@ -2130,12 +2133,18 @@ NOT YET IMPLEMENTED // O(log numberOfColumns) if table view contains no hidden columns // O(numberOfColumns) if table view contains hidden columns + if (NUMBER_OF_COLUMNS() === 0) + return [CPIndexSet indexSet]; + var column = MAX(0, [self columnAtPoint:CGPointMake(aRect.origin.x, 0.0)]), lastColumn = [self columnAtPoint:CGPointMake(CGRectGetMaxX(aRect), 0.0)]; if (lastColumn === CPNotFound) lastColumn = NUMBER_OF_COLUMNS() - 1; + if (column > lastColumn || lastColumn < 0) + return [CPIndexSet indexSet]; + // Don't bother doing the expensive removal of hidden indexes if we have no hidden columns. if (_numberOfHiddenColumns <= 0) return [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(column, lastColumn - column + 1)];