Merge pull request #2334 from Dogild/ReloadDataTableViewRunLoop

Fixed: reloadData in CPTableView run the runLoop
This commit is contained in:
Antoine Mercadal committed 2015-03-19 18:22:24 -07:00
commit f2c5515317
4 files changed
+67 -20

No files matched your search

+11 -1
View File
@@ -622,7 +622,6 @@ NOT YET IMPLEMENTED
- (void)reloadData
{
[self _reloadDataViews];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
/*!
@@ -1146,6 +1145,7 @@ NOT YET IMPLEMENTED
_dirtyTableColumnRangeIndex = MIN(index, _dirtyTableColumnRangeIndex);
[self reloadData];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
/*!
@@ -3834,6 +3834,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
- (void)enumerateAvailableViewsUsingBlock:(Function/*CPView *dataView, CPInteger row, CPInteger column*, @ref stop*/)handler
{
[self reloadData];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
[self _enumerateViewsInRows:_exposedRows columns:_exposedColumns usingBlock:handler];
}
@@ -3843,6 +3846,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
- (void)_enumerateViewsInRows:(CPIndexSet)rowIndexes columns:(CPIndexSet)columnIndexes usingBlock:(Function/*CPView dataView, CPInteger row, CPInteger column, @ref stop*/)handler
{
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
[rowIndexes enumerateIndexesUsingBlock:function(rowIndex, stopRow)
{
var dataViewsForRow = _dataViewsForRows[rowIndex];
@@ -3868,6 +3873,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
- (void)_enumerateViewsInRows:(CPIndexSet)rowIndexes tableColumns:(CPArray)tableColumns usingBlock:(Function/*CPView dataView, CPInteger row, CPtableColumn tableColumn, CPInteger column, @ref stop*/)handler
{
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
[rowIndexes enumerateIndexesUsingBlock:function(rowIndex, stopRow)
{
var dataViewsForRow = _dataViewsForRows[rowIndex];
@@ -5309,6 +5316,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
[self reloadData];
// Process all events immediately to make sure table data views are reloaded.
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
[self scrollRowToVisible:rowIndex];
[self scrollColumnToVisible:columnIndex];
+5
View File
@@ -41,13 +41,18 @@
[tableView reloadData];
var enumerateViewsInRowsCall = 0;
[tableView _enumerateViewsInRows:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 3)] columns:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 4)] usingBlock:function(view, row, column, stop)
{
var tableColumn = [[tableView tableColumns] objectAtIndex:column],
expected = [tableColumn identifier] + "_" + [tableContent objectAtIndex:row];
[self assertTrue:([view stringValue] == expected)];
enumerateViewsInRowsCall++;
}];
[self assert:enumerateViewsInRowsCall equals:12];
}
- (int)numberOfRowsInTableView:(CPTableView)aTableView
+5 -3
View File
@@ -40,19 +40,21 @@
[self assertTrue:([[tableView tableColumns] count] == 4)];
[tableView removeTableColumn:[[tableView tableColumns] firstObject]];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
[self assertTrue:([[tableView tableColumns] count] == 3)];
[tableView removeTableColumn:[[tableView tableColumns] firstObject]];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
[self assertTrue:([[tableView tableColumns] count] == 2)];
var enumerateViewsInRowsCall = 0;
[tableView enumerateAvailableViewsUsingBlock:function(view, row, column, stop)
{
var tableColumn = [[tableView tableColumns] objectAtIndex:column];
[self assert:("COLUMN_" + [tableColumn identifier] + "ROW_" + row) equals:[view objectValue]];
enumerateViewsInRowsCall++;
}];
[self assert:enumerateViewsInRowsCall equals:30];
}
- (int)numberOfRowsInTableView:(CPTableView)aTableView
+46 -16
View File
@@ -159,9 +159,6 @@
[tableView selectRowIndexes:[CPIndexSet indexSetWithIndex:1] byExtendingSelection:NO];
[tableView editColumn:0 row:1 withEvent:nil select:YES];
// Process all events immediately to make sure table data views are reloaded.
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
// Now some text field should be the first responder.
var fieldEditor = [theWindow firstResponder];
[self assert:CPTextField equals:[fieldEditor class] message:"table cell editor should be a text field"];
@@ -184,6 +181,7 @@
{
var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, 100.0, 100.0)],
tableColumn1 = [[CPTableColumn alloc] initWithIdentifier:@"Bar"];
[tableView addTableColumn:tableColumn1];
[scrollView setDocumentView:tableView];
@@ -206,6 +204,8 @@
[tableColumn setDataView:[CustomTextView0 new]];
[tableColumn1 setDataView:[CustomTextView1 new]];
[tableView reloadData];
// Process all events immediately to make sure table data views are reloaded.
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
@@ -238,13 +238,15 @@
visibleHeight = [tableView visibleRect].size.height,
fullRowHeight = [tableView rowHeight] + [tableView intercellSpacing].height,
visibleRows = CEIL(visibleHeight / fullRowHeight);
[self assert:2 * visibleRows equals:[allViews count] message:"only as many data views as necessary should be present"];
// Now if we scroll down, new views should come in and others should go out.
var rowTwentyFiveAndAHalfY = FLOOR(25.5 * fullRowHeight);
[tableView scrollPoint:CGPointMake(0, rowTwentyFiveAndAHalfY)];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
AssertCorrectCellsVisible(25);
[self assert:2 * visibleRows equals:[allViews count] message:"only as many data views as necessary should be present (2)"];
}
@@ -270,11 +272,11 @@
[[theWindow contentView] addSubview:contentBindingTable];
[theWindow makeFirstResponder:contentBindingTable];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
// Set the model again with different values
[delegate setTableEntries:[[@"C1", @"D1"], [@"C2", @"D2"], [@"C3", @"D3"]]];
[contentBindingTable reloadData];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
- (void)testColumnValueBinding
@@ -294,8 +296,6 @@
[[theWindow contentView] addSubview:table];
[theWindow makeFirstResponder:table];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
// Should remove all table rows.
[self assertNoThrow:function()
{
@@ -314,13 +314,18 @@
// Change a value in row 0. The number of rows stays the same.
[container setTableEntries:@[@{@"name":@"B4"}, @{@"name":@"B2"}, @{@"name":@"B3"}]];
var enumerateViewsInRowsCall = 0;
// Checks that the displayed data matches the model data.
[table enumerateAvailableViewsUsingBlock:function(dataView, aRow, aColumn, stop)
{
enumerateViewsInRowsCall++;
var data_value = [[[container tableEntries] objectAtIndex:aRow] objectForKey:@"name"];
[self assert:[dataView objectValue] equals:data_value];
}];
[self assert:enumerateViewsInRowsCall equals:3];
// We could also check that the dataviews in rows 1 and 2 are identical to the ones before mutation.
}
@@ -349,8 +354,6 @@
[table reloadData];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
[self assertTrue:[table bounds].size.width > 100 && [table bounds].size.width < 200];
[tableColumn1 setHidden:NO];
@@ -429,9 +432,13 @@
[self assert:CPNotFound equals:column];
[self assert:CPNotFound equals:row];
var enumerateViewsInRowsCall = 0;
// Enumerate views inside the table view and check that rows and columns are correct
[table enumerateAvailableViewsUsingBlock:function(dataView, aRow, aColumn, stop)
{
enumerateViewsInRowsCall++;
var getRow,
getColumn;
@@ -441,9 +448,15 @@
[self assert:aRow equals:getRow];
}];
[self assert:enumerateViewsInRowsCall equals:6];
enumerateViewsInRowsCall = 0;
// Enumerate views inside a different table view and check that rows and columns are not found
[table2 enumerateAvailableViewsUsingBlock:function(dataView, aRow, aColumn, stop)
{
enumerateViewsInRowsCall++;
var getRow,
getColumn;
@@ -452,6 +465,8 @@
[self assert:CPNotFound equals:getRow];
[self assert:CPNotFound equals:getColumn];
}];
[self assert:enumerateViewsInRowsCall equals:6];
}
-(void)testNotificationsRegistered
@@ -498,6 +513,8 @@
[theWindow makeFirstResponder:tableView];
[tableView selectRowIndexes:[CPIndexSet indexSetWithIndex:0] byExtendingSelection:NO];
var enumerateViewsInRowsCall = 0;
[tableView enumerateAvailableViewsUsingBlock:function(dataView, row, column, stop)
{
if (row == 0)
@@ -513,12 +530,20 @@
[self assertFalse:[dataView hasThemeState:CPThemeStateSelectedDataView] message:"CPThemeStateSelectedDataView should be disabled"];
[self assertTrue:[dataView hasThemeState:CPThemeStateFirstResponder] message:"CPThemeStateFirstResponder should be enabled"];
}
enumerateViewsInRowsCall++;
}];
[self assert:enumerateViewsInRowsCall equals:3];
[tableView selectRowIndexes:[CPIndexSet indexSetWithIndex:1] byExtendingSelection:NO];
enumerateViewsInRowsCall = 0;
[tableView enumerateAvailableViewsUsingBlock:function(dataView, row, column, stop)
{
enumerateViewsInRowsCall++;
if (row == 0)
{
[self assertTrue:[dataView hasThemeState:CPThemeStateTableDataView] message:"CPThemeStateTableDataView should be enabled"];
@@ -527,10 +552,16 @@
}
}];
[self assert:enumerateViewsInRowsCall equals:3];
[theWindow makeFirstResponder:textField];
enumerateViewsInRowsCall = 0;
[tableView enumerateAvailableViewsUsingBlock:function(dataView, row, column, stop)
{
enumerateViewsInRowsCall++;
if (row == 0)
{
[self assertTrue:[dataView hasThemeState:CPThemeStateTableDataView] message:"CPThemeStateTableDataView should be enabled"];
@@ -545,6 +576,8 @@
[self assertFalse:[dataView hasThemeState:CPThemeStateFirstResponder] message:"CPThemeStateFirstResponder should be disabled"];
}
}];
[self assert:enumerateViewsInRowsCall equals:3];
}
- (void)testMethodViewAtColumnWithMakeIfNecessarySetToNo
@@ -558,6 +591,9 @@
[dataSource setTableEntries:["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]];
[tableView setDataSource:dataSource];
var view = [tableView viewAtColumn:0 row:0 makeIfNecessary:NO];
[self assert:view equals:nil message:@"View should be equal to nil"];
// Process all events immediately to make sure table data views are reloaded.
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
@@ -580,9 +616,6 @@
[dataSource setTableEntries:["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]];
[tableView setDataSource:dataSource];
// Process all events immediately to make sure table data views are reloaded.
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
var view = [tableView viewAtColumn:0 row:0 makeIfNecessary:YES];
[self assert:[view objectValue] equals:@"A" message:@"View should be equal to A"];
[self assert:[view superview] equals:tableView message:@"Superview of view should be the tableview"];
@@ -603,9 +636,6 @@
[dataSource setTableEntries:["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]];
[tableView setDataSource:dataSource];
// Process all events immediately to make sure table data views are reloaded.
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
var expectedMessage = @"Row 26 out of row range [0-25] for rowViewAtRow:createIfNeeded:",
exceptionMessage = @"";