ListIcon Keep selected items shown [Windows]

Share your advanced PureBasic knowledge/code with the community.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

ListIcon Keep selected items shown [Windows]

Post by RASHAD »

Hi all

Code: Select all

Global oldCallback,id,run0,run1,run2,run3,r.RECT,r1.RECT,r2.RECT,r3.RECT

Procedure liCB(hWnd, uMsg, wParam, lParam)
  result = CallWindowProc_(oldCallback, hWnd, uMsg, wParam, lParam)
  Select uMsg       
    Case #WM_LBUTTONDOWN
      pInfo.LVHITTESTINFO
      pInfo\pt\x = lParam & $FFFF
      pInfo\pt\y = lParam >> 16 & $FFFF
      SendMessage_(hWnd, #LVM_SUBITEMHITTEST, 0, pInfo)
      id = GetProp_(hWnd, "PB_ID")
      SetGadgetItemState(id, pInfo\iItem, #PB_ListIcon_Checked|#PB_ListIcon_Selected)
      If id = 0
        run0 =1
        r\top = pInfo\iSubItem
        r\left = #LVIR_BOUNDS
        SendMessage_(hWnd, #LVM_GETITEMRECT, pInfo\iItem, r)     
        MoveWindow_(WindowID(id), GadgetX(id,#PB_Gadget_ScreenCoordinate), GadgetY(id,#PB_Gadget_ScreenCoordinate) + r\top, GadgetWidth(id)-20,24, 1)
      ElseIf id = 1
        run1 = 1
        r1\top = pInfo\iSubItem
        r1\left = #LVIR_BOUNDS
        SendMessage_(hWnd, #LVM_GETITEMRECT, pInfo\iItem, r1)     
        MoveWindow_(WindowID(id), GadgetX(id,#PB_Gadget_ScreenCoordinate), GadgetY(id,#PB_Gadget_ScreenCoordinate) + r1\top, GadgetWidth(id)-20,24, 1)
      ElseIf id = 2
        run2 = 1
        r2\top = pInfo\iSubItem
        r2\left = #LVIR_BOUNDS
        SendMessage_(hWnd, #LVM_GETITEMRECT, pInfo\iItem, r2)     
        MoveWindow_(WindowID(id), GadgetX(id,#PB_Gadget_ScreenCoordinate), GadgetY(id,#PB_Gadget_ScreenCoordinate) + r2\top, GadgetWidth(id)-20,24, 1)
      ElseIf id = 3
        run3 = 1
        r3\top = pInfo\iSubItem
        r3\left = #LVIR_BOUNDS
        SendMessage_(hWnd, #LVM_GETITEMRECT, pInfo\iItem, r3)     
        MoveWindow_(WindowID(id), GadgetX(id,#PB_Gadget_ScreenCoordinate), GadgetY(id,#PB_Gadget_ScreenCoordinate) + r3\top, GadgetWidth(id)-20,24, 1)
      EndIf
     
    Case #WM_VSCROLL,#WM_MOUSEWHEEL
        id = GetProp_(hWnd, "PB_ID")
        SendMessage_(hWnd, #LVM_GETITEMRECT, GetGadgetState(id), rc.rect)
        If rc\top >= 24 And rc\top < GadgetHeight(id)-24
          HideWindow(id,0)   
          MoveWindow_(WindowID(id),GadgetX(id, #PB_Gadget_ScreenCoordinate), GadgetY(id,#PB_Gadget_ScreenCoordinate) + rc\top, GadgetWidth(id)-20,24, 1)
        Else
          HideWindow(id,1)
        EndIf 
     
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure WndProc(hwnd, uMsg, wParam, lParam)
      result = #PB_ProcessPureBasicEvents

 Select uMsg
    Case #WM_NOTIFY
      *NMHDR.NMHDR = lParam
       If *NMHDR\hWndFrom = GetWindow_(GadgetID(0),#GW_CHILD) Or *NMHDR\hWndFrom = GetWindow_(GadgetID(1),#GW_CHILD) Or *NMHDR\hWndFrom = GetWindow_(GadgetID(2),#GW_CHILD) Or *NMHDR\hWndFrom = GetWindow_(GadgetID(3),#GW_CHILD)
          *phdn.NMHEADER = lParam                 
          If  *phdn\iItem = 0
                ProcedureReturn 1
          EndIf
       EndIf
 
    Case #WM_NCACTIVATE
        If wParam = 0
          ProcedureReturn 1
        EndIf
        
        
    Case #WM_MOVE
        If run0 = 1          
          SendMessage_(GadgetID(0), #LVM_GETITEMRECT, GetGadgetState(0), r.rect)
          MoveWindow_(WindowID(0),GadgetX(0, #PB_Gadget_ScreenCoordinate), GadgetY(0,#PB_Gadget_ScreenCoordinate) + r\top, GadgetWidth(0)-20,24, 1)
        EndIf
        If run1 = 1
          SendMessage_(GadgetID(1), #LVM_GETITEMRECT, GetGadgetState(1), r1.rect)
          MoveWindow_(WindowID(1),GadgetX(1, #PB_Gadget_ScreenCoordinate), GadgetY(1,#PB_Gadget_ScreenCoordinate) + r1\top, GadgetWidth(1)-20,24, 1)
        EndIf
        If run2 = 1
          SendMessage_(GadgetID(2), #LVM_GETITEMRECT, GetGadgetState(2), r2.rect)
          MoveWindow_(WindowID(2),GadgetX(2, #PB_Gadget_ScreenCoordinate), GadgetY(2,#PB_Gadget_ScreenCoordinate) + r2\top, GadgetWidth(2)-20,24, 1)
        EndIf  
        If run3 = 1
          SendMessage_(GadgetID(3), #LVM_GETITEMRECT, GetGadgetState(3), r3.rect)
          MoveWindow_(WindowID(3),GadgetX(3, #PB_Gadget_ScreenCoordinate), GadgetY(3,#PB_Gadget_ScreenCoordinate) + r3\top, GadgetWidth(3)-20,24, 1)
        EndIf
        
      EndSelect
   
  ProcedureReturn result
EndProcedure

LoadFont(0,"Arial",12)
If OpenWindow(10, 0, 0, 640, 500, "Keep Selction", #PB_Window_Invisible| #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(0,  10,  10, 310, 200, "Column 0", 0,#PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
  SetGadgetFont(0,FontID(0))
  AddGadgetColumn(0, 1, "Column 1" , 150)
  AddGadgetColumn(0, 2, "Column 2" , 150)
  AddGadgetColumn(0, 3, "Column 3" , 150)
  For x = 0 To 100
    AddGadgetItem(0, x,""+Chr(10)+ "Item "+Str(x)+Chr(10) + "Item "+Str(x)+Chr(10)+"Item "+Str(x))
    If Mod(x,2) = 0
      SetGadgetItemColor(0,x,#PB_Gadget_BackColor,$C9F5FD)
      SetGadgetItemColor(0,x,#PB_Gadget_FrontColor,$242BFE,2)
    Else
      SetGadgetItemColor(0,x,#PB_Gadget_BackColor,$EAFEF2)
    EndIf
  Next
 
  ListIconGadget(1,  320,  10, 310, 200, "Column 0", 0,#PB_ListIcon_GridLines| #PB_ListIcon_AlwaysShowSelection)
  SetGadgetFont(1,FontID(0))
  AddGadgetColumn(1, 1, "Column 1" , 150)
  AddGadgetColumn(1, 2, "Column 2" , 150)
  AddGadgetColumn(1, 3, "Column 3" , 150)
  For x = 0 To 100
    AddGadgetItem(1, x,""+Chr(10)+ "Item "+Str(x)+Chr(10) + "Item "+Str(x)+Chr(10)+"Item "+Str(x))
  Next
 
  ListIconGadget(2,  10,  220, 310, 200, "Column 0", 0,#PB_ListIcon_GridLines| #PB_ListIcon_AlwaysShowSelection)
  SetGadgetFont(2,FontID(0))
  AddGadgetColumn(2, 1, "Column 1" , 150)
  AddGadgetColumn(2, 2, "Column 2" , 150)
  AddGadgetColumn(2, 3, "Column 3" , 150)
  For x = 0 To 100
    AddGadgetItem(2, x,""+Chr(10)+ "Item "+Str(x)+Chr(10) + "Item "+Str(x)+Chr(10)+"Item "+Str(x))
  Next
 
  ListIconGadget(3,  320,  220, 310, 200, "Column 0", 0,#PB_ListIcon_GridLines| #PB_ListIcon_AlwaysShowSelection)
  SetGadgetFont(3,FontID(0))
  AddGadgetColumn(3, 1, "Column 1" , 150)
  AddGadgetColumn(3, 2, "Column 2" , 150)
  AddGadgetColumn(3, 3, "Column 3" , 150)
  For x = 0 To 100
    AddGadgetItem(3, x, ""+Chr(10)+"Item "+Str(x)+Chr(10) + "Item "+Str(x)+Chr(10)+"Item "+Str(x))
  Next
 
  ButtonGadget(4,10,470,100,20,"List Selected items")  
 
  For win = 0 To 3
    OpenWindow(win,0,0,0,0,"",#PB_Window_BorderLess, WindowID(10))
    SetWindowColor(win, GetSysColor_(#COLOR_HIGHLIGHT))
    SetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE, GetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE)| #WS_EX_LAYERED)
    SetLayeredWindowAttributes_(WindowID(win), GetSysColor_(#COLOR_HIGHLIGHT),130,#LWA_ALPHA)
  Next
   
  oldCallback = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
  oldCallback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @liCB())
  oldCallback = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @liCB())
  oldCallback = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @liCB())
 
  HideWindow(10,0)
  SetActiveWindow(10)
  SetWindowCallback(@WndProc())
 
EndIf
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Quit = 1     
     
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0 To 3
          Debug EventGadget()         
          Debug GetGadgetState(EventGadget())
         
         
        Case 4
          Debug "========"
          For item = 0 To 3
            Debug GetGadgetState(item)
            Debug "========"
          Next
      EndSelect
 
  EndSelect
Until Quit = 1
Last edited by RASHAD on Wed Jul 26, 2017 3:04 am, edited 5 times in total.
Egypt my love
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Re: ListIcon Keep selected items shown [Windows]

Post by ts-soft »

Hi RASHAD,
i see some problems with your code (windows 10, x64),
see pic: https://i.imgur.com/0tCtULT.png

greetings Thomas
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIcon Keep selected items shown [Windows]

Post by RASHAD »

Hi Thomas
Thanks for checking
Previous post updated
I am running PB v5.6 x86 - Windows 10 - x64
Egypt my love
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Re: ListIcon Keep selected items shown [Windows]

Post by ts-soft »

One problem not solved: the selection on gadget top right, if you move the window, the selection stays on screen.

The other problems a solved :D
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIcon Keep selected items shown [Windows]

Post by RASHAD »

Thanks again Thomas :)
Previous post updated again
That was the result of trying to edit the code directly on PB forum
Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: ListIcon Keep selected items shown [Windows]

Post by Kwai chang caine »

Hello RASHAD :D
Apparently works good for me :wink:
When i scroll the ListIcons, the line selected not move, but the items of listIcons yes, under the line selected
If it's the goal searched to do...all are ok
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIcon Keep selected items shown [Windows]

Post by RASHAD »

Hi KCC
I hope I did it OK
Previous post updated
Egypt my love
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIcon Keep selected items shown [Windows]

Post by RASHAD »

Previous post updated
Bugs fixed
Egypt my love
Dude
Addict
Addict
Posts: 1907
Joined: Mon Feb 16, 2015 2:49 pm

Re: ListIcon Keep selected items shown [Windows]

Post by Dude »

I don't understand what this tip does? I click a selection but can still scroll away from it?
Post Reply