ListIconGadget column
ListIconGadget column
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?
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?
- Mindphazer
- Enthusiast
- Posts: 456
- Joined: Mon Sep 10, 2012 10:41 am
- Location: Savoie
Re: ListIconGadget column
GetGadgetItemState ?
MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
...and unfortunately... Windows at work...
Re: ListIconGadget column
No.epog10 wrote:Surely there is a simple command that returns the row/column that was clicked in a ListIconGadget?
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
Re: ListIconGadget column
Hi
# 1 :
Crazy idea looks to me a cross platform solution(can be managed to be faster)
#2 :
Subclass the ListIcon Gadget
Edit :Code modified
# 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
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
Last edited by RASHAD on Tue Jan 27, 2015 10:21 pm, edited 1 time in total.
Egypt my love
Re: ListIconGadget column
Another way for doing it
Edit :Code modified
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
Last edited by RASHAD on Tue Jan 27, 2015 10:17 pm, edited 1 time in total.
Egypt my love
- Mindphazer
- Enthusiast
- Posts: 456
- Joined: Mon Sep 10, 2012 10:41 am
- Location: Savoie
Re: ListIconGadget column
Hi RASHAD,RASHAD wrote:Hi
Crazy idea looks to me a cross platform solution(can be managed to be faster)
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...
...and unfortunately... Windows at work...
- Mindphazer
- Enthusiast
- Posts: 456
- Joined: Mon Sep 10, 2012 10:41 am
- Location: Savoie
Re: ListIconGadget column
It's okay, no offense
Though I wish you could find a cross platform way

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...
...and unfortunately... Windows at work...
Re: ListIconGadget column
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:Mindphazer wrote:Though I wish you could find a cross platform way
- 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
Not quite true: the Windows code is taken from this old code example from srod and doesn't require a callback...falsam wrote:The only option is THE CallBack.

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.
- Mindphazer
- Enthusiast
- Posts: 456
- Joined: Mon Sep 10, 2012 10:41 am
- Location: Savoie
Re: ListIconGadget column
Thank you very much Shardik !!
Your code works very well (I confirm it works on OS X 10.10.1 too
)
Your code works very well (I confirm it works on OS X 10.10.1 too


MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
...and unfortunately... Windows at work...
Re: ListIconGadget column
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?
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?
Re: ListIconGadget column
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()...epog10 wrote:Ouch!
Over 50 lines of code against a one-line function?

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
Re: ListIconGadget column
Nice program. How would I go about it if I wanted to be able to write new stuff into cell x.1? (Digits only)