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)