Page 1 of 1
RMB on ListIconGadget header
Posted: Sat Dec 31, 2022 5:21 pm
by blueznl
I haven't been programming much lately, but now need to change a few very old tools, and want to add a bit of GUI to them.
I'm not in the mood to write my own kind of Gridgadget (yet

) and trying to limit myself to PureBasic (so no external libraries). I probably could build it using the CanvasGadget, and might do so at a later date, but for now I first need to establish a kind of proof-of-concept.
So, I looked to repurpose the LIstIconGadget, and it does most of the things I need it to do, except two things...
1. How to detect an RMB on the header? (To offer sorting.)
2. Is there a way to discern between single and double click? (It's pretty annoying an LMB is always fired before and after a doubleclik.)
On a completely unrelated side note, Happy New Year!
Re: RMB on ListIconGadget header
Posted: Sat Dec 31, 2022 5:46 pm
by Axolotl
maybe this is something you are looking for
Code: Select all
; =================================================================
;
; Author: Shardik
; Date: January 27th, 2015
; Explain: Get ListIconGadget column
;
; Typical Usage:
;
; File Name: Get Column Info.pb
; =================================================================
Enumeration
#MainForm
EndEnumeration
Enumeration Gadget
#MyListIcon
EndEnumeration
Procedure OnListIconCLick(WindowID, message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select message
Case #WM_NOTIFY
*nmITEM.NMITEMACTIVATE = lParam
Select *nmITEM\hdr\code
Case #LVN_COLUMNCLICK ;/ HeaderClick
If *nmITEM\hdr\hwndFrom = GadgetID(#MyListIcon) ;/ ListIconGadget
Debug " header col = " + Str(*nmITEM\iSubItem)
Result = #True
EndIf
Case #NM_CLICK ;/ CellClick (Your question)
If *nmITEM\hdr\hwndFrom = GadgetID(#MyListIcon) ;/ ListIconGadget
Debug "row = " + Str(*nmITEM\iItem) + ", col = "+Str(*nmITEM\iSubItem) + ", content = "+ GetGadgetItemText(#MyListIcon, *nmITEM\iItem,*nmITEM\iSubItem)
Result = #True
EndIf
Case #NM_DBLCLK
Debug "left doubleclick"
;Your code
Case #NM_RCLICK
Debug "right click"
;Your code
Case #NM_RDBLCLK
Debug "right doubleclick"
;Your code
EndSelect
EndSelect
ProcedureReturn Result
EndProcedure
Procedure Start()
Protected n, Buffer.s
OpenWindow(#MainForm, 0, 0, 500, 500, "Listicon gadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowCallback(@OnListIconCLick(), #MainForm)
ListIconGadget(#MyListIcon, 10, 10, 480, 400, "Col 0", 100, #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#MyListIcon, 1, "Col 1", 100)
AddGadgetColumn(#MyListIcon, 2, "Col 2", 100)
For n=0 To 10
Buffer = "Item " + Str(n) + Chr(10) + "Result Col 1=" + Str(n) + Chr(10) + "Result Col 2=" + Str(n)
AddGadgetItem(#MyListIcon, -1, Buffer)
Next
Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndProcedure
Start()
Happy New Year!
Re: RMB on ListIconGadget header
Posted: Sat Dec 31, 2022 6:34 pm
by blueznl
Ah, yes. I could use a callback. Hmmm... I might be lazy and (ab)use a popup menu for now. It's still a proof of concept, and the GUI elements are just to quickly test the code. (Some boring analysis of a certain type of report.)
But I might use this if it ever leaves the proto stage, so thanks!
Re: RMB on ListIconGadget header
Posted: Sat Dec 31, 2022 6:41 pm
by RASHAD
Subclassing ListIcon Header
RMB on header only
No interference with Licon
Code: Select all
Global oldCB,hi.LVHITTESTINFO
Procedure headerCB(hWnd, uMsg, wParam, lParam)
result = CallWindowProc_(oldCB, hWnd, uMsg, wParam, lParam)
Select uMsg
Case #WM_LBUTTONUP
GetCursorPos_(@p.POINT)
ScreenToClient_(GadgetID(0), p)
hi\pt\x = p\x
hi\pt\y = p\y
SendMessage_(GadgetID(0),#LVM_SUBITEMHITTEST,0,@hi)
Debug "LMB : " +Str(hi\iSubItem)
Case #WM_RBUTTONUP
GetCursorPos_(@p.POINT)
ScreenToClient_(GadgetID(0), p)
hi\pt\x = p\x
hi\pt\y = p\y
SendMessage_(GadgetID(0),#LVM_SUBITEMHITTEST,0,@hi)
Debug "RMB : " +Str(hi\iSubItem)
Case #WM_LBUTTONDBLCLK
GetCursorPos_(@p.POINT)
ScreenToClient_(GadgetID(0), p)
hi\pt\x = p\x
hi\pt\y = p\y
SendMessage_(GadgetID(0),#LVM_SUBITEMHITTEST,0,@hi)
Debug "LMB DCLICK : " +Str(hi\iSubItem)
EndSelect
ProcedureReturn result
EndProcedure
OpenWindow(5,0,0,640,480,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered)
ListIcon = ListIconGadget(0,10,10,620,460,"",0,#PB_ListIcon_GridLines)
header = SendMessage_(GadgetID(0),#LVM_GETHEADER,0,0)
AddGadgetColumn(0,1,"Column 1",210)
AddGadgetColumn(0,2,"Column 2",200)
AddGadgetColumn(0,3,"Column 3",200)
For i = 1 To 16
linestr.s = LSet(Str(i),3," ")
AddGadgetItem(0, -1, Chr(10)+"Text on Line "+linestr+" in Column 1"+Chr(10)+"Text on Line "+linestr+" in Column 2"+Chr(10)+"Text on Line "+linestr+" in Column 3")
Next
oldCB = SetWindowLongPtr_(header, #GWL_WNDPROC, @headerCB())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Menu
Select EventMenu()
EndSelect
EndSelect
Until Quit = 1
Re: RMB on ListIconGadget header
Posted: Sun Jan 01, 2023 10:59 am
by mk-soft
If you still need GridGadget, there is a very good one from Said. I have carried out the last updates.
Link:
Said's Canvas based Grid gadget
Link:
Last updates from me on Github
Re: RMB on ListIconGadget header
Posted: Sun Jan 01, 2023 8:42 pm
by blueznl
Thanks! I'll have a look at that as well. For now I'm mostly working on a proof of concept.
Re: RMB on ListIconGadget header
Posted: Sun Jan 01, 2023 9:22 pm
by blueznl
RASHAD wrote: Sat Dec 31, 2022 6:41 pm
Global oldCB,hi.LVHITTESTINFO
@RASHAD
Does hi.LVHITTESTINFO need to be a global?
Re: RMB on ListIconGadget header
Posted: Sun Jan 01, 2023 9:30 pm
by RASHAD