Skip to content

Commit

Permalink
Improve delegate notifications
Browse files Browse the repository at this point in the history
  • Loading branch information
LeoNatan committed May 7, 2021
1 parent 0767c50 commit 35597e3
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ - (void)_updateKey:(NSString*)key ofNode:(LNPropertyListNode*)node

if(_flags.delegate_willChangeNode)
{
[self.delegate propertyListEditor:self willChangeNode:node changeType:LNPropertyListNodeChangeTypeMove previousKey:oldKey];
[self.delegate propertyListEditor:self willChangeNode:node changeType:LNPropertyListNodeChangeTypeUpdate previousKey:oldKey];
}

[_outlineView reloadItem:node];
Expand All @@ -258,7 +258,7 @@ - (void)_updateKey:(NSString*)key ofNode:(LNPropertyListNode*)node

if(_flags.delegate_didChangeNode)
{
[self.delegate propertyListEditor:self didChangeNode:node changeType:LNPropertyListNodeChangeTypeMove previousKey:oldKey];
[self.delegate propertyListEditor:self didChangeNode:node changeType:LNPropertyListNodeChangeTypeUpdate previousKey:oldKey];
}
}

Expand Down Expand Up @@ -362,7 +362,7 @@ - (void)_updateValue:(id)value ofNode:(LNPropertyListNode*)node reloadItem:(BOOL
}
}

