Code: Select all
EnableExplicit
#NSSegmentSwitchTrackingSelectOne = 0
#NSSegmentSwitchTrackingSelectAny = 1
#NSSegmentSwitchTrackingMomentary = 2
#NSToolbarSizeModeRegular = 1
ImportC ""
sel_registerName(MethodName.S)
class_addMethod(Class.I, Selector.I, Implementation.I, Types.S)
EndImport
Define GadgetID.I
Define ItemArray.I
Define ItemSize.NSSize
Define SegmentedCell.I
Define SegmentedControl.I
Define ToolbarItem.I
Procedure.S ConvertToUTF8(String.S)
Protected UTF8String.S = Space(StringByteLength(String))
PokeS(@UTF8String, String, -1, #PB_UTF8)
ProcedureReturn UTF8String
EndProcedure
ProcedureC ToolBarCallback(Object.I, Selector.I, Sender.I)
Shared SegmentedControl.I
If Sender = SegmentedControl
Debug "Selected segment = " + CocoaMessage(0, Sender, "selectedSegment")
EndIf
EndProcedure
Procedure SetToolBarCallback(Callback.I, Control.I)
Protected AppDelegate.I
Protected DelegateClass.I
AppDelegate = CocoaMessage(0, CocoaMessage(0, 0,
"NSApplication sharedApplication"), "delegate")
DelegateClass.I = CocoaMessage(0, AppDelegate, "class")
class_addMethod(DelegateClass,
sel_registerName(ConvertToUTF8("forwardAction:")), Callback,
ConvertToUTF8("v@:@"))
CocoaMessage(0, Control, "setAction:",
sel_registerName(ConvertToUTF8("forwardAction:")))
EndProcedure
OpenWindow(0, 270, 100, 395, 220, "ToolBar with SegmentedControl",
#PB_Window_SystemMenu | #PB_Window_Invisible)
FrameGadget( 0, 10, 10, 170, 185, "Button style")
OptionGadget( 1, 20, 35, 150, 22, "Rounded")
OptionGadget( 2, 20, 60, 150, 22, "Textured + rounded")
OptionGadget( 3, 20, 85, 150, 22, "Rounded rectangle")
OptionGadget( 4, 20, 110, 150, 22, "Textured + squared")
OptionGadget( 5, 20, 135, 150, 22, "Capsule")
OptionGadget( 6, 20, 160, 150, 22, "Small + squared")
SetGadgetState(1, #True)
FrameGadget( 7, 190, 10, 195, 115, "Selection behaviour")
OptionGadget( 8, 200, 35, 175, 22, "Only one always selected")
OptionGadget( 9, 200, 60, 175, 22, "Multiple always selected")
OptionGadget(10, 200, 85, 175, 22, "One momentarily selected")
SetGadgetState(8, #True)
; ----- Define SegmentedControl
SegmentedControl = CocoaMessage(0, 0, "NSSegmentedControl new")
CocoaMessage(0, SegmentedControl,
"setSegmentCount:", 4)
CocoaMessage(0, SegmentedControl,
"setImage:", CocoaMessage(0, 0, "NSImage imageNamed:$", @"NSGoLeft"),
"forSegment:", 0)
CocoaMessage(0, SegmentedControl,
"setImage:", CocoaMessage(0, 0, "NSImage imageNamed:$", @"NSGoRight"),
"forSegment:", 1)
CocoaMessage(0, SegmentedControl,
"setImage:", CocoaMessage(0, 0, "NSImage imageNamed:$", @"NSQuickLook"),
"forSegment:", 2)
CocoaMessage(0, SegmentedControl,
"setImage:", CocoaMessage(0, 0, "NSImage imageNamed:$", @"NSAction"),
"forSegment:", 3)
CocoaMessage(0, SegmentedControl,
"setSelected:", #YES,
"forSegment:", 2)
SetToolBarCallback(@ToolBarCallback(), SegmentedControl)
SegmentedCell = CocoaMessage(0, SegmentedControl, "cell")
; ----- Create empty dummy image
CreateImage(0, 24, 24)
; ----- Create standard ToolBar
CreateToolBar(0, WindowID(0))
; ----- Change size of ToolBar to larger icons
CocoaMessage(0, ToolBarID(0), "setSizeMode:", #NSToolbarSizeModeRegular)
; ----- Add button with empty dummy image to ToolBar
ToolBarImageButton(0, ImageID(0))
; ----- Get item object of ToolBar button
ItemArray = CocoaMessage(0, ToolBarID(0), "items")
ToolbarItem = CocoaMessage(0, ItemArray, "objectAtIndex:", 0)
; ----- Replace ToolBar button with SegmentedControl
CocoaMessage(0, ToolbarItem, "setView:", SegmentedControl)
; ----- Change ToolBar button size to SegmentedControl's size
ItemSize\width = 150
ItemSize\height = 24
CocoaMessage(0, ToolbarItem, "setMaxSize:@", @ItemSize)
CocoaMessage(0, ToolbarItem, "setMinSize:@", @ItemSize)
; ----- Make window visible now in order to hide previous ToolBar modification
HideWindow(0, #False)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
GadgetID = EventGadget()
Select GadgetID
Case 1 To 6
CocoaMessage(0, SegmentedControl, "setSegmentStyle:", GadgetID)
Case 8 To 10
CocoaMessage(0, SegmentedCell,
"setTrackingMode:", GadgetID - 8)
EndSelect
EndSelect
ForEver
I have further expanded the example by also allowing to change the selection behaviour of the buttons. It's now possible to