ListIconGadget checkbox toggling

Just starting out? Need help? Post your questions and find answers here.
Dude
Addict
Addict
Posts: 1907
Joined: Mon Feb 16, 2015 2:49 pm

ListIconGadget checkbox toggling

Post by Dude »

I've got this test code where all I want to do, is press Space to toggle the checkbox states of any selected items. In this example, I want to toggle the checkbox state of items 5 to 10.

Run this app, and then press Space a few times. Items 5 to 9 toggle their checkbox, but not item 10. However, if you click the Button so it gets the focus, and then press Space, then yes, item 10 now also gets included with the toggling, which is what I want.

So how can I include item 10 without switching the focus away from the ListIconGadget?

Code: Select all

If OpenWindow(0, 0, 0, 640, 400, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ListIconGadget(0,  10, 10, 620,350, "Column 0", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines| #PB_ListIcon_CheckBoxes|#PB_ListIcon_MultiSelect )
  
  ButtonGadget(1,10,370,100,25,"Button")
  
  For c = 1 To 6
    AddGadgetColumn(0, c, "Column " + Str(c), 100)
  Next
  
  For r = 0 To 15
    AddGadgetItem(0, r, "  Item "+Str(r)+Chr(10)+"Item "+Str(r)+Chr(10)+"Item 3"+Chr(10)+"Item 4")
  Next
  
  For r = 5 To 10
    SetGadgetItemState(0, r, #PB_ListIcon_Checked | #PB_ListIcon_Selected)
  Next
  
  SetActiveGadget(0)
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #WM_KEYDOWN
        
        If GetAsyncKeyState_(#VK_SPACE) & $8000
          For r=5 To 10
            If GetGadgetItemState(0,r) & #PB_ListIcon_Selected
              If GetGadgetItemState(0,r) & #PB_ListIcon_Checked
                c=~#PB_ListIcon_Checked
              Else
                c=#PB_ListIcon_Checked
              EndIf
              SetGadgetItemState(0,r,c|#PB_ListIcon_Selected)
            EndIf
          Next
        EndIf
        
    EndSelect
    
  Until Quit = 1
  
EndIf
wombats
Enthusiast
Enthusiast
Posts: 663
Joined: Thu Dec 29, 2011 5:03 pm

Re: ListIconGadget checkbox toggling

Post by wombats »

It works if you use a keyboard shortcut instead.

Code: Select all

If OpenWindow(0, 0, 0, 640, 400, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ListIconGadget(0,  10, 10, 620,350, "Column 0", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines| #PB_ListIcon_CheckBoxes|#PB_ListIcon_MultiSelect )
  
  ButtonGadget(1,10,370,100,25,"Button")
  
  AddKeyboardShortcut(0, #PB_Shortcut_Space, 0)
  
  For c = 1 To 6
    AddGadgetColumn(0, c, "Column " + Str(c), 100)
  Next
  
  For r = 0 To 15
    AddGadgetItem(0, r, "  Item "+Str(r)+Chr(10)+"Item "+Str(r)+Chr(10)+"Item 3"+Chr(10)+"Item 4")
  Next
  
  For r = 5 To 10
    SetGadgetItemState(0, r, #PB_ListIcon_Checked | #PB_ListIcon_Selected)
  Next
  
  SetActiveGadget(0)
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #PB_Event_Menu
        For r=5 To 10
          If GetGadgetItemState(0,r) & #PB_ListIcon_Selected
            If GetGadgetItemState(0,r) & #PB_ListIcon_Checked
              c=~#PB_ListIcon_Checked
            Else
              c=#PB_ListIcon_Checked
            EndIf
            SetGadgetItemState(0,r,c|#PB_ListIcon_Selected)
          EndIf
        Next
        
      Case #WM_KEYDOWN
        
        If GetAsyncKeyState_(#VK_SPACE) & $8000

        EndIf
        
    EndSelect
    
  Until Quit = 1
  
EndIf
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIconGadget checkbox toggling

Post by RASHAD »

Hi Dude
wombats is very close

Code: Select all

If OpenWindow(0, 0, 0, 640, 400, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
  ListIconGadget(0,  10, 10, 620,350, "Column 0", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines| #PB_ListIcon_CheckBoxes|#PB_ListIcon_MultiSelect )
 
  ButtonGadget(1,10,370,100,25,"Button")
 
  For c = 1 To 6
    AddGadgetColumn(0, c, "Column " + Str(c), 100)
  Next
 
  For r = 0 To 15
    AddGadgetItem(0, r, "  Item "+Str(r)+Chr(10)+"Item "+Str(r)+Chr(10)+"Item 3"+Chr(10)+"Item 4")
  Next
 
  For r = 5 To 10
    SetGadgetItemState(0, r, #PB_ListIcon_Checked | #PB_ListIcon_Selected)
  Next
 
  SetActiveGadget(0)
  
  AddKeyboardShortcut(0,#PB_Shortcut_Space,10)
 
  Repeat
   
    Select WaitWindowEvent()
       
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #PB_Event_Menu
        Select EventMenu()
          Case 10
            For r = 5 To 10
              SetActiveGadget(0)
              SetGadgetItemState(0,r,GetGadgetItemState(0,r)!#PB_ListIcon_Selected ! #PB_ListIcon_Checked  )
            Next
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            For r = 5 To 10
              SetActiveGadget(0)
              SetGadgetItemState(0,r,GetGadgetItemState(0,r)!#PB_ListIcon_Selected ! #PB_ListIcon_Checked  )
            Next
        EndSelect
       
    EndSelect
   
  Until Quit = 1
 
EndIf
Egypt my love
Dude
Addict
Addict
Posts: 1907
Joined: Mon Feb 16, 2015 2:49 pm

Re: ListIconGadget checkbox toggling

Post by Dude »

Thank you both! :)
breeze4me
Enthusiast
Enthusiast
Posts: 511
Joined: Thu Mar 09, 2006 9:24 am
Location: S. Kor

Re: ListIconGadget checkbox toggling

Post by breeze4me »

another way.
it only works when the listicon gagdet is focused.

Code: Select all

#MY_Event_ListIconSpace = #PB_Event_FirstCustomValue

Global old

Procedure ListIconWProc(hwnd, msg, wParam, lParam)
  
  If msg = #WM_KEYDOWN And wParam = #VK_SPACE
    PostEvent(#MY_Event_ListIconSpace, 0, 0)
    
    ProcedureReturn 0
  EndIf
  
  ProcedureReturn CallWindowProc_(old, hwnd, msg, wParam, lParam)
EndProcedure


If OpenWindow(0, 0, 0, 640, 400, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ListIconGadget(0,  10, 10, 620,350, "Column 0", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines| #PB_ListIcon_CheckBoxes|#PB_ListIcon_MultiSelect )
  
  ButtonGadget(1,10,370,100,25,"Button")
  
  For c = 1 To 6
    AddGadgetColumn(0, c, "Column " + Str(c), 100)
  Next
  
  For r = 0 To 15
    AddGadgetItem(0, r, "  Item "+Str(r)+Chr(10)+"Item "+Str(r)+Chr(10)+"Item 3"+Chr(10)+"Item 4")
  Next
  
  For r = 5 To 10
    SetGadgetItemState(0, r, #PB_ListIcon_Checked | #PB_ListIcon_Selected)
  Next
  
  old = SetWindowLongPtr_(GadgetID(0), #GWLP_WNDPROC, @ListIconWProc())
  
  SetActiveGadget(0)
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #MY_Event_ListIconSpace
        If EventGadget() = 0
          FirstItem = GetGadgetState(0)
          
          If FirstItem <> -1
            For i = FirstItem To CountGadgetItems(0) - 1
              If GetGadgetItemState(0, i) & #PB_ListIcon_Selected
                If GetGadgetItemState(0, i) & #PB_ListIcon_Checked
                  c = ~#PB_ListIcon_Checked
                Else
                  c = #PB_ListIcon_Checked
                EndIf
                SetGadgetItemState(0, i, c | #PB_ListIcon_Selected)
              EndIf
            Next
          EndIf
          
          ;For r=5 To 10
          ;  If GetGadgetItemState(0,r) & #PB_ListIcon_Selected
          ;    If GetGadgetItemState(0,r) & #PB_ListIcon_Checked
          ;      c=~#PB_ListIcon_Checked
          ;    Else
          ;      c=#PB_ListIcon_Checked
          ;    EndIf
          ;    SetGadgetItemState(0,r,c|#PB_ListIcon_Selected)
          ;  EndIf
          ;Next
          
        EndIf
        
    EndSelect
    
  Until Quit = 1
  
EndIf
User avatar
skywalk
Addict
Addict
Posts: 3972
Joined: Wed Dec 23, 2009 10:14 pm
Location: Boston, MA

Re: ListIconGadget checkbox toggling

Post by skywalk »

Dude, your code did not work because the spacebar is already executing code on the focused gadget.
A keyboard shortcut or a callback on the gadget will interrupt/replace the built-in process.
The nice thing about standards is there are so many to choose from. ~ Andrew Tanenbaum
Dude
Addict
Addict
Posts: 1907
Joined: Mon Feb 16, 2015 2:49 pm

Re: ListIconGadget checkbox toggling

Post by Dude »

Thanks skywalk, yes, I realised that now. :oops:
Post Reply