• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: How to make Redo work with a custom group
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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 12:42:02 -0400

Thank you David-

Coincidentally, I did in fact use the undo manager as a parameter in a different part of my application. I was considering removing that because this app is non-document based and I want just a single undo manager throughout the whole thing anyway. I'll think more about that.

When you say "use the undo manager at the lowest level" you don't really mean the LOWEST level do you? By that I mean, you didn't implement undo into your ivar setter methods did you?

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.

Thanks again,

PB

On Oct 29, 2007, at 11:12 AM, David Spooner wrote:

Paul,

I find it generally useful to parameterize the operations (and their inverses) with an undo manager. This avoids reliance on the undo manager of a specific view and allows the operations to exist cleanly at the model level. I would go further and say that in any model for which you want undo support, your 'primitive' mutation methods should have an undo parameter. I say this based on experience adding undo support to a mesh editing program: there the operations were quite complex and after much difficulty trying to synchronize the effects of undo and redo I ended up restructuring to code to use the undo manager at the lowest level.

dave

On 29-Oct-07, at 8:11 AM, Paul Bruneau wrote:

Hi-

I understand how Redo works as described on page 145 of Hillegass. He makes his insertObject: and removeObject: methods the inverse of each other so that when you do one, it puts the other one on the undo stack.

But in my situation, I don't seem to be able to implement it that way.

I want to undo a drag that occurs in a custom view.

I put this into my -mouseDown: method:

	//start custom undo grouping
	[[appController myUndo] setGroupsByEvent:NO];
	[[appController myUndo] beginUndoGrouping];


then I put this into my -mouseDragged: method:

[[[appController myUndo] prepareWithInvocationTarget:selectedOS] setStartTime:[selectedOS startTime]];

This gets called every time the mouse moves of course.

Finally, in my -mouseUp: method I close it up:

//end custom undo grouping
[[appController myUndo] setActionName:[NSString stringWithFormat:@"Move order step"]];
[[appController myUndo] endUndoGrouping];
[[appController myUndo] setGroupsByEvent:YES];


So Undo works great, but I when I try Redo (which does show OK in the menu), nothing happens. This is I think because there is no undo code in the setStartTime: call that I wrap into the prepareWithInvocationTarget:

But how do I go about it? Do I make a second -setStartTime method called something like -setStartTimeWithUndo that puts its inverse on the undo stack?

Thank you for any insight


_______________________________________________

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


  • Follow-Ups:
    • Re: How to make Redo work with a custom group
      • From: David Spooner <email@hidden>
References: 
 >How to make Redo work with a custom group (From: Paul Bruneau <email@hidden>)
 >Re: How to make Redo work with a custom group (From: David Spooner <email@hidden>)

  • Prev by Date: Re: Core data model configuration & Leopard
  • Next by Date: Re: [Moderator] Leopard Discussion Embargo Lifted at 6PM Pacific
  • Previous by thread: Re: How to make Redo work with a custom group
  • Next by thread: Re: How to make Redo work with a custom group
  • Index(es):
    • Date
    • Thread