From 8d69c3764d109162f4af688c6085546d1e898fa0 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Fri, 12 Apr 2013 19:35:03 +0200 Subject: [PATCH] Fixed: The data views were not loaded immediately When reloading the table view, the actual loading (-load) is defered until layout is needed (generally in the next run loop). This is an advantage because it minimize reloads but in some case it is necessary to force a reload, for example when we need to access data views, or manually edit a view, or when we explicitely ask for a reload. This commit adds _reloadDataViewsImmediately and make use of it when necessary. Tests: AppKit/CPTableViewTest -> -testEditCell --- AppKit/CPTableView.j | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index e4df1797a..41780525d 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -565,7 +565,7 @@ NOT YET IMPLEMENTED - (void)reloadDataForRowIndexes:(CPIndexSet)rowIndexes columnIndexes:(CPIndexSet)columnIndexes { if ([self _numberOfRowsDidChange]) - [self _reloadDataViews]; + [self _reloadDataViewsImmediately]; else [self _enumerateViewsInRows:rowIndexes columns:columnIndexes usingBlock:function(view, row, column, stop) { @@ -603,6 +603,13 @@ NOT YET IMPLEMENTED [self setNeedsDisplay:YES]; } +// reload data views and process events to force a -load +- (void)_reloadDataViewsImmediately +{ + [self _reloadDataViews]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; +} + //Target-action Behavior /*! Sets the message sent to the target when the user double-clicks an @@ -3470,12 +3477,13 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [columnIndexes enumerateIndexesUsingBlock:function(columnIndex, stopCol) { var tableColumn = _tableColumns[columnIndex], + tableColumnUID = [tableColumn UID], dataView = [self _preparedViewAtColumn:columnIndex row:row isRowSelected:isRowSelected]; if ([dataView superview] !== self) [self addSubview:dataView]; - dataViewsForRow[[tableColumn UID]] = dataView; + dataViewsForRow[tableColumnUID] = dataView; }]; }]; } @@ -3706,6 +3714,7 @@ 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 _reloadDataViewsImmediately]; [self _enumerateViewsInRows:_exposedRows columns:_exposedColumns usingBlock:handler]; } @@ -5129,6 +5138,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (![self isRowSelected:rowIndex]) [[CPException exceptionWithName:@"Error" reason:@"Attempt to edit row " + rowIndex + " when not selected." userInfo:nil] raise]; + [self _reloadDataViewsImmediately]; + [self scrollRowToVisible:rowIndex]; [self scrollColumnToVisible:columnIndex];