Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Whats the correct way to calculate point in view that mouse was clicked

I have a custom subclass of NSView in my app. I would like to know the exact point in the view, relative to it's origin, that was clicked with the mouse. (i.e. Not relative to the Window origin, but relative to the custom-view origin).

I have always used this, which has worked perfectly:

-(void)mouseDown:(NSEvent *)theEvent
{
    NSPoint screenPoint = [NSEvent mouseLocation];
    NSPoint windowPoint = [[self window] convertScreenToBase:screenPoint];
    NSPoint point = [self convertPoint:windowPoint fromView:nil];

    _pointInView = point;

    [self setNeedsDisplay:YES];
}

But now I get a warning that convertScreenToBase is deprecated and to use convertRectFromScreen instead. However I cannot get the same results from convertRectFromScreen, and anyway, I'm interested in a point, not a rect!

What should I use as the correct replacement for the deprecated code above? Thanks in advance!

like image 612
Kenny Avatar asked Dec 11 '22 23:12

Kenny


2 Answers

This line from your code:

    NSPoint screenPoint = [NSEvent mouseLocation];

gets the location of the mouse cursor out of sync with the event stream. It's not the position of the event you're currently handling, which was a short time in the past; it's the position of the cursor right now, which means you're potentially skipping past some important stuff. You should almost always use the position in sync with the event stream.

To do that, use the theEvent parameter that your method receives. NSEvent has a locationInWindow property, which has already been translated to the coordinates of the window which receives it. That eliminates the need for you to convert it.

    NSPoint windowPoint = [theEvent locationInWindow];    

Your code to convert the window location to the view's coordinate system is fine.

like image 189
Ken Thomases Avatar answered Mar 15 '23 23:03

Ken Thomases


I found the solution:

NSPoint screenPoint = [NSEvent mouseLocation];
NSRect screenRect = CGRectMake(screenPoint.x, screenPoint.y, 1.0, 1.0);
NSRect baseRect = [self.window convertRectFromScreen:screenRect];
_pointInView = [self convertPoint:baseRect.origin fromView:nil];
like image 32
Kenny Avatar answered Mar 15 '23 23:03

Kenny