Re: ListIconGadget: No #PB_EventType_Change!
Posted: Sun Aug 07, 2016 8:09 am
I have taken Lebostein's example, stripped off all specific Linux and Windows code for a clearer outline (so now it's only runnable on MacOS) and implemented a second callback for the method tableViewSelectionDidChange: to catch and signal all selection changes in both of the two ListIconGadgets.
I have tested the example successfully on MacOS 10.6.8 (Snow Leopard) and MacOS 10.11.6 (El Capitan) with PB 5.43 x86 and x64 (ASCII and Unicode mode) and with PB 5.50 x86 and x64.
I have tested the example successfully on MacOS 10.6.8 (Snow Leopard) and MacOS 10.11.6 (El Capitan) with PB 5.43 x86 and x64 (ASCII and Unicode mode) and with PB 5.50 x86 and x64.
Code: Select all
EnableExplicit
ImportC ""
sel_registerName(MethodName.P-ASCII)
class_addMethod(Class.I, Selector.I, Implementation.I, Types.P-ASCII)
EndImport
Structure CallbackEntry
WindowID.I
ListIconID.I
DefaultCallback.I
EndStructure
Define AppDelegate.I = CocoaMessage(0,
CocoaMessage(0, 0, "NSApplication sharedApplication"), "delegate")
Define DelegateClass.I = CocoaMessage(0, AppDelegate, "class")
Define NotificationCenter.I = CocoaMessage(0, 0,
"NSNotificationCenter defaultCenter")
NewList CallbackEntry.CallbackEntry()
ProcedureC ColumnHeaderClickCallback(Object.I, Selector.I, TableView.I,
TableColumn.I)
Shared CallbackEntry()
Protected ClickedHeaderColumn.I
ForEach CallbackEntry()
If TableView = GadgetID(CallbackEntry()\ListIconID)
Break
EndIf
Next
ClickedHeaderColumn = Val(PeekS(CocoaMessage(0,
CocoaMessage(0, TableColumn, "identifier"),
"UTF8String"), -1, #PB_UTF8))
PostEvent(#PB_Event_Gadget, CallbackEntry()\WindowID,
CallbackEntry()\ListIconID, #PB_EventType_LeftClick,
ClickedHeaderColumn + 1)
EndProcedure
ProcedureC SelectionDidChangeCallback(Object.I, Selector.I, Notification.I)
Shared CallbackEntry()
Static ChangeSignalled.I
If ChangeSignalled
PostEvent(#PB_Event_Gadget, CallbackEntry()\WindowID,
CallbackEntry()\ListIconID, #PB_EventType_Change)
ChangeSignalled = #False
Else
ChangeSignalled = #True
EndIf
EndProcedure
Procedure SetGadgetCallback(WindowID.I, ListIconID.I)
Shared AppDelegate.I
Shared CallbackEntry()
Shared DelegateClass.I
Shared NotificationCenter.I
AddElement(CallbackEntry())
CallbackEntry()\WindowID = WindowID
CallbackEntry()\ListIconID = ListIconID
; ----- Initialize callback for changing selection
class_addMethod(DelegateClass,
sel_registerName("tableViewSelectionDidChange:"),
@SelectionDidChangeCallback(), "v@:@")
CocoaMessage(0, NotificationCenter,
"addObserver:", AppDelegate,
"selector:", sel_registerName("tableViewSelectionDidChange:"),
"name:$", @"NSTableViewSelectionDidChangeNotification",
"object:", GadgetID(CallbackEntry()\ListIconID))
; ----- Initialize callback for header click
class_addMethod(DelegateClass,
sel_registerName("tableView:didClickTableColumn:"),
@ColumnHeaderClickCallback(), "v@:@@")
CocoaMessage(0, GadgetID(CallbackEntry()\ListIconID),
"setDelegate:", AppDelegate)
EndProcedure
; ========================================== SPECIFIC CODE FOR TESTING
Enumeration
#zero
#windows_nb
#list1_nb
#list2_nb
EndEnumeration
#Title_column1$ = "Name"
#Title_column2$ = "Address"
Define GadgetID.I
OpenWindow(#windows_nb, 0, 0, 870, 110, "Detect left click on header cell",
#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(#list1_nb, 10, 10, 420, WindowHeight(#windows_nb) - 20,
#Title_column1$, 110, #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#list1_nb, 1, #Title_column2$, 300)
AddGadgetItem(#list1_nb, -1, "Harry Rannit" + #LF$ +
"12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(#list1_nb, -1, "Ginger Brokeit"+ #LF$ +
"130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(#list1_nb, -1, "Didi Foundit"+ #LF$ +
"321 Logo Drive, Mouse House, Downtown")
ListIconGadget(#list2_nb, 440, 10, 420, WindowHeight(#windows_nb) - 20,
#Title_column1$, 110, #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#list2_nb, 1, #Title_column2$, 300)
AddGadgetItem(#list2_nb, -1, "Harry Rannit" + #LF$ +
"12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(#list2_nb, -1, "Ginger Brokeit"+ #LF$ +
"130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(#list2_nb, -1, "Didi Foundit"+ #LF$ +
"321 Logo Drive, Mouse House, Downtown")
SetGadgetCallback(#windows_nb, #list1_nb)
SetGadgetCallback(#windows_nb, #list2_nb)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
GadgetID = EventGadget()
Select GadgetID
Case #list1_nb, #list2_nb
Select EventType()
Case #PB_EventType_LeftClick
If EventData()
Debug "Left click on header of column " + Str(EventData() - 1) +
", Gadget " + Str(GadgetID)
Else
Debug "-> Left click on row " + Str(GetGadgetState(GadgetID)) +
", Gadget " + Str(GadgetID)
EndIf
Case #PB_EventType_Change
Debug "Selected row changed:"
EndSelect
EndSelect
EndSelect
ForEver
CocoaMessage(0, NotificationCenter, "removeObserver:", AppDelegate)