Page 1 of 1

Disable Listicon Selection Color?

Posted: Wed Jun 30, 2021 1:18 pm
by novablue
Hello, I have a Listicon where i have a custom color for each line (SetGadgetItemColor). Now when i select a line the color disappears and the default blue selection color shows instead. Is it possible to deactivate the selection color so it always just shows the custom color i set?

Re: Disable Listicon Selection Color?

Posted: Wed Jun 30, 2021 2:07 pm
by firace
Not supported by Windows, but here's a quick hack:

Code: Select all

#LI = 0
#CustomLIGSelectionColor = $ABFCAB

Global oldCallback,ListIcon,LIColor,Oldr,Oldc,editflag

Procedure LIcallback(hwnd, msg, wparam, lparam) 
  result = CallWindowProc_(oldCallback, hwnd, msg, wparam, lparam)
  Select msg
      
    Case #WM_LBUTTONDOWN
      SetGadgetState(#LI,-1)  
      
      pInfo.LVHITTESTINFO
      pInfo\pt\x = (lParam & $FFFF) 
      pInfo\pt\y = (lParam>> 16 & $FFFF)                    
      SendMessage_(ListIcon,#LVM_SUBITEMHITTEST,0,@pInfo)
      
      For jj = 0 To CountGadgetItems(#LI)-1
        SetGadgetItemColor(#LI, jj, #PB_Gadget_BackColor, #White)
      Next
      SetGadgetItemColor(#LI, pInfo\iItem, #PB_Gadget_BackColor, #CustomLIGSelectionColor)
      
      Oldr = pInfo\iItem
      Oldc = pInfo\iSubItem   
      
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure CustomLIG(gnumber, x, y, w, h, numC=3, numR=16)
  
  ListIcon = ListIconGadget(gnumber,10,10,620,460,"Column 0",0,#PB_ListIcon_GridLines  )
  AddGadgetColumn(gnumber,1,"Column 1",200) 
  AddGadgetColumn(gnumber,2,"Column 2",200) 
  AddGadgetColumn(gnumber,3,"Column 3",200)
  
  For i = 0 To numR-1 
    AddGadgetItem(gnumber, -1, Chr(10)+"Text in Column 1"+Chr(10)+"Text in Column 2" + Chr(10)+"Text in Column 3" + Chr(10)+"") 
  Next
  
  oldCallback = SetWindowLongPtr_(ListIcon, #GWL_WNDPROC, @LIcallback())
  
EndProcedure   

LoadFont(0,"Tahoma",10) 

OpenWindow(0,0,0,640,480,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered)

CustomLIG(#LI, 40, 40, 450, 300, 3, 10)

SetGadgetFont(#LI,FontID(0)) : SetGadgetFont(2  ,FontID(0))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 

Re: Disable Listicon Selection Color?

Posted: Wed Jun 30, 2021 2:36 pm
by RASHAD
Hi
For Windows
Simple as I can

Code: Select all

Import "UxTheme.lib"
  SetWindowTheme(hWnd, Body.p-unicode, pszSubIdList)
EndImport


If OpenWindow(0, 0, 0, 500, 300, "Set Select Color", #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  CreateStatusBar(0, WindowID(0))
  ListIconGadget(0, 10, 10, 480, 255, "Column 0", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
  
  AddGadgetColumn(0, 1, "Column 1", 200)
  AddGadgetColumn(0, 2, "Column 2", 200)
  For a=0 To 9
    addtext$ = "Column 0  item # " + Str(a) + Chr(10) + "Column 1  item # " + Str(a) + Chr(10) + "Column 2  item # " + Str(a)
    AddGadgetItem(0,-1, addtext$)
    If a % 2
      SetGadgetItemColor(0,a, #PB_Gadget_BackColor,$ACFEFD)
      SetGadgetItemColor(0,a, #PB_Gadget_FrontColor,$FF0806)
    Else
      SetGadgetItemColor(0,a, #PB_Gadget_BackColor,$FFFFFF)
      SetGadgetItemColor(0,a, #PB_Gadget_FrontColor,$0)
    EndIf
  Next
  
  SetWindowTheme(GadgetID(0), "EXPLORER", 0)
  
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow 
EndIf

Re: Disable Listicon Selection Color?

Posted: Wed Jun 30, 2021 3:27 pm
by Lord
Maybe a little improvement to firace code:

Code: Select all

#LI = 0
#CustomLIGSelectionColor = $ABFCAB

Global oldCallback,ListIcon,LIColor,Oldr,Oldc,editflag

Procedure LIcallback(hwnd, msg, wparam, lparam) 
  result = CallWindowProc_(oldCallback, hwnd, msg, wparam, lparam)
  Select msg
      
    Case #WM_LBUTTONDOWN
      SetGadgetState(#LI,-1)  
      
      pInfo.LVHITTESTINFO
      pInfo\pt\x = (lParam & $FFFF) 
      pInfo\pt\y = (lParam>> 16 & $FFFF)                    
      SendMessage_(ListIcon,#LVM_SUBITEMHITTEST,0,@pInfo)
      
      For jj = 0 To CountGadgetItems(#LI)-1
        SetGadgetItemColor(#LI, jj, #PB_Gadget_BackColor, #White)
            If jj&1
      SetGadgetItemColor(#LI, jj, #PB_Gadget_BackColor, $EFEFEF)
    EndIf

      Next
      SetGadgetItemColor(#LI, pInfo\iItem, #PB_Gadget_BackColor, #CustomLIGSelectionColor)
      
      Oldr = pInfo\iItem
      Oldc = pInfo\iSubItem   
      
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure CustomLIG(gnumber, x, y, w, h, numC=3, numR=16)
  
  ListIcon = ListIconGadget(gnumber,10,10,620,460,"Column 0",0,#PB_ListIcon_GridLines  )
  AddGadgetColumn(gnumber,1,"Column 1",200) 
  AddGadgetColumn(gnumber,2,"Column 2",200) 
  AddGadgetColumn(gnumber,3,"Column 3",200)
  
  For i = 0 To numR-1 
    AddGadgetItem(gnumber, -1, Chr(10)+"Text in Column 1"+Chr(10)+"Text in Column 2" + Chr(10)+"Text in Column 3" + Chr(10)+"")
    If i&1
      SetGadgetItemColor(gnumber, i, #PB_Gadget_BackColor, $EFEFEF)
    EndIf
  Next
  
  oldCallback = SetWindowLongPtr_(ListIcon, #GWL_WNDPROC, @LIcallback())
  
EndProcedure   

LoadFont(0,"Tahoma",10) 

OpenWindow(0,0,0,640,480,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered)

CustomLIG(#LI, 40, 40, 450, 300, 3, 10)

SetGadgetFont(#LI,FontID(0)) : SetGadgetFont(2  ,FontID(0))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 

Re: Disable Listicon Selection Color?

Posted: Wed Jun 30, 2021 8:16 pm
by novablue
Ok this is almost what i want, when i now select a line the background color changes to green, is it possible for the background color not to change at all and stay whatever i set the background to with SetGadgetItemColor before?

Re: Disable Listicon Selection Color?

Posted: Wed Jun 30, 2021 8:26 pm
by RASHAD
Windows workaround

Code: Select all

Global oldCallback,rowheight

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)
      SetGadgetItemState(0, pInfo\iItem, #PB_ListIcon_Checked|#PB_ListIcon_Selected)
      r.RECT
      r\top = pInfo\iSubItem
      r\left = #LVIR_BOUNDS
      SendMessage_(hWnd, #LVM_GETITEMRECT, pInfo\iItem, r)
      HideWindow(0,0)
      MoveWindow_(WindowID(0),GadgetX(0, #PB_Gadget_ScreenCoordinate), GadgetY(0,#PB_Gadget_ScreenCoordinate) + r\top, GadgetWidth(0)-20,rowheight, 1) 
      Debug GetGadgetState(0)
      
    Case #WM_VSCROLL,#WM_MOUSEWHEEL
      HideWindow(0,1)
     
  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)
          *phdn.NMHEADER = lParam                 
          If  *phdn\iItem = 0
            ProcedureReturn 1
          EndIf
       EndIf
 
    Case #WM_NCACTIVATE
      If wParam = 0
        ProcedureReturn 1
      EndIf
        
    Case #WM_MOVE
      SendMessage_(GadgetID(0), #LVM_GETITEMRECT, GetGadgetState(0), r.rect)
      If r\top > GadgetHeight(0)-30
        r\top-GadgetHeight(0)-30
      EndIf
      MoveWindow_(WindowID(0),GadgetX(0, #PB_Gadget_ScreenCoordinate), GadgetY(0,#PB_Gadget_ScreenCoordinate) + r\top, GadgetWidth(0)-20,rowheight, 1)         
    
    Case #WM_SIZE
      ResizeGadget(0,#PB_Ignore,#PB_Ignore,WindowWidth(10)-20,WindowHeight(10)-50 ) 
  
  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 | #PB_Window_SizeGadget)
  ListIconGadget(0,  10,  10, 620, 450, "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
  SendMessage_(GadgetID(0), #LVM_GETITEMRECT, 0, r.RECT)
  rowheight = r\bottom-r\top+2
 
  OpenWindow(0,0,0,0,0,"",#PB_Window_BorderLess, WindowID(10))
  SetWindowColor(0, GetSysColor_(#COLOR_HIGHLIGHT))
  SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE, GetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE)| #WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(0), GetSysColor_(#COLOR_HIGHLIGHT),10,#LWA_ALPHA) 
  oldCallback = SetWindowLongPtr_(GadgetID(0), #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
 
      EndSelect
 
  EndSelect
Until Quit = 1

Re: Disable Listicon Selection Color?

Posted: Wed Jun 30, 2021 8:40 pm
by novablue
RASHAD wrote: Wed Jun 30, 2021 8:26 pm Windows workaround

Code: Select all

Global oldCallback,rowheight

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)
      SetGadgetItemState(0, pInfo\iItem, #PB_ListIcon_Checked|#PB_ListIcon_Selected)
      r.RECT
      r\top = pInfo\iSubItem
      r\left = #LVIR_BOUNDS
      SendMessage_(hWnd, #LVM_GETITEMRECT, pInfo\iItem, r)
      HideWindow(0,0)
      MoveWindow_(WindowID(0),GadgetX(0, #PB_Gadget_ScreenCoordinate), GadgetY(0,#PB_Gadget_ScreenCoordinate) + r\top, GadgetWidth(0)-20,rowheight, 1) 
      Debug GetGadgetState(0)
      
    Case #WM_VSCROLL,#WM_MOUSEWHEEL
      HideWindow(0,1)
     
  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)
          *phdn.NMHEADER = lParam                 
          If  *phdn\iItem = 0
            ProcedureReturn 1
          EndIf
       EndIf
 
    Case #WM_NCACTIVATE
      If wParam = 0
        ProcedureReturn 1
      EndIf
        
    Case #WM_MOVE
      SendMessage_(GadgetID(0), #LVM_GETITEMRECT, GetGadgetState(0), r.rect)
      If r\top > GadgetHeight(0)-30
        r\top-GadgetHeight(0)-30
      EndIf
      MoveWindow_(WindowID(0),GadgetX(0, #PB_Gadget_ScreenCoordinate), GadgetY(0,#PB_Gadget_ScreenCoordinate) + r\top, GadgetWidth(0)-20,rowheight, 1)         
    
    Case #WM_SIZE
      ResizeGadget(0,#PB_Ignore,#PB_Ignore,WindowWidth(10)-20,WindowHeight(10)-50 ) 
  
  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 | #PB_Window_SizeGadget)
  ListIconGadget(0,  10,  10, 620, 450, "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
  SendMessage_(GadgetID(0), #LVM_GETITEMRECT, 0, r.RECT)
  rowheight = r\bottom-r\top+2
 
  OpenWindow(0,0,0,0,0,"",#PB_Window_BorderLess, WindowID(10))
  SetWindowColor(0, GetSysColor_(#COLOR_HIGHLIGHT))
  SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE, GetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE)| #WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(0), GetSysColor_(#COLOR_HIGHLIGHT),10,#LWA_ALPHA) 
  oldCallback = SetWindowLongPtr_(GadgetID(0), #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
 
      EndSelect
 
  EndSelect
Until Quit = 1
Thank you that works.