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".
:oops: 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... :allright:

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 /:-> .