Re: Visual Help for drag&drop in ListView
Posted: Mon Jan 06, 2020 10:35 am
Same here too.
There is still a light blue selection.
EDIT : it works better but it hangs when you select an item in the right listview and retry a drag.
There is still a light blue selection.
EDIT : it works better but it hangs when you select an item in the right listview and retry a drag.
Code: Select all
EnableExplicit
Structure LVINSERTMARK
cbSize.l
dwFlags.l
iItem.l
dwReserved.l
EndStructure
Define HeaderHeight.I
Define Rectangle.RECT
Define Row.I
Define RowHeight.I
Define RowInsertionIndex.I
Global drag = #False
Procedure WinProc(hWnd, Msg, wParam, lParam)
Protected result = #PB_ProcessPureBasicEvents
Protected *tInfo.NMITEMACTIVATE
Select Msg
Case #WM_NOTIFY
Protected *tNMHDR.NMHDR = lParam
Select *tNMHDR\hwndFrom
Case GadgetID(1)
Select *tNMHDR\code
Case #LVN_ITEMCHANGING
If drag
ProcedureReturn #True ; disable Highlight
Else
ProcedureReturn #False ; normal behaviour
EndIf
EndSelect
EndSelect
EndSelect
ProcedureReturn result
EndProcedure
Procedure DragCallback(Action.I)
Shared HeaderHeight.I
Shared RowHeight.I
Shared RowInsertionIndex.I
Protected CursorPositon.POINT
Protected InsertMark.LVINSERTMARK
Protected Rectangle.RECT
InsertMark\cbSize = SizeOf(LVINSERTMARK)
GetCursorPos_(CursorPositon)
GetWindowRect_(GadgetID(1), Rectangle)
If PtInRect_(Rectangle, CursorPositon \ x + (CursorPositon \ y) << 32)
MapWindowPoints_(0, GadgetID(1), CursorPositon, 1)
; ----- Display insertion line
SendMessage_(GadgetID(1), #LVM_INSERTMARKHITTEST, @CursorPositon, @InsertMark)
If SendMessage_(GadgetID(1), #LVM_SETINSERTMARK, 0, @InsertMark)
RowInsertionIndex = InsertMark\iItem
If (CursorPositon\y - HeaderHeight) % RowHeight > RowHeight * 0.5
RowInsertionIndex + 1
EndIf
EndIf
ProcedureReturn #True
EndIf
EndProcedure
OpenWindow(0, 0, 0, 730, 500, "Drag row from left to right", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0, 10, 10, WindowWidth(0) / 2 - 15, 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")
ListIconGadget(1, WindowWidth(0) / 2 + 5, 10, WindowWidth(0) / 2 - 15, WindowHeight(0) - 20, "Name", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(1, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 4)
EnableGadgetDrop(1, #PB_Drop_Text, #PB_Drag_Copy)
SetDragCallback(@DragCallback())
; ----- Get height of header row
GetClientRect_(SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0), @Rectangle)
HeaderHeight = Rectangle\bottom - Rectangle\top
; ----- Get height of single row
RowHeight = SendMessage_(GadgetID(0), #LVM_GETITEMSPACING, #True, 0) >> 16
SendMessage_(GadgetID(1), #LVM_SETINSERTMARKCOLOR, 0, $0000FF) ; couleur de la ligne d'insertion
SetWindowCallback(@WinProc(), 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_DragStart
drag = #True
Row = GetGadgetState(0)
If Row >= 0
DragText(GetGadgetItemText(0, Row, 0) + #LF$ + GetGadgetItemText(0, Row, 1), #PB_Drag_Copy)
EndIf
EndIf
Case #PB_Event_GadgetDrop
drag = #False
AddGadgetItem(1, RowInsertionIndex, EventDropText())
EndSelect
ForEver