Thank you Shardik for your code
Do you think it's possible to have a working code in which you move a line instead of making a copy of it ?
That would be great
Thanks
Visual Help for drag&drop in ListView
- Mindphazer
- Enthusiast
- Posts: 456
- Joined: Mon Sep 10, 2012 10:41 am
- Location: Savoie
Re: Visual Help for drag&drop in ListView
MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
...and unfortunately... Windows at work...
Re: Visual Help for drag&drop in ListView
@Shardik
Works fine! Thanks again!
@Mindphazer
You only need to replace the two occurrences of #PB_Drag_Copy with #PB_Drag_Move
and insert this:
RemoveGadgetItem(0, RowIndex)
Before the line:
AddGadgetItem(0, RowInsertionIndex, EventDropText())
Works fine! Thanks again!
@Mindphazer
You only need to replace the two occurrences of #PB_Drag_Copy with #PB_Drag_Move
and insert this:
RemoveGadgetItem(0, RowIndex)
Before the line:
AddGadgetItem(0, RowInsertionIndex, EventDropText())
- Mindphazer
- Enthusiast
- Posts: 456
- Joined: Mon Sep 10, 2012 10:41 am
- Location: Savoie
Re: Visual Help for drag&drop in ListView
@camille
Thanks a lot, I was a bit too lazy to search
Thanks a lot, I was a bit too lazy to search

MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
...and unfortunately... Windows at work...
Re: Visual Help for drag&drop in ListView
If you need the text from the line you're dragging on overlapping textgadget, you can do this :
(comment/uncomment to get a transparent background version)
EDIT : It's working fine in this example but flickers a lot with my main code...
(comment/uncomment to get a transparent background version)
Code: Select all
Structure LVINSERTMARK
cbSize.L
dwFlags.L
iItem.L
dwReserved.L
EndStructure
Define DraggingIsActive.I
Define HeaderHeight.I
Define Rectangle.RECT
Define RowIndex.I
Define RowHeight.I
Define RowInsertionIndex.I
Global dragtext.s
Procedure myTextWidth(text$, Window)
Protected Length = 0
If StartDrawing(WindowOutput(Window))
DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
Length = TextWidth(text$)
StopDrawing()
EndIf
ProcedureReturn Length
EndProcedure
Procedure myTextHeight(text$, Window)
Protected Length = 0
If StartDrawing(WindowOutput(Window))
DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
Length = TextHeight(text$)
StopDrawing()
EndIf
ProcedureReturn Length
EndProcedure
Procedure WindowCallback(WindowHandle.I, Msg.I, WParam.I, LParam.I)
Shared DraggingIsActive.I
Protected *NMHdr.NMHDR
Select Msg
Case #WM_NOTIFY
*NMHdr = LParam
If *NMHdr\hwndFrom = GadgetID(0)
If *NMHdr\code = #LVN_ITEMCHANGING
If DraggingIsActive And GetGadgetState(0) = -1
; ----- Disable highlighting of item under cursor
ProcedureReturn #True
EndIf
EndIf
EndIf
; uncomment this message if you test the transparent version
; Case #WM_CTLCOLORSTATIC
; Select LParam
; Case GadgetID(1)
; SetBkMode_(wparam,#TRANSPARENT)
; SetTextColor_(wParam,$FF0000)
; ProcedureReturn GetStockObject_(#HOLLOW_BRUSH)
; EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure DragCallback(Action.I)
Shared HeaderHeight.I
Shared RowHeight.I
Shared RowInsertionIndex.I
Protected CursorPositon.POINT
Protected CursorRow.I
Protected InsertMark.LVINSERTMARK
Protected Rectangle.RECT
Protected RowCount.I
InsertMark\cbSize = SizeOf(LVINSERTMARK)
GetCursorPos_(CursorPositon)
GetWindowRect_(GadgetID(0), Rectangle)
If PtInRect_(Rectangle, CursorPositon\x + (CursorPositon\y) << 32)
; ----- Convert x and y from coordinate space to window-relative space
MapWindowPoints_(0, GadgetID(0), CursorPositon, 1)
; ----- Get row index of current cursor position
CursorRow = (CursorPositon\y - HeaderHeight) / RowHeight
RowCount = CountGadgetItems(0)
If CursorRow >= RowCount
; ----- Cursor is in empty row below last item
RowInsertionIndex = RowCount
ElseIf CursorRow = -1
CursorRow = 0
Else
; ----- Get row insertion index
SendMessage_(GadgetID(0), #LVM_INSERTMARKHITTEST, @CursorPositon, @InsertMark)
; ----- Display insertion line
SendMessage_(GadgetID(0), #LVM_SETINSERTMARK, 0, @InsertMark)
RowInsertionIndex = InsertMark\iItem
; ----- Increase index if cursor is in lower part of row
If (CursorPositon\y - HeaderHeight) % RowHeight > RowHeight * 0.5
RowInsertionIndex + 1
EndIf
ResizeGadget(1, CursorPositon\x + 30, CursorPositon\y + 10, #PB_Ignore, #PB_Ignore)
GetWindowRect_(GadgetID(1), crc.RECT)
MapWindowPoints_(0, WindowID(0), crc, 2)
InvalidateRect_(WindowID(0), crc, 0)
EndIf
ProcedureReturn #True
EndIf
EndProcedure
Procedure DropCallback(TargetHandle.I, Status.I, Format.I, Action.I, x.I, y.I)
Shared DraggingIsActive.I
Protected InsertMark.LVINSERTMARK
Protected Result.I = #False
InsertMark\cbSize = SizeOf(LVINSERTMARK)
Select Status
Case #PB_Drag_Move, #PB_Drag_Enter
DraggingIsActive = #True
Case #PB_Drag_Leave, #PB_Drag_Finish
DraggingIsActive = #False
; ----- Remove insertion line
InsertMark\iItem = -1
SendMessage_(GadgetID(0), #LVM_SETINSERTMARK, 0, @InsertMark)
EndSelect
If Status <> #PB_Drag_Leave
Result = #True
EndIf
ProcedureReturn Result
EndProcedure
OpenWindow(0, 100, 100, 370, 150, "Drag 'n drop row inside gadget")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Name", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 4)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ + "321 Logo Drive, Mouse House, Downtown")
EnableGadgetDrop(0, #PB_Drop_Text, #PB_Drag_Copy)
SetDragCallback(@DragCallback())
SetDropCallback(@DropCallback())
; ----- Get height of header row
GetClientRect_(SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0), @Rectangle)
HeaderHeight = Rectangle\bottom - Rectangle\top
; ----- Get height of single row
RowHeight = SendMessage_(GadgetID(0), #LVM_GETITEMSPACING, #True, 0) >> 16
; ----- Initialize WindowCallback to suppress highlighting
SetWindowCallback(@WindowCallback(), 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_DragStart
DraggingIsActive = #True
RowIndex = GetGadgetState(0)
; ----- Deselect any selected entry
SetGadgetState(0, -1)
If RowIndex >= 0
dragtext = GetGadgetItemText(0, RowIndex, 0)
w = myTextWidth(dragtext, 0)
h = myTextHeight(dragtext, 0)
TextGadget(1, WindowMouseX(0) + 30, WindowMouseY(0) + 10, w, h, dragtext)
; comment this 2 lines if you test the transparent version
SetGadgetColor(1, #PB_Gadget_BackColor, #White)
SetGadgetColor(1, #PB_Gadget_FrontColor, #Blue)
DragText(GetGadgetItemText(0, RowIndex, 0) + #LF$ + GetGadgetItemText(0, RowIndex, 1), #PB_Drag_Copy)
EndIf
EndIf
Case #PB_Event_GadgetDrop
FreeGadget(1)
AddGadgetItem(0, RowInsertionIndex, EventDropText())
; ----- Deselect any selected entry
SetGadgetState(0, -1)
EndSelect
ForEver
Windows 10 Pro x64
PureBasic 6.20 x64
PureBasic 6.20 x64
Re: Visual Help for drag&drop in ListView
Ok I know why it's flickering like hell. My listview is inside a panelgadget.
This code use an imagegadget instead of textgadget but the problem is still the same...
EDIT : For now the best way to avoid this flickering is to create a popup window and make image or text gadget inside. Then move the window according to the drag item.
This code use an imagegadget instead of textgadget but the problem is still the same...
Code: Select all
Structure LVINSERTMARK
cbSize.L
dwFlags.L
iItem.L
dwReserved.L
EndStructure
Define DraggingIsActive.I
Define HeaderHeight.I
Define Rectangle.RECT
Define RowIndex.I
Define RowHeight.I
Define RowInsertionIndex.I
Global dragtext.s
Procedure myTextWidth(text$, Window)
Protected Length = 0
If StartDrawing(WindowOutput(Window))
DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
Length = TextWidth(text$)
StopDrawing()
EndIf
ProcedureReturn Length
EndProcedure
Procedure myTextHeight(text$, Window)
Protected Length = 0
If StartDrawing(WindowOutput(Window))
DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
Length = TextHeight(text$)
StopDrawing()
EndIf
ProcedureReturn Length
EndProcedure
Procedure WindowCallback(WindowHandle.I, Msg.I, WParam.I, LParam.I)
Shared DraggingIsActive.I
Protected *NMHdr.NMHDR
Select Msg
Case #WM_NOTIFY
*NMHdr = LParam
If *NMHdr\hwndFrom = GadgetID(0)
If *NMHdr\code = #LVN_ITEMCHANGING
If DraggingIsActive And GetGadgetState(0) = -1
; ----- Disable highlighting of item under cursor
ProcedureReturn #True
EndIf
EndIf
EndIf
; uncomment this message if you test the transparent version
; Case #WM_CTLCOLORSTATIC
; Select LParam
; Case GadgetID(1)
; SetBkMode_(wparam,#TRANSPARENT)
; SetTextColor_(wParam,$FF0000)
; ProcedureReturn GetStockObject_(#HOLLOW_BRUSH)
; EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure DragCallback(Action.I)
Shared HeaderHeight.I
Shared RowHeight.I
Shared RowInsertionIndex.I
Protected CursorPositon.POINT
Protected CursorRow.I
Protected InsertMark.LVINSERTMARK
Protected Rectangle.RECT
Protected RowCount.I
InsertMark\cbSize = SizeOf(LVINSERTMARK)
GetCursorPos_(CursorPositon)
GetWindowRect_(GadgetID(0), Rectangle)
If PtInRect_(Rectangle, CursorPositon\x + (CursorPositon\y) << 32)
; ----- Convert x and y from coordinate space to window-relative space
MapWindowPoints_(0, GadgetID(0), CursorPositon, 1)
; ----- Get row index of current cursor position
CursorRow = (CursorPositon\y - HeaderHeight) / RowHeight
RowCount = CountGadgetItems(0)
If CursorRow >= RowCount
; ----- Cursor is in empty row below last item
RowInsertionIndex = RowCount
ElseIf CursorRow = -1
CursorRow = 0
Else
; ----- Get row insertion index
SendMessage_(GadgetID(0), #LVM_INSERTMARKHITTEST, @CursorPositon, @InsertMark)
; ----- Display insertion line
SendMessage_(GadgetID(0), #LVM_SETINSERTMARK, 0, @InsertMark)
RowInsertionIndex = InsertMark\iItem
; ----- Increase index if cursor is in lower part of row
If (CursorPositon\y - HeaderHeight) % RowHeight > RowHeight * 0.5
RowInsertionIndex + 1
EndIf
; ResizeGadget(1, CursorPositon\x + 30, CursorPositon\y + 10, #PB_Ignore, #PB_Ignore)
ResizeGadget(1, CursorPositon\x + 30, CursorPositon\y + 10, #PB_Ignore, #PB_Ignore)
; GetWindowRect_(GadgetID(1), crc.RECT)
; MapWindowPoints_(0, WindowID(0), crc, 2)
; InvalidateRect_(WindowID(0), crc, 0)
EndIf
ProcedureReturn #True
EndIf
EndProcedure
Procedure DropCallback(TargetHandle.I, Status.I, Format.I, Action.I, x.I, y.I)
Shared DraggingIsActive.I
Protected InsertMark.LVINSERTMARK
Protected Result.I = #False
InsertMark\cbSize = SizeOf(LVINSERTMARK)
Select Status
Case #PB_Drag_Move, #PB_Drag_Enter
DraggingIsActive = #True
Case #PB_Drag_Leave, #PB_Drag_Finish
DraggingIsActive = #False
; ----- Remove insertion line
InsertMark\iItem = -1
SendMessage_(GadgetID(0), #LVM_SETINSERTMARK, 0, @InsertMark)
EndSelect
If Status <> #PB_Drag_Leave
Result = #True
EndIf
ProcedureReturn Result
EndProcedure
OpenWindow(0, 100, 100, 370, 180, "Drag 'n drop row inside gadget")
onglet = PanelGadget(#PB_Any, 5, 0, 360, 175)
AddGadgetItem(onglet, -1, "tab")
ListIconGadget(0, 5, 10, 340, 130, "Name", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 4)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ + "321 Logo Drive, Mouse House, Downtown")
CloseGadgetList()
EnableGadgetDrop(0, #PB_Drop_Text, #PB_Drag_Copy)
SetDragCallback(@DragCallback())
SetDropCallback(@DropCallback())
; ----- Get height of header row
GetClientRect_(SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0), @Rectangle)
HeaderHeight = Rectangle\bottom - Rectangle\top
; ----- Get height of single row
RowHeight = SendMessage_(GadgetID(0), #LVM_GETITEMSPACING, #True, 0) >> 16
; ----- Initialize WindowCallback to suppress highlighting
SetWindowCallback(@WindowCallback(), 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_DragStart
DraggingIsActive = #True
RowIndex = GetGadgetState(0)
; ----- Deselect any selected entry
SetGadgetState(0, -1)
If RowIndex >= 0
dragtext = GetGadgetItemText(0, RowIndex, 0)
w = myTextWidth(dragtext, 0)
h = myTextHeight(dragtext, 0)
; TextGadget(1, WindowMouseX(0) + 30, WindowMouseY(0) + 10, w, h, dragtext)
; comment this 2 lines if you test the transparent version
; SetGadgetColor(1, #PB_Gadget_FrontColor, #White)
; SetGadgetColor(1, #PB_Gadget_BackColor, #Blue)
CreateImage(9, w, h); , 32, #PB_Image_Transparent)
StartDrawing(ImageOutput(9))
; DrawingMode(#PB_2DDrawing_AllChannels)
DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
DrawText(0, 0, dragtext, #Blue, #White) ; RGBA(0, 0, 0, 255), RGBA(255, 255, 255, 0)
StopDrawing()
ImageGadget(1, 0, 0, 0, 0, ImageID(9))
DragText(GetGadgetItemText(0, RowIndex, 0) + #LF$ + GetGadgetItemText(0, RowIndex, 1), #PB_Drag_Copy)
EndIf
EndIf
Case #PB_Event_GadgetDrop
FreeGadget(1)
FreeImage(9)
AddGadgetItem(0, RowInsertionIndex, EventDropText())
; ----- Deselect any selected entry
SetGadgetState(0, -1)
EndSelect
ForEver
EDIT : For now the best way to avoid this flickering is to create a popup window and make image or text gadget inside. Then move the window according to the drag item.
Code: Select all
Structure LVINSERTMARK
cbSize.L
dwFlags.L
iItem.L
dwReserved.L
EndStructure
Define DraggingIsActive.I
Define HeaderHeight.I
Define Rectangle.RECT
Define RowIndex.I
Define RowHeight.I
Define RowInsertionIndex.I
Global dragtext.s
Procedure myTextWidth(text$, Window)
Protected Length = 0
If StartDrawing(WindowOutput(Window))
DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
Length = TextWidth(text$)
StopDrawing()
EndIf
ProcedureReturn Length
EndProcedure
Procedure myTextHeight(text$, Window)
Protected Length = 0
If StartDrawing(WindowOutput(Window))
DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
Length = TextHeight(text$)
StopDrawing()
EndIf
ProcedureReturn Length
EndProcedure
Procedure WindowCallback(WindowHandle.I, Msg.I, WParam.I, LParam.I)
Shared DraggingIsActive.I
Protected *NMHdr.NMHDR
Select Msg
Case #WM_NOTIFY
*NMHdr = LParam
If *NMHdr\hwndFrom = GadgetID(0)
If *NMHdr\code = #LVN_ITEMCHANGING
If DraggingIsActive And GetGadgetState(0) = -1
; ----- Disable highlighting of item under cursor
ProcedureReturn #True
EndIf
EndIf
EndIf
; uncomment this message if you test the transparent version
; Case #WM_CTLCOLORSTATIC
; Select LParam
; Case GadgetID(1)
; SetBkMode_(wparam,#TRANSPARENT)
; SetTextColor_(wParam,$FF0000)
; ProcedureReturn GetStockObject_(#HOLLOW_BRUSH)
; EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure DragCallback(Action.I)
Shared HeaderHeight.I
Shared RowHeight.I
Shared RowInsertionIndex.I
Protected CursorPositon.POINT
Protected CursorRow.I
Protected InsertMark.LVINSERTMARK
Protected Rectangle.RECT
Protected RowCount.I
InsertMark\cbSize = SizeOf(LVINSERTMARK)
GetCursorPos_(CursorPositon)
GetWindowRect_(GadgetID(0), Rectangle)
If PtInRect_(Rectangle, CursorPositon\x + (CursorPositon\y) << 32)
; ----- Convert x and y from coordinate space to window-relative space
MapWindowPoints_(0, GadgetID(0), CursorPositon, 1)
; ----- Get row index of current cursor position
CursorRow = (CursorPositon\y - HeaderHeight) / RowHeight
RowCount = CountGadgetItems(0)
If CursorRow >= RowCount
; ----- Cursor is in empty row below last item
RowInsertionIndex = RowCount
ElseIf CursorRow = -1
CursorRow = 0
Else
; ----- Get row insertion index
SendMessage_(GadgetID(0), #LVM_INSERTMARKHITTEST, @CursorPositon, @InsertMark)
; ----- Display insertion line
SendMessage_(GadgetID(0), #LVM_SETINSERTMARK, 0, @InsertMark)
RowInsertionIndex = InsertMark\iItem
; ----- Increase index if cursor is in lower part of row
If (CursorPositon\y - HeaderHeight) % RowHeight > RowHeight * 0.5
RowInsertionIndex + 1
EndIf
ResizeWindow(1, WindowX(0) + WindowMouseX(0) + 30, WindowY(0) + WindowMouseY(0) + 10, #PB_Ignore, #PB_Ignore)
EndIf
ProcedureReturn #True
EndIf
EndProcedure
Procedure DropCallback(TargetHandle.I, Status.I, Format.I, Action.I, x.I, y.I)
Shared DraggingIsActive.I
Protected InsertMark.LVINSERTMARK
Protected Result.I = #False
InsertMark\cbSize = SizeOf(LVINSERTMARK)
Select Status
Case #PB_Drag_Move, #PB_Drag_Enter
DraggingIsActive = #True
Case #PB_Drag_Leave, #PB_Drag_Finish
DraggingIsActive = #False
; ----- Remove insertion line
InsertMark\iItem = -1
SendMessage_(GadgetID(0), #LVM_SETINSERTMARK, 0, @InsertMark)
EndSelect
If Status <> #PB_Drag_Leave
Result = #True
EndIf
ProcedureReturn Result
EndProcedure
OpenWindow(0, 100, 100, 370, 180, "Drag 'n drop row inside gadget")
onglet = PanelGadget(#PB_Any, 5, 0, 360, 175)
AddGadgetItem(onglet, -1, "tab")
ListIconGadget(0, 5, 10, 340, 130, "Name", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 4)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ + "321 Logo Drive, Mouse House, Downtown")
CloseGadgetList()
EnableGadgetDrop(0, #PB_Drop_Text, #PB_Drag_Copy)
SetDragCallback(@DragCallback())
SetDropCallback(@DropCallback())
; ----- Get height of header row
GetClientRect_(SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0), @Rectangle)
HeaderHeight = Rectangle\bottom - Rectangle\top
; ----- Get height of single row
RowHeight = SendMessage_(GadgetID(0), #LVM_GETITEMSPACING, #True, 0) >> 16
; ----- Initialize WindowCallback to suppress highlighting
SetWindowCallback(@WindowCallback(), 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_DragStart
DraggingIsActive = #True
RowIndex = GetGadgetState(0)
; ----- Deselect any selected entry
SetGadgetState(0, -1)
If RowIndex >= 0
dragtext = GetGadgetItemText(0, RowIndex, 0)
w = myTextWidth(dragtext, 0)
h = myTextHeight(dragtext, 0)
OpenWindow(1, WindowX(0) + WindowMouseX(0) + 30, WindowY(0) + WindowMouseY(0) + 10, w, h, "", #PB_Window_BorderLess, WindowID(0))
TextGadget(1, 0, 0, w, h, dragtext)
SetGadgetColor(1, #PB_Gadget_FrontColor, #White)
SetGadgetColor(1, #PB_Gadget_BackColor, #Blue)
DragText(GetGadgetItemText(0, RowIndex, 0) + #LF$ + GetGadgetItemText(0, RowIndex, 1), #PB_Drag_Copy)
EndIf
EndIf
Case #PB_Event_GadgetDrop
CloseWindow(1)
AddGadgetItem(0, RowInsertionIndex, EventDropText())
; ----- Deselect any selected entry
SetGadgetState(0, -1)
EndSelect
ForEver
Windows 10 Pro x64
PureBasic 6.20 x64
PureBasic 6.20 x64