Seite 1 von 1
Reihenfolge im ListIconGadget per Dra'n'Drop ändern
Verfasst: 19.05.2008 10:01
von Ghosty1967
Hallo Leutz...
Ich habe ein ListIcon, welches ich mit
Code: Alles auswählen
ListIconGadget(#list_programme,6,28,178,241,"",#PB_Ignore)
ChangeListIconGadgetDisplay(#list_programme,#PB_ListIcon_SmallIcon)
...
erstellt habe. Hierin werden diverse Programme mit Ihren Icons angezeigt.
Nun möchte ich gerne die reihenfolge der Einträge innerhalb des ListIcons
mit der Maus per Drag'n'Drop ändern.
Ich habe mir schon diverse Codebeispiele in den Foren angeschaut, finde aber
leider immer nur Beispiele um von einem ListIcon in ein anderes zu "droppen".

Könnte mir jemand mal unter die Arme greifen und mir weiterhelfen...
alles was ich bis jetzt versucht habe, klappert nicht so richtig!!!
Thx...
Verfasst: 19.05.2008 11:23
von Rokur
Hier ein kleines Beispiel für Text. Kannst das ja umbauen auf deine Icons und noch entwas den Code aufräumen, das ist jetzt nur mal so hingeschmiert.
Prinzip:
Beim Drag&Drop-Start die Position des Eintrags merken und beim "Loslassen" an der aktuellen Position (Auswahl aktualisiert sich ja beim Ziehen) einfügen, den alten Eintrag dann aber löschen, sonst wirds ja kopiert und nicht verschoben.
Code: Alles auswählen
EnableExplicit
#app = "Test"
#width = 200
#height = 300
Define event.l
Define i.l
Define pos.l
Enumeration
#list
EndEnumeration
OpenWindow(0,0,0,#width,#height,#app,#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
CreateGadgetList(WindowID(0))
ListIconGadget(#list,0,0,200,300,"",#PB_Ignore)
ChangeListIconGadgetDisplay(#list,#PB_ListIcon_List)
EnableGadgetDrop(#list,#PB_Drop_Text,#PB_Drag_Copy)
For i = 1 To 30
AddGadgetItem(#list, -1, "Eintrag "+Str(i))
Next
Repeat
event = WaitWindowEvent()
Select event
Case 0
Delay(1)
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
If EventType() = #PB_EventType_DragStart
Select EventGadget()
Case #list
pos = GetGadgetState(#list)
DragText(GetGadgetItemText(#list,GetGadgetState(#list)))
EndSelect
EndIf
Case #PB_Event_GadgetDrop
Select EventGadget()
Case #list
AddGadgetItem(#list,GetGadgetState(#list),EventDropText())
If GetGadgetState(#list) <= pos
RemoveGadgetItem(#list,pos+1)
Else
RemoveGadgetItem(#list,pos)
EndIf
EndSelect
EndSelect
ForEver
End
Verfasst: 19.05.2008 11:27
von Rokur
Noch ne kleine Anmerkung:
Du solltest evtl. als D&D-Type nicht Text sondern Private nehmen, damit nichts durcheinander kommt wenn der Anwender Drag&Drop von oder nach einem externen Programm versucht.
Verfasst: 19.05.2008 12:15
von Ghosty1967
vorerst mal danke, werde ich jetzt erst einmal ausprobieren...

Verfasst: 19.05.2008 12:32
von Ghosty1967
Das Beispiel funktioniert zwar, wenn die Gadget-Eigenschaft
ChangeListIconGadgetDisplay auf
#PB_ListIcon_List steht,
nicht jedoch, wenn ich diese auf
#PB_ListIcon_SmallIcon setze.
Das muß doch irgendwie gehen, in div. Anwendungen sieht man doch sowas andauernd

Verfasst: 20.05.2008 08:01
von Rokur
Hab mir mal paar Werte mit dem Debugger ausgeben lassen und rausgefunden das es scheinbar an der Sortierung der Icons liegt, also Drag-n-Drop scheint zu gehen, aber die Anzeige bleibt gleich.
Hab aber noch keine Lösung gefunden.
Vielleicht wäre folgendes möglich:
Speichere beim Drag-Event die Startposition des gezogenen Eintrags. Speichere beim Drop-Event dann ebenfalls die Zielposition. Jetzt kannst du alle deine Icons in ein Array, LinkedList, etc. rausschreiben, dort manuell umsortieren (Quell- und Zielposition kennst du ja jetzt) und danach die Icon-Liste leeren und aus dem Array/LinkedList/Etc. zurückschreiben, in der von dir festgelegten Reihenfolge.
Was anderes fällt mir grad nicht ein.
Verfasst: 20.05.2008 15:23
von Ghosty1967
Netter Tipp, hab iich schon gemacht...
...allerdings möchte ich ja am liebsten auch noch nen dragbaren "Ghost" der Datei haben

.