- (void)_insertNode:(LNPropertyListNode*)insertedNode inParentNode:(LNPropertyListNode*)parentNode index:(NSInteger)insertionIndex notifyDelegate:(BOOL)notifyDelegate groupUndoOperation:(BOOL)groupUndo
- (void)_insertNode:(LNPropertyListNode*)insertedNode inParentNode:(LNPropertyListNode*)parentNode index:(NSInteger)insertionIndex notifyDelegate:(BOOL)notifyDelegate undoOperation:(BOOL)undoOperation
{
insertedNode.parent = parentNode;

Expand Down Expand Up @@ -390,15 +390,16 @@ - (void)_insertNode:(LNPropertyListNode*)insertedNode inParentNode:(LNPropertyLi
insertionIndex = parentNode.children.count;
}

[parentNode.children insertObject:insertedNode atIndex:insertionIndex];
[_outlineView insertItemsAtIndexes:[NSIndexSet indexSetWithIndex:insertionIndex] inParent:parentNodeInOutline withAnimation:NSTableViewAnimationEffectNone];

if(notifyDelegate && _flags.delegate_willChangeNode)
{
[self.delegate propertyListEditor:self willChangeNode:parentNode changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
[self.delegate propertyListEditor:self willChangeNode:insertedNode changeType:LNPropertyListNodeChangeTypeInsert previousKey:nil];
}

[_outlineView reloadItem:parentNode];
[parentNode.children insertObject:insertedNode atIndex:insertionIndex];
[_outlineView insertItemsAtIndexes:[NSIndexSet indexSetWithIndex:insertionIndex] inParent:parentNodeInOutline withAnimation:NSTableViewAnimationEffectNone];

[_outlineView reloadItem:parentNode reloadChildren:YES];
if(parentNode.type == LNPropertyListNodeTypeArray)
{
[[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertionIndex, parentNode.children.count - insertionIndex)] enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
Expand All @@ -412,21 +413,19 @@ - (void)_insertNode:(LNPropertyListNode*)insertedNode inParentNode:(LNPropertyLi

[_outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:insertedRow] byExtendingSelection:NO];

if(groupUndo)
if(undoOperation)
{
[_undoManager beginUndoGrouping];
}
[_undoManager registerUndoWithTarget:self handler:^(LNPropertyListEditor* _Nonnull target) {
[target _deleteNode:insertedNode notifyDelegate:notifyDelegate groupUndoOperation:groupUndo];
}];
if(groupUndo)
{
[_undoManager registerUndoWithTarget:self handler:^(LNPropertyListEditor* _Nonnull target) {
[target _deleteNode:insertedNode notifyDelegate:notifyDelegate undoOperation:undoOperation];
}];
[_undoManager endUndoGrouping];
}

if(notifyDelegate && _flags.delegate_didChangeNode)
{
[self.delegate propertyListEditor:self didChangeNode:insertedNode changeType:LNPropertyListNodeChangeTypeInsert previousKey:nil];
[self.delegate propertyListEditor:self didChangeNode:parentNode changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
}
}

Expand Down Expand Up @@ -456,10 +455,10 @@ - (void)_insertNode:(LNPropertyListNode*)insertedNode sender:(id)sender
insertionRow = [parentNode.children indexOfObject:node] + 1;
}

[self _insertNode:insertedNode inParentNode:parentNode index:insertionRow notifyDelegate:YES groupUndoOperation:YES];
[self _insertNode:insertedNode inParentNode:parentNode index:insertionRow notifyDelegate:YES undoOperation:YES];
}

- (void)_deleteNode:(LNPropertyListNode*)deletedNode notifyDelegate:(BOOL)notifyDelegate groupUndoOperation:(BOOL)groupUndo
- (void)_deleteNode:(LNPropertyListNode*)deletedNode notifyDelegate:(BOOL)notifyDelegate undoOperation:(BOOL)undoOperation
{
if(deletedNode.parent == nil)
{
Expand All @@ -477,14 +476,15 @@ - (void)_deleteNode:(LNPropertyListNode*)deletedNode notifyDelegate:(BOOL)notify

[_outlineView beginUpdates];

LNPropertyListNode* parentNode = deletedNode.parent;
LNPropertyListNode* parentNodeInOutline = parentNode != _rootPropertyListNode ? deletedNode.parent : nil;

if(notifyDelegate && _flags.delegate_willChangeNode)
{
[self.delegate propertyListEditor:self willChangeNode:deletedNode changeType:LNPropertyListNodeChangeTypeDelete previousKey:deletedNode.key];
[self.delegate propertyListEditor:self willChangeNode:parentNode changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
[self.delegate propertyListEditor:self willChangeNode:deletedNode changeType:LNPropertyListNodeChangeTypeDelete previousKey:nil];
}

LNPropertyListNode* parentNode = deletedNode.parent;
LNPropertyListNode* parentNodeInOutline = parentNode != _rootPropertyListNode ? deletedNode.parent : nil;

NSUInteger deletionIndex = [deletedNode.parent.children indexOfObject:deletedNode];

[deletedNode.parent.children removeObjectAtIndex:deletionIndex];
Expand All @@ -493,7 +493,7 @@ - (void)_deleteNode:(LNPropertyListNode*)deletedNode notifyDelegate:(BOOL)notify

if(parentNodeInOutline != nil)
{
[_outlineView reloadItem:parentNodeInOutline];
[_outlineView reloadItem:parentNodeInOutline reloadChildren:YES];
}
if(deletedNode.parent.type == LNPropertyListNodeTypeArray)
{
Expand All @@ -504,15 +504,12 @@ - (void)_deleteNode:(LNPropertyListNode*)deletedNode notifyDelegate:(BOOL)notify

[self->_outlineView endUpdates];

if(groupUndo)
if(undoOperation)
{
[_undoManager beginUndoGrouping];
}
[_undoManager registerUndoWithTarget:self handler:^(LNPropertyListEditor* _Nonnull target) {
[target _insertNode:deletedNode inParentNode:parentNode index:deletionIndex notifyDelegate:notifyDelegate groupUndoOperation:groupUndo];
}];
if(groupUndo)
{
[_undoManager registerUndoWithTarget:self handler:^(LNPropertyListEditor* _Nonnull target) {
[target _insertNode:deletedNode inParentNode:parentNode index:deletionIndex notifyDelegate:notifyDelegate undoOperation:undoOperation];
}];
[_undoManager endUndoGrouping];
}

Expand All @@ -527,7 +524,8 @@ - (void)_deleteNode:(LNPropertyListNode*)deletedNode notifyDelegate:(BOOL)notify

if(notifyDelegate && _flags.delegate_didChangeNode)
{
[self.delegate propertyListEditor:self didChangeNode:deletedNode changeType:LNPropertyListNodeChangeTypeDelete previousKey:deletedNode.key];
[self.delegate propertyListEditor:self didChangeNode:deletedNode changeType:LNPropertyListNodeChangeTypeDelete previousKey:nil];
[self.delegate propertyListEditor:self didChangeNode:parentNode changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
}
}

Expand All @@ -546,15 +544,16 @@ - (void)_deleteNodeWithSender:(id)sender

LNPropertyListNode* deletedNode = [_outlineView itemAtRow:row];

[self _deleteNode:deletedNode notifyDelegate:YES groupUndoOperation:YES];
[self _deleteNode:deletedNode notifyDelegate:YES undoOperation:YES];
}

- (void)_moveNode:(LNPropertyListNode*)node intoParentNode:(LNPropertyListNode*)parentNode index:(NSInteger)parentIndex
- (void)_moveNode:(LNPropertyListNode*)node intoParentNode:(LNPropertyListNode*)parentNode index:(NSInteger)parentIndex adjust:(BOOL)adjust
{
if(node.parent == parentNode)
LNPropertyListNode* oldParentNode = node.parent;
NSInteger beforeIndex = [oldParentNode.children indexOfObject:node];

if(adjust && oldParentNode == parentNode)
{
NSInteger beforeIndex = [node.parent.children indexOfObject:node];

if(beforeIndex < parentIndex)
{
parentIndex -= 1;
Expand All @@ -568,15 +567,36 @@ - (void)_moveNode:(LNPropertyListNode*)node intoParentNode:(LNPropertyListNode*)

if(_flags.delegate_willChangeNode)
{
if(oldParentNode != nil)
{
[self.delegate propertyListEditor:self willChangeNode:oldParentNode changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
}
if(oldParentNode != parentNode)
{
[self.delegate propertyListEditor:self willChangeNode:parentNode changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
}
[self.delegate propertyListEditor:self willChangeNode:node changeType:LNPropertyListNodeChangeTypeMove previousKey:nil];
}

[_undoManager beginUndoGrouping];
[self _deleteNode:node notifyDelegate:NO groupUndoOperation:NO];
[self _insertNode:node inParentNode:parentNode index:parentIndex notifyDelegate:NO groupUndoOperation:NO];
[_undoManager registerUndoWithTarget:self handler:^(LNPropertyListEditor* _Nonnull target) {
[target _moveNode:node intoParentNode:oldParentNode index:beforeIndex adjust:NO];
}];
[_undoManager endUndoGrouping];
[self _deleteNode:node notifyDelegate:NO undoOperation:NO];
[self _insertNode:node inParentNode:parentNode index:parentIndex notifyDelegate:NO undoOperation:NO];

if(_flags.delegate_didChangeNode)
{
[self.delegate propertyListEditor:self didChangeNode:node changeType:LNPropertyListNodeChangeTypeMove previousKey:nil];
if(node.parent != parentNode)
{
[self.delegate propertyListEditor:self didChangeNode:parentNode changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
}
if(node.parent != nil)
{
[self.delegate propertyListEditor:self didChangeNode:node.parent changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
}
}
}

Expand Down Expand Up @@ -1163,12 +1183,12 @@ - (void)_sortRootNodeIfPossibleWithSortDescriptors:(NSArray<NSSortDescriptor *>
} callback:^(LNPropertyListNode* node, BOOL will) {
if(will && _flags.delegate_willChangeNode)
{
[self.delegate propertyListEditor:self willChangeNode:node changeType:LNPropertyListNodeChangeTypeReorderChildren previousKey:nil];
[self.delegate propertyListEditor:self willChangeNode:node changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
}

if(!will && _flags.delegate_didChangeNode)
{
[self.delegate propertyListEditor:self didChangeNode:node changeType:LNPropertyListNodeChangeTypeReorderChildren previousKey:nil];
[self.delegate propertyListEditor:self didChangeNode:node changeType:LNPropertyListNodeChangeTypeUpdate previousKey:nil];
}
}];
}
Expand Down Expand Up @@ -1252,11 +1272,11 @@ - (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id<NSDraggingInfo>)

if(info.draggingSourceOperationMask == NSDragOperationCopy)
{
[self _insertNode:draggedItem.copy inParentNode:item index:index notifyDelegate:YES groupUndoOperation:YES];
[self _insertNode:draggedItem.copy inParentNode:item index:index notifyDelegate:YES undoOperation:YES];
}
else
{
[self _moveNode:draggedItem intoParentNode:item index:index];
[self _moveNode:draggedItem intoParentNode:item index:index adjust:YES];
}
}];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,19 @@
#import <Cocoa/Cocoa.h>
#import <LNPropertyListEditor/LNPropertyListNode.h>

#define LN_DEPRECATED_API(x) __attribute__((deprecated(x)))

typedef NS_ENUM(NSUInteger, LNPropertyListNodeChangeType) {
/// Specifies that a node was inserted.
LNPropertyListNodeChangeTypeInsert,
/// Specifies that a node was deleted.
LNPropertyListNodeChangeTypeDelete,
/// Specifies that a node was moved.
LNPropertyListNodeChangeTypeMove,
/// Specifies that an object was updated.
LNPropertyListNodeChangeTypeUpdate,
LNPropertyListNodeChangeTypeReorderChildren,

LNPropertyListNodeChangeTypeReorderChildren LN_DEPRECATED_API("Use LNPropertyListNodeChangeTypeUpdate isntead.") = LNPropertyListNodeChangeTypeUpdate,
};

NS_ASSUME_NONNULL_BEGIN
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,25 +34,22 @@ - (void)viewDidLoad {
// return NO;
//}

- (void)propertyListEditor:(LNPropertyListEditor *)editor willChangeNode:(LNPropertyListNode *)node changeType:(LNPropertyListNodeChangeType)changeType previousKey:(NSString *)previousKey
- (void)propertyListEditor:(LNPropertyListEditor *)editor didChangeNode:(LNPropertyListNode *)node changeType:(LNPropertyListNodeChangeType)changeType previousKey:(NSString *)previousKey
{
switch(changeType)
{
case LNPropertyListNodeChangeTypeMove:
NSLog(@"➡️ Moved %@", node);
break;
case LNPropertyListNodeChangeTypeInsert:
NSLog(@"🎉 Inserted %@", node);
break;
case LNPropertyListNodeChangeTypeDelete:
NSLog(@"🗑 Deleted %@", node);
break;
case LNPropertyListNodeChangeTypeMove:
NSLog(@"➡️ Moved %@", node);
break;
case LNPropertyListNodeChangeTypeUpdate:
NSLog(@"🔄 Updated %@", node);
break;
case LNPropertyListNodeChangeTypeReorderChildren:
NSLog(@"📚 Children Reordered %@", node);
break;
}
}

Expand Down

0 comments on commit 35597e3

Please sign in to comment.