Page 1 of 2

GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 12:20 pm
by jak64
Hello,
I can't get the number of the line I checked (just by checking the checkbox, without clicking on the name of the element (AAAAA or BBBB, etc.)!

Thanks for your help

Code: Select all

EnableExplicit

Global fenetre.i
Global event.i
Global liste_icon.i
Global i.i
Global resultat.i

fenetre = OpenWindow(#PB_Any, 0, 0, 800,600, "Test ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
liste_icon = ListIconGadget(#PB_Any, 10,10, 160, 550, "TEST", 150, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect)
For i = 0 To 25
  AddGadgetItem(liste_icon, -1, RSet(Chr(i + 65), 8, Chr(i + 65)))
Next i

Repeat
  event = WaitWindowEvent()
  
  Select event
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case liste_icon
          Select EventType()
                      
            Case #PB_EventType_LeftClick
              Debug GetGadgetItemState(liste_icon, -1) & #PB_ListIcon_CheckBoxes
              resultat = GetGadgetState(liste_icon)
              If resultat > -1
                Debug GetGadgetText(liste_icon)
              EndIf
          EndSelect
          
      EndSelect
      
  EndSelect
  
Until Event = #PB_Event_CloseWindow

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 12:35 pm
by NicTheQuick
if you want to check for the checkbox state you have to define which entry you wanna check. So first get the entry you clicked on and then use `GetGadgetItemState()` to check for the Checkbox state.

Code: Select all

							resultat = GetGadgetState(liste_icon)
							If resultat > -1
								Debug GetGadgetItemState(liste_icon, resultat) & #PB_ListIcon_CheckBoxes
								Debug GetGadgetText(liste_icon)
							EndIf
And if you want to get all the checkbox states you need to iterate over all the entries.

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 12:37 pm
by NicTheQuick
Maybe I misunderstood your issue. But on Linux when I click on just a checkbox the underlying entry will be selected too. If this is different on Windows, I unfortunately can not help.

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 1:09 pm
by jak64
Hello NicTheQuick,

I understood that but that's exactly what I don't want: I want to ONLY check the box to the left of the item, without left-clicking on the item.

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 1:19 pm
by jak64
Anyway, it doesn't work, whether I check or uncheck the checkbox, I always get "yes".
On the other hand, if I click on the item, for example BBBB (without checking the box), I also get "yes"!!!

Code: Select all

EnableExplicit

Global fenetre.i
Global event.i
Global liste_icon.i
Global i.i
Global resultat.i

fenetre = OpenWindow(#PB_Any, 0, 0, 800,600, "Test ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
liste_icon = ListIconGadget(#PB_Any, 10,10, 160, 550, "TEST", 150, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect)
For i = 0 To 25
  AddGadgetItem(liste_icon, -1, RSet(Chr(i + 65), 8, Chr(i + 65)))
Next i

Repeat
  event = WaitWindowEvent()
  
  Select event
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case liste_icon
          Select EventType()
              
            Case #PB_EventType_LeftClick
              resultat = GetGadgetState(liste_icon)
              If resultat > -1
                If GetGadgetItemState(liste_icon, resultat) & #PB_ListIcon_CheckBoxes
                  Debug "yes"
                Else
                  Debug "no"
                EndIf
              EndIf
          EndSelect
          
      EndSelect
      
  EndSelect
  
Until Event = #PB_Event_CloseWindow

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 1:23 pm
by miso
I dare to assume a bug, where on windows7, the #PB_ListIcon_FullRowSelect is not working correctly. I'm not expert though, I may be wrong.

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 1:26 pm
by jak64
hello miso,

I'm on Windows 11

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 1:28 pm
by Caronte3D
It seems a bug to me.

Anyway here is a workaround for cases where click only on the check:

Code: Select all

EnableExplicit

Global fenetre.i
Global event.i
Global liste_icon.i
Global i.i
Global resultat.i=-1

fenetre = OpenWindow(#PB_Any, 0, 0, 800,600, "Test ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
liste_icon = ListIconGadget(#PB_Any, 10,10, 160, 550, "TEST", 150, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect)
For i = 0 To 25
  AddGadgetItem(liste_icon, -1, RSet(Chr(i + 65), 8, Chr(i + 65)))
  SetGadgetItemData(liste_icon,i,0)
Next i

Repeat
  event = WaitWindowEvent()
  
  Select event
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case liste_icon
          Select EventType()
                      
            Case #PB_EventType_Change
              For i = 0 To 25
                ;Debug GetGadgetItemData(liste_icon,i)
                If GetGadgetItemData(liste_icon,i)<>Bool(GetGadgetItemState(liste_icon, i) & #PB_ListIcon_Checked)
                  SetGadgetItemData(liste_icon,i,Bool(GetGadgetItemState(liste_icon, i) & #PB_ListIcon_Checked ))
                  resultat=i
                  Break
                EndIf
              Next i

							If resultat > -1
							  SetGadgetState(liste_icon, resultat)
							  Debug "Check: "+GetGadgetItemData(liste_icon, resultat)
								Debug "Text:"+GetGadgetText(liste_icon)
							EndIf
							resultat=-1
          EndSelect
          
      EndSelect
      
  EndSelect
  
Until Event = #PB_Event_CloseWindow

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 1:35 pm
by jak64
Hello Caronte3D,

I had thought about it but it is still a "heavy" solution.

It's a shame that we have to go through this...

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 1:39 pm
by miso
Hello jak64!

Then 2 type of Windows has been tested. Might worth a bug report.
I was fiddling with your example, and I choosed to stop. I found multiple problems regarding to listicongadget. Just for one example I could not get #pb_eventtype_columnclick from eventtype(). After that #pb_listicon_ClickedColumn with GetGadgetAttribute would help, but I could not get those.

As I said, I may be wrong, these gadget things are not on my daily focus, it's not my strong side.

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 1:51 pm
by BarryG
It's not a bug to click a ListIconGadget checkbox and NOT also have its item selected, if that's what some of you are saying? It's normal behavior and has uses. Don't break my app by reporting this incorrectly as a bug.

@Jak64: I think you want to do something like this? -> https://www.purebasic.fr/english/viewto ... 50#p550650

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 2:03 pm
by miso
Please don't be upset. We are asking the experts in the coding questions section. I mean no harm.

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 2:52 pm
by mk-soft
In Windows you can mark a checkbox in the list without the selected item changing.
On macOS and Linux, the selection item is changed. This is OS specific.

Whether a checkbox is marked in a list, you have to check all entries.

Update
Not LeftClick evaluated, but Change, then works via keyboard too

Code: Select all

;-TOP

EnableExplicit

#ProgramTitle = "Main Window"
#ProgramVersion = "v1.01.2"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainList
  #MainButton
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainList, 0, 0, dx, dy - 40)
  ResizeGadget(#MainButton, 5, dy - 35, 120, 25)
EndProcedure

Procedure Main()
  Protected dx, dy
  
  Protected StateItem, LastStateItem
  Protected CheckedItem, i
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
    CompilerEndIf
    ; Menu File Items
    
    CompilerIf Not #PB_Compiler_OS = #PB_OS_MacOS
      MenuBar()
      MenuItem(#MainMenuExit, "E&xit")
    CompilerEndIf
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    ListIconGadget(#MainList, 0, 0, dx, dy - 40, "Column 0", 400, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect | #PB_ListIcon_MultiSelect)
    ButtonGadget(#MainButton, 5, dy - 35, 120, 25, "Ok")
    For i = 0 To 9
      AddGadgetItem(#MainList, -1 , "Item " + i)
    Next
    
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
              
            Case #MainMenuExit
              PostEvent(#PB_Event_CloseWindow, #Main, #Null)
              
            Case #MainMenuAbout
              MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #MainList
              Select EventType()
                Case #PB_EventType_Change
                  For i = 0 To CountGadgetItems(#MainList) - 1
                    StateItem = GetGadgetItemState(#MainList, i)
                    LastStateItem = GetGadgetItemData(#MainList, i)
                    If StateItem <> LastStateItem
                      If (StateItem & #PB_ListIcon_Checked) <> (LastStateItem & #PB_ListIcon_Checked)
                        Debug "Change Checked Item " + i + " State " + Bool(StateItem & #PB_ListIcon_Checked)
                      EndIf
                      If (StateItem & #PB_ListIcon_Selected) <> (LastStateItem & #PB_ListIcon_Selected)
                        Debug "Change Selected Item " + i + " State " + Bool(StateItem & #PB_ListIcon_Selected)
                      EndIf
                      SetGadgetItemData(#MainList, i, StateItem)
                    EndIf
                  Next
                    
              EndSelect
              
            Case #MainButton
              For i = 0 To CountGadgetItems(#MainList) - 1
                CheckedItem = GetGadgetItemState(#MainList, i) & #PB_ListIcon_Checked
                Debug "Checked Item " + i + " State " + Bool(CheckedItem = #PB_ListIcon_Checked)
              Next
              
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 5:15 pm
by jak64
Hello BarryG,

Indeed, I tested this code and this is what I want to do:

I have a list of several hundred TV series and I would like, by checking the box, to put the item in green to indicate that I have already seen it (I also type the series in an sqlite database) and I will have 2 boxes to check, above the list, to choose, series seen and series not seen.

Re: GetGadgetItemState and ListIconGadget

Posted: Fri Mar 07, 2025 5:35 pm
by miso
Thanks mk-soft, I always learn something from you.