Re: How to make Redo work with a custom group
Re: How to make Redo work with a custom group
- Subject: Re: How to make Redo work with a custom group
- From: Paul Bruneau <email@hidden>
- Date: Mon, 29 Oct 2007 15:54:58 -0400
On Oct 29, 2007, at 3:25 PM, David Spooner wrote:
The operations for which you want to provide an inverse should take
an undo manager. If these operations are written as a sequence of
more primitive operations then it may be convenient to provide the
undo manager as an argument to those primitive methods also. For
example, in a method which splits an edge of a triangle mesh you
need to replace the selected edge and its two adjacent triangles
with a new vertex attached to four new edges and four new
triangles. By adding the undo manager as parameter to the
primitive methods for vertex/edge/face addition and removal (where
the inverse operation is easy) there was no need to write an
explicit inverse method.
OK, thank you, I understand.
What I did which seems to work well is to make the following
method in my view's controller:
- (void)moveOrderStep:(OrderStep *)orderStep
toStartTime:(NSDate *)newStartTime;
{
//add the inverse of this operation to the undo stack
[[[appController myUndo] prepareWithInvocationTarget:self]
moveOrderStep:orderStep
toStartTime:[orderStep startTime]];
if (![[appController myUndo] isUndoing])
{
[[appController myUndo] setActionName:@"move order step"];
}
}
This gives me a sort of an undo "middle man" that can be called by
the higher level methods which in turn calls the setter of the
order step's ivar.
I'm not sure I understand. You say the caller of this method also
actually effects the start time, or did you leave out the call to -
setStartTime:?
Gah! I did just that! this line follows those above:
[orderStep setStartTime:newStartTime];
I found the following method useful for the many situations in
which I wanted undo for setting object attributes...
@implementation NSObject(...)
- (void) setValue:(id)value forKeyPath:(NSString *)path undo:
(NSUndoManager *)undo
{
if (undo != nil)
[[undo prepareWithInvocationTarget:self] setValue:[self
valueForKeyPath:path] forKeyPath:path undo:undo];
[self setValue:value forKeyPath:path];
}
@end
That is neat. I must admit a certain fuzziness for setValue:
forKeyPath: that I hope to clear up over time. Is your undo != nil
test just habit from another language or does it serve a real
purpose? If undo is nil, no harm is caused by sending it a message, no?
Thanks again for your wisdom
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden