Skip to content

Commit

Permalink
Improve undo/redo management for insertion, deletion and type update …
Browse files Browse the repository at this point in the history
…of nodes

Closes #8
  • Loading branch information
LeoNatan committed Apr 19, 2021
1 parent b58e676 commit 22768e0
Showing 1 changed file with 68 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -192,21 +192,8 @@ - (void)_updateKey:(NSString*)key ofNode:(LNPropertyListNode*)node
}
}

- (void)_setType:(LNPropertyListNodeType)type children:(id)children value:(id)value forSender:(id)sender
- (void)_setType:(LNPropertyListNodeType)type children:(id)children value:(id)value forNode:(LNPropertyListNode*)node
{
NSInteger row = [self _rowForSender:sender beep:YES];
if(row == -1)
{
return;
}

LNPropertyListNode* node = [_outlineView itemAtRow:row];

if(node.type == type)
{
return;
}

LNPropertyListNodeType oldType = node.type;
id oldValue = node.value;
id oldChildren = node.children;
Expand All @@ -223,7 +210,7 @@ - (void)_setType:(LNPropertyListNodeType)type children:(id)children value:(id)va
[_outlineView reloadItem:node reloadChildren:YES];

[_undoManager registerUndoWithTarget:self handler:^(LNPropertyListEditor* _Nonnull target) {
[target _setType:oldType children:oldChildren value:oldValue forSender:@(row)];
[target _setType:oldType children:oldChildren value:oldValue forNode:node];
}];

if(_flags.delegate_didChangeNode)
Expand All @@ -232,6 +219,24 @@ - (void)_setType:(LNPropertyListNodeType)type children:(id)children value:(id)va
}
}

- (void)_setType:(LNPropertyListNodeType)type children:(id)children value:(id)value forSender:(id)sender
{
NSInteger row = [self _rowForSender:sender beep:YES];
if(row == -1)
{
return;
}

LNPropertyListNode* node = [_outlineView itemAtRow:row];

if(node.type == type)
{
return;
}

[self _setType:type children:children value:value forNode:node];
}

- (void)_convertToType:(LNPropertyListNodeType)newType forSender:(id)sender
{
[self _setType:newType children:(newType == LNPropertyListNodeTypeArray || newType == LNPropertyListNodeTypeDictionary ? [NSMutableArray new] : nil) value:[LNPropertyListNode defaultValueForType:newType] forSender:sender];
Expand Down Expand Up @@ -283,35 +288,12 @@ - (void)_updateValue:(id)value ofNode:(LNPropertyListNode*)node reloadItem:(BOOL
}
}

- (void)_insertNode:(LNPropertyListNode*)insertedNode sender:(id)sender
- (void)_insertNode:(LNPropertyListNode*)insertedNode inParentNode:(LNPropertyListNode*)parentNode index:(NSUInteger)insertionRow
{
NSInteger row = [self _rowForSender:sender beep:NO];
if(row == -1 && [sender isKindOfClass:[NSNumber class]] == NO)
{
row = _rootPropertyListNode.children.count - 1;
}

[_outlineView beginUpdates];

LNPropertyListNode* node = [_outlineView itemAtRow:row];

NSUInteger insertionRow;
insertedNode.parent = parentNode;

LNPropertyListNode* parentNode;
if([_outlineView isItemExpanded:node])
{
parentNode = node ?: _rootPropertyListNode;
insertionRow = 0;
}
else
{
parentNode = [node parent];
insertionRow = [parentNode.children indexOfObject:node] + 1;
}
LNPropertyListNode* parentNodeInOutline = parentNode != _rootPropertyListNode ? parentNode : nil;

insertedNode.parent = parentNode;

if(parentNode.type == LNPropertyListNodeTypeDictionary)
{
if(insertedNode.key == nil)
Expand Down Expand Up @@ -352,7 +334,7 @@ - (void)_insertNode:(LNPropertyListNode*)insertedNode sender:(id)sender
[_outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:insertedRow] byExtendingSelection:NO];

[_undoManager registerUndoWithTarget:self handler:^(LNPropertyListEditor* _Nonnull target) {
[target delete:@(insertedRow)];
[target _deleteNode:insertedNode];
}];

if(_flags.delegate_didChangeNode)
Expand All @@ -361,32 +343,54 @@ - (void)_insertNode:(LNPropertyListNode*)insertedNode sender:(id)sender
}
}

- (void)_deleteNodeWithSender:(id)sender
- (void)_insertNode:(LNPropertyListNode*)insertedNode sender:(id)sender
{
NSInteger selectedRow = _outlineView.selectedRow;
NSInteger row = [self _rowForSender:sender beep:NO];
if(row == -1 && [sender isKindOfClass:[NSNumber class]] == NO)
{
row = _rootPropertyListNode.children.count - 1;
}

NSInteger row = [self _rowForSender:sender beep:YES];
if(row == -1)
[_outlineView beginUpdates];

LNPropertyListNode* node = [_outlineView itemAtRow:row];

NSUInteger insertionRow;

LNPropertyListNode* parentNode;
if([_outlineView isItemExpanded:node])
{
return;
parentNode = node ?: _rootPropertyListNode;
insertionRow = 0;
}
else
{
parentNode = [node parent];
insertionRow = [parentNode.children indexOfObject:node] + 1;
}

if([self _validateCanDeleteForSender:sender] == NO)
[self _insertNode:insertedNode inParentNode:parentNode index:insertionRow];
}

- (void)_deleteNode:(LNPropertyListNode*)deletedNode
{
if([self canDeleteNode:deletedNode] == NO)
{
NSBeep();
return;
}

[_outlineView beginUpdates];
NSInteger selectedRow = _outlineView.selectedRow;

LNPropertyListNode* deletedNode = [_outlineView itemAtRow:row];
[_outlineView beginUpdates];

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

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

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

Expand All @@ -408,7 +412,7 @@ - (void)_deleteNodeWithSender:(id)sender
[self->_outlineView endUpdates];

[_undoManager registerUndoWithTarget:self handler:^(LNPropertyListEditor* _Nonnull target) {
[target _insertNode:deletedNode sender:@(row - 1)];
[target _insertNode:deletedNode inParentNode:parentNode index:deletionIndex];
}];

if(selectedRow != -1)
Expand All @@ -426,6 +430,19 @@ - (void)_deleteNodeWithSender:(id)sender
}
}

- (void)_deleteNodeWithSender:(id)sender
{
NSInteger row = [self _rowForSender:sender beep:YES];
if(row == -1)
{
return;
}

LNPropertyListNode* deletedNode = [_outlineView itemAtRow:row];

[self _deleteNode:deletedNode];
}

#pragma mark Private

- (BOOL)_validateCanAddForSender:(id)sender
Expand Down Expand Up @@ -525,11 +542,6 @@ - (BOOL)canDeleteNode:(LNPropertyListNode*)node

- (NSInteger)_rowForSender:(id)sender beep:(BOOL)beep
{
if([sender isKindOfClass:[NSNumber class]])
{
return [sender integerValue];
}

NSInteger row = -1;

if([sender isKindOfClass:[NSMenuItem class]])
Expand Down

0 comments on commit 22768e0

Please sign in to comment.