NSRulerMarker question
NSRulerMarker question
- Subject: NSRulerMarker question
- From: Graham Cox <email@hidden>
- Date: Thu, 22 Nov 2012 12:22:49 +1100
Hi all,
I'm adding ruler markers to a horizontal ruler view, and setting the client of the ruler to my custom view. When I drag the ruler markers, the client view receives the client messages as documented.
What I want to do is move a vertical line in my view as the marker moves. So, when I get the 'willmove' message, I invalidate the old and new locations. My drawRect method then should draw the lines based on the list of markers. While I see my -drawRect method getting called, and know it draws the right thing in the normal case, during marker dragging nothing happens (i.e. the old line is never erased and the new line never drawn).
The standard NSRulerMarker draws a black line in the client view as it is dragged. This comes 'for free' but I wonder how on earth it works. There is also no way to customise it that I can see. I'm wondering if this behaviour is interfering with view updates in my client view, but since it's not mentioned in the documentation I can only speculate. It seems to me NSRulerMarker is set up for its use in NSTextView and though the design seems to be fine for the more general case, in actual use the extra undocumented behaviours baked into it for use in a text view make it hard to use and not work as documented.
So, simple question: how can I keep an associated line in my client view moving as I drag a ruler marker?
relevant parts of the code:
- (CGFloat) rulerView:(NSRulerView*) aRulerView willMoveMarker:(NSRulerMarker*) aMarker toLocation:(CGFloat) location
{
CGFloat oldLocation = [aMarker markerLocation];
// update the view where the old marker line was drawn
NSRect br = [self bounds];
br.origin.x = oldLocation - 1.0;
br.size.width = 2.0;
[self setNeedsDisplayInRect:br];
return location;
}
- (void) awakeFromNib
{
NSScrollView* sv = [self enclosingScrollView];
[sv setHasHorizontalRuler:YES];
NSRulerView* rv = [[self enclosingScrollView] horizontalRulerView];
[rv setClientView:self];
[sv setRulersVisible:YES];
// set up a ruler marker to represent events
[self addEventMarkerAtTime:1.0 forKey:@"One Second"]; // creates NSRulerMarker and adds it to ruler view
}
// called within -drawRect: method of the view after erasing to the background colour
- (void) drawEventMarkers
{
NSArray* markers = [[[self enclosingScrollView] horizontalRulerView] markers];
for( NSRulerMarker* marker in markers )
[self drawEventMarker:marker];
}
- (void) drawEventMarker:(NSRulerMarker*) marker
{
CGFloat pos = [marker markerLocation];
NSPoint a, b;
NSRect br = [self bounds];
a.x = b.x = pos;
a.y = NSMinY( br );
b.y = NSMaxY( br );
[NSBezierPath setDefaultLineWidth:0.75];
[[NSColor yellowColor] set];
[NSBezierPath strokeLineFromPoint:a toPoint:b];
}
_______________________________________________
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