Also bei mir ist kein "Spacing" dazwischen. Ansonsten wäre dieser Wert der ausgelesene Offset-Wert.
Ein Gtk-Spacing gibt eine Verschiebung in der x-Achse und nicht in der y-Achse an.
Und hier einmal ein Drag and Drop - Beispiel mit Dropping (nicht Drag) - Verbot.
Code: Alles auswählen
;Angepasstes Beispiel durch ccode_new
EnableExplicit
Global treeview
Global Beenden.b
Global Event, EventType, EventGadget
Global DragGadget, DragItem, TargetItem
Global Verboten.b = #False
Global DropText.s
Enumeration
#Drag_TreeView
EndEnumeration
;folgende Proceduren sind © by Andre on 6th May 2012
Procedure ListIconGadgetColumns(GadgetNo)
Protected i
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)
Protected Columns, i, j, Help$, Source$
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)
; This procedure is written by Andre on the base of the ListIconGadgetMove() function found on the PB forum.
; It was enhanced to support also moving of listview item text and data, and to take care when the dropping
; is finished after the current displayed items (then use the last item as destination for the move operation).
Protected i, ItemText$, ItemData, Source$, SourceData
Source$ = GetGadgetItemText(gad, Source)
SourceData = GetGadgetItemData(gad, Source)
;Debug "Dragged item (Source) = " + Str(Source) + ", Dropped at (Dest) = " + Str(Dest)
;If Source = -1 Or Dest = -1
; Debug "Warning: Source = " + Str(Source) + ", Dest = " + Str(Dest)
;EndIf
If Source = -1
; Sometimes it happens, that dragging an item (especially the first one) and dropping
; it at the same place cause a "DragStart" event, but the 'Source' parameter is -1.
; In this case don't make any chances and return to main event loop!
ProcedureReturn
EndIf
If Dest = -1
; The dragged item was dropped after the last item (giving -1 as result of GetGadgetState(),
; so we make the dragged one the last one now...
Dest = CountGadgetItems(gad) - 1
EndIf
If Source < Dest
For i = Source To Dest - 1
ItemText$ = GetGadgetItemText(gad, i + 1)
ItemData = GetGadgetItemData(gad, i + 1)
SetGadgetItemText(gad, i, ItemText$)
SetGadgetItemData(gad, i, ItemData)
Next
Else
For i = Source To Dest + 1 Step - 1
ItemText$ = GetGadgetItemText(gad, i - 1)
ItemData = GetGadgetItemData(gad, i - 1)
SetGadgetItemText(gad, i, ItemText$)
SetGadgetItemData(gad, i, ItemData)
Next
EndIf
SetGadgetItemText(gad, i, Source$)
SetGadgetItemData(gad, i, SourceData)
EndProcedure
;...es geht weiter
Procedure DragCallback(*Context.GdkDragContext, isStart)
If isStart = #False
If GetGadgetItemText(treeview, DragItem) = "Ich bin nicht verschiebbar."
MessageRequester("Ein Verbot ist aufgetreten.","Böse, Böse... Das darfst du nicht !!!",#PB_MessageRequester_Warning)
Verboten = #True
Else
Verboten = #False
EndIf
EndIf
EndProcedure
OpenWindow(0, 0, 0, 640, 480, "Privates verschieben", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
SetDragCallback(@DragCallback())
TextGadget(0, 10, 10, 400, 20, "Dies ist ein Baum-Element (auch Gadget genannt) ;):")
treeview = TreeGadget(#PB_Any, 10, 40, 630, 470)
AddGadgetItem(treeview, 0, "Ich bin verschiebbar.",0,0)
AddGadgetItem(treeview, 1, "Ich bin mit verschiebbar.",0,1)
AddGadgetItem(treeview, 2, "Ich bin nicht verschiebbar.",0,0)
AddGadgetItem(treeview, 3, "Ich bin aber auch verschiebbar.",0,1)
EnableGadgetDrop(treeview, #PB_Drop_Private, #PB_Drag_Move, #Drag_TreeView)
Beenden = #False
DragItem = -1
;Dies ist eine Schleife (sogar eine gaaanz wichtige Schleife)
Repeat
Event = WaitWindowEvent()
EventType = EventType()
EventGadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case treeview
Select EventType
Case #PB_EventType_DragStart
DragGadget = EventGadget
DragItem = GetGadgetState(DragGadget)
If DragGadget = treeview
DragPrivate(#Drag_TreeView, #PB_Drag_Move)
EndIf
EndSelect
EndSelect
Case #PB_Event_GadgetDrop
If Verboten = #False
EventGadget = GetActiveGadget()
TargetItem = GetGadgetState(EventGadget)
If EventDropPrivate() = #Drag_TreeView
ListViewGadgetMove(EventGadget, DragItem, TargetItem)
EndIf
EndIf
Case #PB_Event_CloseWindow
Beenden = #True
EndSelect
Until Beenden