ListIconGadget column

Just starting out? Need help? Post your questions and find answers here.
epog10
User
User
Posts: 93
Joined: Sat May 29, 2010 11:46 am
Location: UK

ListIconGadget column

Post by epog10 »

Must be having a bad day be cause I cannot find the following in the Help file or in the Forum.

Surely there is a simple command that returns the row/column that was clicked in a ListIconGadget?

A variation of GetGadgetState that only returns the row when column 0 is clicked?
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 456
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: ListIconGadget column

Post by Mindphazer »

GetGadgetItemState ?
MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
User avatar
falsam
Enthusiast
Enthusiast
Posts: 632
Joined: Wed Sep 21, 2011 9:11 am
Location: France
Contact:

Re: ListIconGadget column

Post by falsam »

epog10 wrote:Surely there is a simple command that returns the row/column that was clicked in a ListIconGadget?
No.

There is no native functionality for detecting a selected cell.

The only option is THE CallBack.

Code: Select all

Enumeration
  #MainForm
EndEnumeration

Enumeration Gadget
  #MyListIcon
EndEnumeration


Procedure OnListIconCLick(WindowID, message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents 
  
  Select message
    Case #WM_NOTIFY
      *nmITEM.NMITEMACTIVATE = lParam
      Select *nmITEM\hdr\code
          
        Case #LVN_COLUMNCLICK ;/ HeaderClick
          If *nmITEM\hdr\hwndFrom = GadgetID(#MyListIcon) ;/ ListIconGadget
            Debug " header col = " + Str(*nmITEM\iSubItem)
            Result = #True
          EndIf
          
        Case #NM_CLICK ;/ CellClick (Your question)
          If *nmITEM\hdr\hwndFrom = GadgetID(#MyListIcon) ;/ ListIconGadget
            Debug "row = " + Str(*nmITEM\iItem) + ", col = "+Str(*nmITEM\iSubItem) + ", content = "+ GetGadgetItemText(#MyListIcon, *nmITEM\iItem,*nmITEM\iSubItem)
            Result = #True
          EndIf
          
        Case #NM_DBLCLK 
          Debug "left doubleclick"
          ;Your code
          
        Case #NM_RCLICK
          Debug "right click"
          ;Your code
          
        Case #NM_RDBLCLK
          Debug "right doubleclick"
          ;Your code
          
      EndSelect
  EndSelect
  ProcedureReturn Result 
EndProcedure

Procedure Start()
  Protected n, Buffer.s
  
  OpenWindow(#MainForm, 0, 0, 500, 500, "Listicon gadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  SetWindowCallback(@OnListIconCLick(), #MainForm)
  
  ListIconGadget(#MyListIcon, 10, 10, 480, 400, "Col 0", 100, #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#MyListIcon, 1, "Col 1", 100)
  AddGadgetColumn(#MyListIcon, 2, "Col 2", 100)
  
  For n=0 To 10
    Buffer = "Item " + Str(n) + Chr(10) + "Result Col 1=" + Str(n)  + Chr(10) + "Result Col 2=" + Str(n)
    AddGadgetItem(#MyListIcon, -1, Buffer)
  Next

  Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndProcedure

Start()

➽ Windows 11 64-bit - PB 6.21 x64 - AMD Ryzen 7 - NVIDIA GeForce GTX 1650 Ti

Sorry for my bad english and the Dunning–Kruger effect 🤪
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIconGadget column

Post by RASHAD »

Hi

# 1 :
Crazy idea looks to me a cross platform solution(can be managed to be faster)

Code: Select all

OpenWindow(0,0,0,640,480,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered) 
ListIconGadget(0,10,10,620,460,"",0,#PB_ListIcon_GridLines| #PB_ListIcon_FullRowSelect) 
    AddGadgetColumn(0,1,"Column 1",210) 
    AddGadgetColumn(0,2,"Column 2",200) 
    AddGadgetColumn(0,3,"Column 3",200) 
    For i = 0 To 16 
      linestr.s = LSet(Str(i),3," ") 
      AddGadgetItem(0, -1, Chr(10)+"Text on Line "+linestr+" in Column 1"+Chr(10)+"Text on Line "+linestr+" in Column 2"+Chr(10)+"Text on Line "+linestr+" in Column 3") 
    Next
    
   BColor = GetGadgetColor(0, #PB_Gadget_BackColor)
   FColor = GetGadgetColor(0, #PB_Gadget_FrontColor)
   HColor = $FF9933

    
    Dim Cell(3)

Repeat
  Select  WaitWindowEvent()
        Case #PB_Event_CloseWindow
               Quit = 1               
        
               
        Case #PB_Event_Gadget
              Select EventGadget()
                    Case 0
                         Select EventType()
                                        
                                Case #PB_EventType_LeftClick
                                        Row = GetGadgetState(0)
                                        SetGadgetState(0,-1)
                                        Cell(0) = GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,0) +GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,1)
                                        Cell(1) = cell(0) + GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,2)
                                        Cell(2) = Cell(1) +GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,3) 
                                        If WindowMouseX(0) < Cell(0)
                                            Column = 1
                                        ElseIf WindowMouseX(0) > Cell(0) And WindowMouseX(0) < Cell(1)
                                            Column = 2
                                        Else
                                            Column = 3
                                        EndIf
                                        SetGadgetItemColor(0,OldRow,#PB_Gadget_FrontColor,FColor ,OldColumn)
                                        SetGadgetItemColor(0,OldRow, #PB_Gadget_BackColor, BColor,OldColumn)
                                        SetGadgetItemColor(0,Row,#PB_Gadget_FrontColor,$FFFFFF ,Column)
                                        SetGadgetItemColor(0,Row, #PB_Gadget_BackColor,HColor,Column)
                                        OldRow = Row
                                        OldColumn = Column

                         EndSelect
              EndSelect
  EndSelect
Until Quit = 1

#2 :
Subclass the ListIcon Gadget

Code: Select all

Global oldCallback,Oldr,Oldc,pInfo.LVHITTESTINFO

Procedure LIcallback(hWnd, uMsg, wParam, lParam) 
  result = CallWindowProc_(oldCallback, hWnd, uMsg, wParam, lParam)
  Select uMsg
   Case #WM_LBUTTONDOWN    
    pInfo\pt\x = (lParam & $FFFF) 
    pInfo\pt\y = (lParam>> 16 & $FFFF) 
    SendMessage_(GadgetID(0),#LVM_SUBITEMHITTEST,0,@pInfo)
    SetGadgetItemColor(0,OLdr,#PB_Gadget_FrontColor,#Black , Oldc)
    SetGadgetItemColor(0,Oldr, #PB_Gadget_BackColor, GetSysColor_(#COLOR_WINDOW),Oldc)
    SetGadgetItemColor(0,pInfo\iItem,#PB_Gadget_FrontColor, #White ,pInfo\iSubItem)
    SetGadgetItemColor(0,pInfo\iItem, #PB_Gadget_BackColor,GetSysColor_(#COLOR_HIGHLIGHT), pInfo\iSubItem)    
    Oldr = pInfo\iItem
    Oldc = pInfo\iSubItem
    Debug "Row :"+Str(Oldr)
    Debug "Column :"+Str(Oldc)
    Debug GetGadgetItemText(0, pInfo\iItem,pInfo\iSubItem)

  EndSelect
  ProcedureReturn result 
EndProcedure 

OpenWindow(0,0,0,640,480,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered) 
ListIconGadget(0,10,10,620,460,"",0,#PB_ListIcon_GridLines) 
    AddGadgetColumn(0,1,"Column 1",210) 
    AddGadgetColumn(0,2,"Column 2",200) 
    AddGadgetColumn(0,3,"Column 3",200) 
    For i = 0 To 16 
      linestr.s = LSet(Str(i),3," ") 
      AddGadgetItem(0, -1, Chr(10)+"Text on Line "+linestr+" in Column 1"+Chr(10)+"Text on Line "+linestr+" in Column 2"+Chr(10)+"Text on Line "+linestr+" in Column 3") 
    Next

oldCallback = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @LIcallback())

Repeat
  Event = WaitWindowEvent()

Until event = #PB_Event_CloseWindow
Edit :Code modified
Last edited by RASHAD on Tue Jan 27, 2015 10:21 pm, edited 1 time in total.
Egypt my love
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIconGadget column

Post by RASHAD »

Another way for doing it

Code: Select all

OpenWindow(0,0,0,640,480,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered) 
ListIconGadget(0,10,10,620,460,"",0,#PB_ListIcon_GridLines)
SetGadgetColor(0, #PB_Gadget_BackColor,$D5FEFB)
SetGadgetColor(0, #PB_Gadget_FrontColor,$FD1E20)
    AddGadgetColumn(0,1,"Column 1",210) 
    AddGadgetColumn(0,2,"Column 2",200) 
    AddGadgetColumn(0,3,"Column 3",200) 
    For i = 0 To 16 
      linestr.s = LSet(Str(i),3," ") 
      AddGadgetItem(0, -1, Chr(10)+"Text on Line "+linestr+" in Column 1"+Chr(10)+"Text on Line "+linestr+" in Column 2"+Chr(10)+"Text on Line "+linestr+" in Column 3") 
    Next
 
    StartDrawing(WindowOutput(0))
       DrawingFont(GetGadgetFont(0))
       RowHeight = TextHeight("W") + 4
    StopDrawing()

    Dim Cell(3)
    
   Htrim = GadgetY(0) + 26
   BColor = GetGadgetColor(0, #PB_Gadget_BackColor)
   FColor = GetGadgetColor(0, #PB_Gadget_FrontColor)
   HColor = $FF9933

Repeat
  Select  WaitWindowEvent()
        Case #PB_Event_CloseWindow
               Quit = 1        
               
        Case #PB_Event_Gadget
              Select EventGadget()
                    Case 0
                         Select EventType()                                        
                                Case #PB_EventType_LeftClick
                                        Row = (WindowMouseY(0) -Htrim) / RowHeight
                                        If WindowMouseX(0) < Cell(0)
                                            Column = 1
                                        ElseIf WindowMouseX(0) > Cell(0) And WindowMouseX(0) < Cell(1)
                                            Column = 2
                                        Else
                                            Column = 3
                                        EndIf
                                        SetGadgetItemColor(0,OldRow,#PB_Gadget_FrontColor,FColor ,OldColumn)
                                        SetGadgetItemColor(0,OldRow, #PB_Gadget_BackColor, BColor,OldColumn)
                                        SetGadgetItemColor(0,Row,#PB_Gadget_FrontColor,$FFFFFF ,Column)
                                        SetGadgetItemColor(0,Row, #PB_Gadget_BackColor,HColor,Column)  
                                        OldRow = Row
                                        OldColumn = Column
                                        
                           EndSelect
              EndSelect
         
         Default                     
                  Cell(0) = GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,0) +GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,1)
                  Cell(1) = cell(0) + GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,2)
                  Cell(2) = Cell(1) +GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,3) 
  EndSelect
Until Quit = 1
Edit :Code modified
Last edited by RASHAD on Tue Jan 27, 2015 10:17 pm, edited 1 time in total.
Egypt my love
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 456
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: ListIconGadget column

Post by Mindphazer »

RASHAD wrote:Hi
Crazy idea looks to me a cross platform solution(can be managed to be faster)
Hi RASHAD,
I'm afraid it's *not* cross platform : GetSysColor_ is not a PB command.....
MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIconGadget column

Post by RASHAD »

Hi Mindphazer :P
Yes you are right
Sorry for that
Egypt my love
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 456
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: ListIconGadget column

Post by Mindphazer »

It's okay, no offense :P

Though I wish you could find a cross platform way :-)
MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIconGadget column

Post by RASHAD »

Still need more work to do for scroll case
Egypt my love
User avatar
Shardik
Addict
Addict
Posts: 2058
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: ListIconGadget column

Post by Shardik »

Mindphazer wrote:Though I wish you could find a cross platform way :-)
Please try my following true cross-platform solution which displays the row and column of a clicked cell. I have tested it successfully on these operating systems:
- MacOS 10.6.8 (Snow Leopard) with PB 5.31 x86 and x64
- Ubuntu 14.04 x64 Unity with PB 5.31 x64
- Windows XP SP3 with PB 5.31 x86
- Windows 7 x64 SP1 with PB 5.31 x86 and x64
falsam wrote:The only option is THE CallBack.
Not quite true: the Windows code is taken from this old code example from srod and doesn't require a callback... :wink:

Code: Select all

EnableExplicit

Procedure.I GetSelectedColumn(WindowID.I, ListIconID.I)
  Protected SelectedColumn.I

  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux ; ------------------------------------------------
      Protected ColumnList.I
      Protected ColumnObject.I
      Protected Iter.I
      Protected Path.I
      Protected TreeStore.I

      If gtk_tree_view_get_cursor_(GadgetID(ListIconID), @Path, @ColumnObject)
        TreeStore = gtk_tree_view_get_model_(GadgetID(ListIconID))
        
        If gtk_tree_model_get_iter_(TreeStore, @Iter, Path)
          If Path <> 0 And ColumnObject <> 0
            ColumnList = gtk_tree_view_get_columns_(GadgetID(ListIconID))
            SelectedColumn = g_list_index_(ColumnList, ColumnObject)
            g_list_free_(ColumnList)
          EndIf
        EndIf
      EndIf
    CompilerCase #PB_OS_MacOS ; ------------------------------------------------
      Protected CursorLocation.NSPoint

      CursorLocation\x = WindowMouseX(WindowID)
      CursorLocation\y = WindowHeight(WindowID) - WindowMouseY(WindowID)
      CocoaMessage(@CursorLocation, GadgetID(ListIconID),
        "convertPoint:@", @CursorLocation, "fromView:", 0)
      SelectedColumn = CocoaMessage(0, GadgetID(ListIconID),
        "columnAtPoint:@", @CursorLocation)
    CompilerCase #PB_OS_Windows ; ----------------------------------------------
      Protected CursorLocation.POINT
      Protected HitInfo.LVHITTESTINFO

      GetCursorPos_(CursorLocation)
      MapWindowPoints_(0, GadgetID(ListIconID), CursorLocation, 1)             
      Hitinfo\pt\x = CursorLocation\x
      HitInfo\pt\y = CursorLocation\y
      SendMessage_(GadgetID(ListIconID), #LVM_SUBITEMHITTEST, 0, HitInfo)
      SelectedColumn = HitInfo\iSubItem                       
  CompilerEndSelect

  ProcedureReturn SelectedColumn
EndProcedure

OpenWindow(0, 200, 100, 304, 107, "Detect clicked cell")
ListIconGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 10, "Column 0",
  95, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Column 1", 95)
AddGadgetColumn(0, 2, "Column 2", 95)
AddGadgetItem(0, -1, "0,0" + #LF$ + "0,1" + #LF$ + "0,2")
AddGadgetItem(0, -1, "1,0" + #LF$ + "1,1" + #LF$ + "1,2")
AddGadgetItem(0, -1, "2,0" + #LF$ + "2,1" + #LF$ + "2,2")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
        Debug "Clicked cell: " + GetGadgetState(0) + "," + GetSelectedColumn(0, 0)
      EndIf
  EndSelect
ForEver
Last edited by Shardik on Wed Jan 28, 2015 1:32 pm, edited 2 times in total.
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 456
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: ListIconGadget column

Post by Mindphazer »

Thank you very much Shardik !!
Your code works very well (I confirm it works on OS X 10.10.1 too :P :P)
MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
infratec
Always Here
Always Here
Posts: 7584
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: ListIconGadget column

Post by infratec »

epog10
User
User
Posts: 93
Joined: Sat May 29, 2010 11:46 am
Location: UK

Re: ListIconGadget column

Post by epog10 »

Ouch!

Over 50 lines of code against a one-line function?

(True that the enthusiasm of those who decided to 'crack it' does show through.)

I would think that a Feature Request is in order. Does anybody know if it has already been previously submitted?
User avatar
Shardik
Addict
Addict
Posts: 2058
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: ListIconGadget column

Post by Shardik »

epog10 wrote:Ouch!

Over 50 lines of code against a one-line function?
It's a bit unfair to speak of over 50 lines for a cross-platform solution. If you consider my Windows-only part it's only 10 lines of code for PB's missing function GetSelectedColumn()... :wink:

But you are right in that it would be nice to have a native PB function to obtain the selected column.

Code: Select all

EnableExplicit

Procedure.I GetSelectedColumn(ListIconID.I)
  Protected CursorLocation.POINT
  Protected HitInfo.LVHITTESTINFO
  GetCursorPos_(CursorLocation)
  MapWindowPoints_(0, GadgetID(ListIconID), CursorLocation, 1)             
  Hitinfo\pt\x = CursorLocation\x
  HitInfo\pt\y = CursorLocation\y
  SendMessage_(GadgetID(ListIconID), #LVM_SUBITEMHITTEST, 0, HitInfo)
  ProcedureReturn HitInfo\iSubItem  
EndProcedure

OpenWindow(0, 200, 100, 304, 80, "Detect clicked cell")
ListIconGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 10, "Column 0",
  95, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Column 1", 95)
AddGadgetColumn(0, 2, "Column 2", 95)
AddGadgetItem(0, -1, "0,0" + #LF$ + "0,1" + #LF$ + "0,2")
AddGadgetItem(0, -1, "1,0" + #LF$ + "1,1" + #LF$ + "1,2")
AddGadgetItem(0, -1, "2,0" + #LF$ + "2,1" + #LF$ + "2,2")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
        Debug "Clicked cell: " + GetGadgetState(0) + "," + GetSelectedColumn(0)
      EndIf
  EndSelect
ForEver
GenRabbit
Enthusiast
Enthusiast
Posts: 151
Joined: Wed Dec 31, 2014 5:41 pm

Re: ListIconGadget column

Post by GenRabbit »

Nice program. How would I go about it if I wanted to be able to write new stuff into cell x.1? (Digits only)
Post Reply