progrium / darwinkit

Native Mac APIs for Go. Previously known as MacDriver
MIT License
4.99k stars 158 forks source link

Getting the sender of an event #160

Closed programmingkidx closed 1 year ago

programmingkidx commented 1 year ago

In Objective-C the action method to a control like a button has a sender argument that lets the method know who sent the event. Is something like this possible in MacDriver? I made a program that display buttons in a grid and I want to print out the name of the button that generated an event. Here is the program:

package main

import "github.com/progrium/macdriver/cocoa"
import "github.com/progrium/macdriver/objc"
import "github.com/progrium/macdriver/core"
import "fmt"

func main() {

    myclass := objc.NewClass("MyClass", "NSObject")
    myclass.AddMethod("doButton:", doButton)
    objc.RegisterClass(myclass)
    myobj := objc.Get("MyClass").Alloc()

    app := cocoa.NSApp_WithDidLaunch(func(n objc.Object) {
            win := cocoa.NSWindow_New()
            win.SetTitle("NSButton")
            winRect := core.NSMakeRect(20, 20, 700, 300)
            win.SetFrameDisplay(winRect, true)
            win.MakeKeyAndOrderFront(nil)

            /* NSButton code */
            buttonWidth := 70.0
            buttonHeight := 30.0
            for y := 0; y < 10; y++ {
                for x := 0; x < 10; x++ {
                    rect := core.NSMakeRect(float64(x) * buttonWidth, float64(y) * buttonHeight, buttonWidth, buttonHeight)
                    button := cocoa.NSButton_Alloc()
                    button.InitWithFrame(rect)
                    newTitle := fmt.Sprintf("%dx%d", x, y)
                    button.SetTitle(newTitle)
                    button.SetTarget(myobj)
                    button.SetAction(objc.Sel("doButton:"))
                    win.ContentView().AddSubview(button)
                }
            }
        })

        app.SetActivationPolicy(cocoa.NSApplicationActivationPolicyRegular)
        app.ActivateIgnoringOtherApps(true)
        app.Run()
}

func doButton(button objc.Object) {
    fmt.Println("Button pressed:", button)
}

The window this program displays looks like this:

grid

Can the doButton() function's argument somehow tell who sent the event? Currently the argument is set to a MyClass class instance.