Page 1 of 1

ListIcon Keep selected items shown [Windows]

Posted: Mon Jul 17, 2017 8:17 pm
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

Re: ListIcon Keep selected items shown [Windows]

Posted: Mon Jul 17, 2017 9:36 pm
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

Re: ListIcon Keep selected items shown [Windows]

Posted: Mon Jul 17, 2017 9:56 pm
by RASHAD
Hi Thomas
Thanks for checking
Previous post updated
I am running PB v5.6 x86 - Windows 10 - x64

Re: ListIcon Keep selected items shown [Windows]

Posted: Mon Jul 17, 2017 10:23 pm
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

Re: ListIcon Keep selected items shown [Windows]

Posted: Mon Jul 17, 2017 10:36 pm
by RASHAD
Thanks again Thomas :)
Previous post updated again
That was the result of trying to edit the code directly on PB forum

Re: ListIcon Keep selected items shown [Windows]

Posted: Mon Jul 24, 2017 6:22 pm
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)

Re: ListIcon Keep selected items shown [Windows]

Posted: Mon Jul 24, 2017 7:33 pm
by RASHAD
Hi KCC
I hope I did it OK
Previous post updated

Re: ListIcon Keep selected items shown [Windows]

Posted: Wed Jul 26, 2017 3:05 am
by RASHAD
Previous post updated
Bugs fixed

Re: ListIcon Keep selected items shown [Windows]

Posted: Wed Jul 26, 2017 8:33 am
by Dude
I don't understand what this tip does? I click a selection but can still scroll away from it?