On 28/11/2012, at 2:17 PM, Graham Cox <[email protected]> wrote:

>> 
>> I assume you're using begin/endUpdates around this loop to have a single 
>> animation for the whole thing? In that case, it'd be a lot easier to use 
>> removeRowsAtIndexes/insertRowsAtIndexes, since the only index that needs to 
>> be adjusted is targetIndex (it needs to be decreased by the number of 
>> indexes in items that are less than the original targetIndex). That is, you 
>> would adjust targetIndex after the removal and before constructing the index 
>> set for the insertion.
> 
> Yes, I'm bracketing this with begin/endUpdates.
> 
> I'll try that approach, it does sound easier. Thanks.


OK, I have now implemented it this way, and it works, in terms of ordering the 
items correctly.

However, I now remember why I didn't do it this way in the first place ( I did 
try it this way once before, when I first wrote the code a while back). The 
animation doesn't work well doing it this way, and the selection of the items 
is lost.

-[NSTableView moveRowAtIndex:toIndex:] performs a nice "swap" animation which I 
like and want (and tracks the selection for you). The removal/insertion 
approach does not produce a similar animation, or even any, despite having a 
set of NSAnimationOptions. That seems to be the case whether I bracket with 
begin/endUpdates or not. That strikes me as wrong - I should see an animation 
here, no? So I must be doing something wrong.

Maintaining the selection is not really an issue, as I can easily restore it, 
but I would like this to animate as intended. Any ideas?

Here's the relevant code. An ivar mTableDraggingRows is the index set of the 
items being moved, which is the selection when the drag started.



- (BOOL)        tableView:(NSTableView *) aTableView
                  acceptDrop:(id < NSDraggingInfo >)info
                                 row:(NSInteger) row
           dropOperation:(NSTableViewDropOperation) operation
{
        [aTableView beginUpdates];

        NSInteger adjustment;
        
        adjustment = [mTableDraggingRows 
countOfIndexesInRange:NSMakeRange(0,row)];
        
        [aTableView removeRowsAtIndexes:mTableDraggingRows 
withAnimation:NSTableViewAnimationEffectFade | NSTableViewAnimationSlideUp];

        NSIndexSet* insertions = [NSIndexSet 
indexSetWithIndexesInRange:NSMakeRange( row - adjustment, [mTableDraggingRows 
count])];
        [aTableView insertRowsAtIndexes:insertions 
withAnimation:NSTableViewAnimationEffectGap | NSTableViewAnimationSlideDown];
        
        // perform a similar set of operations on the array holding the 
controllers
        
        NSArray* itemsToMove = [mTraceControllers 
objectsAtIndexes:mTableDraggingRows];
        [mTraceControllers removeObjectsAtIndexes:mTableDraggingRows];
        [mTraceControllers insertObjects:itemsToMove atIndexes:insertions];
        
        // adjust the managed views so they're laid out in the right order

        [tracesView arrangeTraceViewsWithAnimation:YES];
        
        [aTableView reloadData];
        [aTableView endUpdates];
        
        mTableDraggingRows = nil;
        
        return YES;
}


--Graham

P.S. it would be really great if Corbin weighed in on this one ;-)
_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to