Well, that was a simple question which took quite some thinking to figure out a solution.
I think this will do the trick ...
Code: Select all
;Import "-stdlib=libc++ -mmacosx-version-min=10.7" : EndImport
;- Callbacks
ProcedureC _mouseEntered_(obj, sel, event)
Protected GadgetNumber.i
object_getInstanceVariable_(obj, "_gadget", @GadgetNumber)
Debug "entered [" + Str(GadgetNumber) + "]"
EndProcedure
ProcedureC _mouseExited_(obj, sel, event)
Protected GadgetNumber.i
object_getInstanceVariable_(obj, "_gadget", @GadgetNumber)
Debug "exited [" + Str(GadgetNumber) + "]"
EndProcedure
ProcedureC _mouseMoved_(obj, sel, event)
Protected GadgetNumber.i
object_getInstanceVariable_(obj, "_gadget", @GadgetNumber)
Debug "moved [" + Str(GadgetNumber) + "]"
EndProcedure
;- Create myGadgetTracker class
Procedure InitTracker()
Protected trackerClass.i = objc_allocateClassPair_(objc_getClass_("NSTrackingArea"), "myGadgetTracker", 20)
class_addMethod_(trackerClass, sel_registerName_("mouseEntered:"), @_mouseEntered_(), "v@:@")
class_addMethod_(trackerClass, sel_registerName_("mouseExited:"), @_mouseExited_(), "v@:@")
class_addMethod_(trackerClass, sel_registerName_("mouseMoved:"), @_mouseMoved_(), "v@:@")
CompilerIf SizeOf(Integer) = 8
class_addIvar_(trackerClass, "_gadget", 8, 3, "q"); add .q variable named gadget
CompilerElse
class_addIvar_(trackerClass, "_gadget", 4, 2, "l"); add .l variable named gadget
CompilerEndIf
objc_registerClassPair_(trackerClass)
EndProcedure
InitTracker()
;- TrackGadget procedure
Procedure TrackGadget(GadgetNumber.i)
Protected ZeroRect.NSRect, TA.i = CocoaMessage(0, 0, "myGadgetTracker alloc")
CocoaMessage(0, TA, "initWithRect:@", @ZeroRect, "options:", $643, "owner:", TA, "userInfo:", 0)
object_setInstanceVariable_(TA, "_gadget", GadgetNumber)
CocoaMessage(0, GadgetID(GadgetNumber), "addTrackingArea:", TA)
ProcedureReturn TA
EndProcedure
; *** test ***
OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(0, 10, 10, 200, 20, "Standard Button")
ButtonGadget(1, 10, 40, 200, 20, "Left Button", #PB_Button_Left)
ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right)
ButtonGadget(3, 10,100, 200, 60, "Multiline Button (longer text gets automatically wrapped)", #PB_Button_MultiLine)
ButtonGadget(4, 10,170, 200, 20, "Toggle Button", #PB_Button_Toggle)
TrackGadget(0)
TrackGadget(1)
TrackGadget(2)
TrackGadget(3)
TrackGadget(4)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow