TrackBarGadget event

Mac OSX specific forum
Wolfram
Enthusiast
Enthusiast
Posts: 610
Joined: Thu May 30, 2013 4:39 pm

TrackBarGadget event

Post by Wolfram »

How can I get an event from a TrackBarGadget?
In this example I get the event tree times.

Is there a way to check the mouse button release?

Thanks for help

Code: Select all

If OpenWindow(0, 0, 0, 320, 200, "TrackBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TrackBarGadget(0, 10,  40, 250, 20, 0, 10, #PB_TrackBar_Ticks)
  
  
  Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            Debug GetGadgetState(0)
        EndSelect
      Case  #PB_Event_CloseWindow
        close = #True
    EndSelect
    
  Until close = #True
EndIf
macOS Catalina 10.15.7
User avatar
Danilo
Addict
Addict
Posts: 3036
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: TrackBarGadget event

Post by Danilo »

Wolfram wrote:How can I get an event from a TrackBarGadget?
In this example I get the event tree times.
Actually you get more events when you move more ticks.

1st event seems to be mouse button down.
Next events are one event for each tick moved.
Last event seems to be mouse button up event.

Unfortunately EventType() is not supported for TrackBarGadget.

You see the behavior better when using BindGadgetEvent() and doing it slowly:
- mouse button down -> event fired
- move slider -> event for each movement
- mouse button up -> event fired

Doing event handling in the main event loop, all this events get collected
and fire after releasing the mouse button. So you get at least 3 events,
and if you move more ticks, you get even more events.

Code: Select all

Procedure onTrackbarChange()
    Debug "State: "+GetGadgetState(0)+" EventType: "+EventType()
EndProcedure

If OpenWindow(0, 0, 0, 320, 200, "TrackBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TrackBarGadget(0, 10,  40, 250, 20, 0, 10, #PB_TrackBar_Ticks)
  
  BindGadgetEvent(0,@onTrackbarChange())
  
  Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            ;Debug "State: "+GetGadgetState(0)+" EventType: "+EventType()
        EndSelect
      Case  #PB_Event_CloseWindow
        close = #True
    EndSelect
    
  Until close = #True
EndIf
User avatar
Shardik
Addict
Addict
Posts: 2076
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: TrackBarGadget event

Post by Shardik »

Wolfram wrote:How can I get an event from a TrackBarGadget?
In this example I get the event tree times.

Is there a way to check the mouse button release?
With a small trick you will only obtain a single event on releasing the left mouse button:

Code: Select all

EnableExplicit

#NSLeftMouseUp     = 2
#NSLeftMouseUpMask = 1 << #NSLeftMouseUp

OpenWindow(0, 270, 100, 280, 100, "Detect release of mouse button")
TrackBarGadget(0, 10, 40, WindowWidth(0) - 20, 25, 1, 20, #PB_TrackBar_Ticks)
CocoaMessage(0, GadgetID(0), "sendActionOn:", #NSLeftMouseUpMask)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0
        Debug "Left mouse button released on value " + Str(GetGadgetState(0))
      EndIf
  EndSelect
ForEver
Post Reply