oldman
oldman

Reputation: 145

Reading right mouse clicks number of clicks

I have been experimenting with mouse clicks. I am ok with left mouse clicks getting raw values etc etc. I now want to add right mouse clicks. I have setup a basic example. What i would like to achieve if there is one mouse right click it performs one function, and if there is two mouse right clicks it performs a different function. The problem is if you do two mouse clicks it obviously cannot differentiate between the two and so fire the one mouse click function before performing the second mouse function. I was thinking of maybe using a timer of some sort to record the number of click. But i end up going round in circles as i just seem to start the timers over and over. I'm hoping some one might help. thanks for reading here is the code.

Xcode 8 Swift 3 Mac OSX Sierra NOT IOS.. NOT IOS

 import Cocoa

class MainWindowController: NSWindowController {

    @IBOutlet weak var MyView: NSView!

    override func windowDidLoad() {
        super.windowDidLoad()

        //Initialize mouse for Right Click numberOfClicksRequired = 1
        let recogRightClick1 = NSClickGestureRecognizer(target: self, action: #selector(oneMouseClick))
        recogRightClick1.buttonMask = 0x2
        recogRightClick1.numberOfClicksRequired = 1
        MyView.addGestureRecognizer(recogRightClick1)

        //Initialize mouse for Right ClicknumberOfClicksRequired = 2
        let recogRightClick2 = NSClickGestureRecognizer(target: self, action: #selector(twoMouseClick(myrec:myRightClick:)))
        recogRightClick2.buttonMask = 0x2
        recogRightClick2.numberOfClicksRequired = 2
        MyView.addGestureRecognizer(recogRightClick2)
    }//EO Overide


    func oneMouseClick(myrec: NSPanGestureRecognizer,myRightClick:NSClickGestureRecognizer){
        let rightClick = myRightClick.state.rawValue
        print("oneMouseClick",rightClick)
    }


    func twoMouseClick(myrec: NSPanGestureRecognizer,myRightClick:NSClickGestureRecognizer){
        let rightClick = myRightClick.state.rawValue
        print("twoMouseClick",rightClick)
    }


}//EnD oF thE wORld

UPDATE

I have re generated the code following the advice given. Now the code reflects more of what i wanted to do. My only problem is that I would like all the mouse operations to be triggered only inside 'myView' rather than within the main window. I thought it might have something to do with first responder but that doesn't seem to work. Again any thought would be appreciated. Please excuse any bad code i'm self taught.

Xcode 8 Swift 3 Mac OSX Sierra NOT IOS.. NOT IOS

import Cocoa

class MainWindowController: NSWindowController {

    @IBOutlet weak var myView: NSView!
    var mouseX:CGFloat = 0
    var mouseY:CGFloat = 0

    override func windowDidLoad() {
        myView.window?.becomeFirstResponder()
        myView.window?.acceptsMouseMovedEvents = true
        super.windowDidLoad()

        myView.wantsLayer = true
        myView.layer?.backgroundColor = CGColor(red: 0.05, green: 0.57, blue: 0.80, alpha: 0.6)

        NSEvent.addLocalMonitorForEvents(matching:.leftMouseDown){
            self.mouseEventFunction(data: 1)
            return $0
        }

        NSEvent.addLocalMonitorForEvents(matching:.leftMouseUp){
            self.mouseEventFunction(data:2)
            return $0
        }

        NSEvent.addLocalMonitorForEvents(matching:.rightMouseDown){
            self.mouseEventFunction(data: 3)
            return $0
        }

        NSEvent.addLocalMonitorForEvents(matching:.rightMouseUp){
            self.mouseEventFunction(data: 4)
            return $0
        }


        NSEvent.addLocalMonitorForEvents(matching:.mouseMoved) {
            self.mouseX = NSEvent.mouseLocation().x
            self.mouseY = NSEvent.mouseLocation().y
            return $0 }

    }//EO Overide



    func mouseEventFunction (data: Int){
        switch data{
        case 1 :
            print("LeftMouseDown")
        case 2 :
            print("LeftMouseUp")
        case 3 :
            print("RightMouseDown")
        case 3 :
            print("RightMouseUP")
        default: break
                    }

        if data == 1 {print("mouseX",mouseX,"mouseY",mouseY)}

    }//eo mouseEvent



}//EnD oF thE wORld

UPDATE 2 I have now updated subClassing the view controller, so the mouse clicks are now only working in myView. I'm still having problems with 'func mouseDragged' What i need to achieve is the bottom left of my view is x = 0 and Y = 0. I had a try with converting but thats not working. hoping someone might guide me. thanks for reading here is the updated code.

Xcode 8 Swift 3 Mac OSX Sierra NOT IOS.. NOT IOS

import Cocoa

class MainWindowController: NSWindowController {

    @IBOutlet weak var myView: NSView!

    override func windowDidLoad() {
        myView.window?.becomeFirstResponder()
        myView.window?.acceptsMouseMovedEvents = true
        window?.contentView?.addSubview(myView)
        super.windowDidLoad()

    }//EO Overide


}//EnD oF thE wORld


class testView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        let backgroundColor = NSColor.lightGray
        backgroundColor.set()
        NSBezierPath.fill(bounds)
    }

    override func mouseDragged(with theEvent: NSEvent) {
        let myLocationInWindow = theEvent.locationInWindow
        let location = convert(myLocationInWindow, to: self)
        Swift.print("myLocationInWindow",myLocationInWindow,"location",location)
    }

    override func mouseDown(with theEvent: NSEvent) {
        Swift.print("mouseDown")
    }

    override func mouseUp(with theEvent: NSEvent) {
        Swift.print("mouseUp clickCount: \(theEvent.clickCount)")
    }


}//eo testView

Upvotes: 0

Views: 669

Answers (1)

oldman
oldman

Reputation: 145

To define mouse inside view you use

let myLocationInWindow = theEvent.locationInWindow
let location = convert(myLocationInWindow, from: nil)

where nil is the window

here is the final code

import Cocoa

class MainWindowController: NSWindowController {

    @IBOutlet weak var myView: NSView!

    override func windowDidLoad() {
        super.windowDidLoad()
    }//EO Overide


}//EnD oF thE wORld


class testView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        let backgroundColor = NSColor.lightGray
        backgroundColor.set()
        NSBezierPath.fill(bounds)
    }

    override func mouseDragged(with theEvent: NSEvent) {
        let myLocationInWindow = theEvent.locationInWindow
        let location = convert(myLocationInWindow, from: nil)
        Swift.print("location",location)
    }

    override func mouseDown(with theEvent: NSEvent) {
        Swift.print("mouseDown")
    }

    override func mouseUp(with theEvent: NSEvent) {
        Swift.print("mouseUp clickCount: \(theEvent.clickCount)")
    }

}//eo testView

Upvotes: 1

Related Questions