I'm loosing my hair to find out, why the following use of EnableGadgetDrop() doesn't fire the needed #PB_EventType_DragStart event, when using it in my larger project source.
So anyone knows about restrictions / needed circumstances to have the Drag'n'Drop (move mode) to be supported in Listview / ListIcon gadgets?
The following code example works as expected, but in my large project it doesn't...
 See below!
  See below!Code: Select all
; English forum: http://www.purebasic.fr/english/viewtopic.php?f=13&t=49510
; Author: RASHAD (extended and reworked by Andre)
; Date: 21. March 2012
; OS: Windows, MacOS
; Demo: Yes
; Drag and Drop to the same ListIcon() as per the ques.
; Code by infratec (Berned)
Procedure ListIconGadgetColumns(GadgetNo)
  i = 0
  While GetGadgetItemAttribute(GadgetNo, 0, #PB_ListIcon_ColumnWidth, i) > 0
    i + 1
  Wend
  ProcedureReturn i
EndProcedure
Procedure ListIconGadgetMove(GadgetNo.i, Source.i, Dest.i)
  Columns = ListIconGadgetColumns(GadgetNo) - 1
  For j = 0 To Columns
    Source$ = GetGadgetItemText(GadgetNo, Source, j)
    If Source < Dest
      For i = Source To Dest - 1
        Help$ = GetGadgetItemText(GadgetNo, i + 1, j)
        SetGadgetItemText(GadgetNo, i, Help$, j)
      Next i
    Else
      For i = Source To Dest + 1 Step - 1
        Help$ = GetGadgetItemText(GadgetNo, i - 1, j)
        SetGadgetItemText(GadgetNo, i, Help$, j)
      Next i
    EndIf
    SetGadgetItemText(GadgetNo, i, Source$, j)
  Next j
EndProcedure
Procedure ListViewGadgetMove(gad.i, Source.i, Dest.i)
  Protected i, Help$, Source$
  Source$ = GetGadgetItemText(gad, Source)
  If Source < Dest
    For i = Source To Dest - 1
      Help$ = GetGadgetItemText(gad, i + 1)
      SetGadgetItemText(gad, i, Help$)
    Next
  Else
    For i = Source To Dest + 1 Step - 1
      Help$ = GetGadgetItemText(gad, i - 1)
      SetGadgetItemText(gad, i, Help$)
    Next
  EndIf
  SetGadgetItemText(gad, i, Source$)
EndProcedure
OpenWindow(0, 0, 0, 600, 600, "Drag'n drop test", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
; ContainerGadget is more for testing only (if the Drag'n'Drop also works, if the related gadgets are placed inside)
gad = ContainerGadget(#PB_Any, 5, 5, 590, 590, #PB_Container_Double)
      
listicon = ListIconGadget(#PB_Any, 10, 10, 570, 380, "Test 1", 150 , #PB_ListIcon_FullRowSelect|#PB_ListIcon_HeaderDragDrop)
AddGadgetColumn(listicon, 1, "Test 2", 150)
AddGadgetColumn(listicon, 2, "Test 3", 120)
AddGadgetColumn(listicon, 3, "Test 4", 120)
For i = 1 To 10
  AddGadgetItem(listicon, -1, "Line " + Str(i) + " Col 1" + Chr(10) + "Line " + Str(i) + " Col 2"+  Chr(10) + "Line " + Str(i) + " Col 3" + Chr(10) + "Line " + Str(i) + " Col 4")
Next i
EnableGadgetDrop(Listicon, #PB_Drop_Private, #PB_Drag_Move, 1)
listview = ListViewGadget(#PB_Any, 10, 400, 570, 170)
For i = 1 To 10
  AddGadgetItem(listview, -1, "Line " + Str(i))
Next i
EnableGadgetDrop(listview, #PB_Drop_Private, #PB_Drag_Move, 1)
Exit = #False
DragItem = -1
Repeat
  Event = WaitWindowEvent()
  EventType = EventType()
  EventGadget = EventGadget()
  
  Select Event
    Case #PB_Event_Gadget
      Select EventType
        Case #PB_EventType_DragStart
          DragItem = GetGadgetState(EventGadget)
          DragPrivate(1, #PB_Drag_Move)
      EndSelect
    Case #PB_Event_GadgetDrop
      If EventDropPrivate() = 1
        TargetItem = GetGadgetState(EventGadget)
        ; Debug "Target: " + Str(TargetItem)
        If EventGadget = listicon
          ListIconGadgetMove(EventGadget, DragItem, TargetItem)
        ElseIf EventGadget = listview
          ListViewGadgetMove(EventGadget, DragItem, TargetItem)
        EndIf
      EndIf
    Case #PB_Event_CloseWindow
      Exit = #True
  EndSelect
  
Until Exit
Here are some code snippets taken from my source...
Gadget definition (the gadget items are added/removed on the fly during the program flow):
Code: Select all
        gad = ListViewGadget(#PB_Any, x, y, 200, fontheight*8, #PB_ListView_ClickSelect)    
        EnableGadgetDrop(gad, #PB_Drop_Private, #PB_Drag_Move, 1)
Code: Select all
Repeat
  Event = WindowEvent()   ; WaitWindowEvent()
  EventGadget	= EventGadget()
  EventMenu	  = EventMenu()
  EventWindow = EventWindow()
  EventType   = EventType()
  
  If Event = #PB_Event_Gadget And Eventtype = #PB_EventType_DragStart  
    Debug "Drag'n'Drop started..."
          DragItem = GetGadgetState(EventGadget)
          DragPrivate(1, #PB_Drag_Move)
  EndIf
  ....
(I'm currently coding on MacOS 10.5.8 - but it should be the same on Windows too...)
Thanks a lot for advice!



 
  .
. 
  
 






 
  
  
 
