Drag and Drop Fragen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Drag and Drop Fragen

Beitrag von TheCube »

Hallo,
ich möchte ein kleines Tool erstellen, das im Grunde Bild-Dateien entsprechend ihrer Position in einer Matrix (z.B. 8x5) benennt ...
und nebenbei natürlich als übersichtlicher Viewer dient.
Ein reinen Viewer der Files wie P_11.jpg, P_12.jpg, P_21 usw. parst und in einer Matrix aus Imagegadgets darstellt habe ich schon.

Hier etwas Code meiner "Grundlagenforschung", die Basis stammt aus der Hilfe.

Code: Alles auswählen

; Ziehe eine Datei auf eines der oberen  2 Gadgets und es wird der Dateipfad ausgegeben
; Ziehe eine JPG-Datei auf eines der 3 Imagegadgets und es wird dargestellt

Global xs=80 : Global ys=xs           ; Grösse der Vorschaubilder

; ---------------------------------------  
  Procedure DragStartHandler()
    Debug "Drag ..."
    ExamineDraggedItems()
    While NextDraggedItem()       ; XXX Geht wohl nicht mit Imagegadgets !?
      Debug DraggedItemIndex()
    Wend
  EndProcedure  
; ---------------------------------------    
  Procedure DropToImGad(idnum)
    If Not FindString(EventDropFiles(), Chr(10)) 
      If LoadImage(0, EventDropFiles())
        CopyImage(0, idnum)
        ResizeImage(idnum, xs, ys)
        SetGadgetState(idnum, ImageID(idnum))
        Else: Debug "No JPG!" :EndIf
      Else: Debug "To many items!" : EndIf  
  EndProcedure  
; --------------------------------------------------------------------    
  
UseJPEGImageDecoder()
UseJPEGImageEncoder()   
EmptyImg = CreateImage(#PB_Any, xs, ys, 24, RGB(255, 255, 255)) 
StartDrawing(ImageOutput(EmptyImg)) 
LineXY(10, 10, xs-10, ys-10, RGB(0, 0, 200)) : LineXY(10, xs-10, ys-10, 10, RGB(0, 0, 200))
StopDrawing()           ; Platzhalterbild fertig
; --------------------------------------------------------------------

If OpenWindow(0, 0, 0, 500, 320, "Drop File(s) Here", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  StringGadget(0, 10, 10, 500 - 20, 30, "")
  EditorGadget(1, 10, 50, 500 - 20, 120)
  ImageGadget(2, 30,  200, xs, ys, ImageID(EmptyImg), #PB_Image_Border)
  ImageGadget(3, 210, 200, xs, ys, ImageID(EmptyImg), #PB_Image_Border)
  ImageGadget(4, 380, 200, xs, ys, ImageID(EmptyImg), #PB_Image_Border) 
  
  EnableGadgetDrop(0, #PB_Drop_Files, #PB_Drag_Copy)
  EnableGadgetDrop(1, #PB_Drop_Files, #PB_Drag_Copy)
  EnableGadgetDrop(2, #PB_Drop_Files, #PB_Drag_Copy)
  EnableGadgetDrop(3, #PB_Drop_Files, #PB_Drag_Copy)
  EnableGadgetDrop(4, #PB_Drop_Image, #PB_Drag_Copy)
  
  BindGadgetEvent(2, @DragStartHandler(), #PB_EventType_DragStart)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_GadgetDrop
        Select EventGadget()
          Case 0 ; Gadgets, die ein Datei/Ordner Drag&Drop Ereignis empfangen haben
            If Not FindString(EventDropFiles(), Chr(10)) : SetGadgetText(0, EventDropFiles()) : EndIf         ; Nur ein Dropfile/Ordner beachtet
          Case 1
            SetGadgetText(1, EventDropFiles())                                                                ; Alle Dropfiles/Ordner ausgeben
          Case 2
            DropToImGad(2); 
          Case 3
           DropToImGad(3);
          Case 4 
            DropToImGad(4); 
        EndSelect
      Case #PB_Event_CloseWindow
        CloseWindow(0)
        End
    EndSelect
  ForEver
EndIf
Aus z.B. dem Windowsexplorer ziehe ich gewünschte JPG-Bildchen auf betimmte Imagegadget-Positionen und bekomme darin eine kleine Vorschau angezeigt. *** Funktioniert bereits, aber fängt nicht alle Drop-Fehler ab. Aktuelles Drop-Ziel einfärben o.ä. muss auch noch.

Fragen:
- Wie nutze ich bei EnableGadgetDrop) #PB_Drop_Image richtig, damit nur gedroppte Bilder akzeptiert werden ? Bei meinem Imagegadget(4) geht nichts.
- Kann man auch zwischen Imagegadgets eine Art drag und drop machen, um z.B. Bildpositionen zu tauschen?

Freue mich über jeden Schubs in die richtige Richtung :D
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Drag and Drop Fragen

Beitrag von NicTheQuick »

Du kannst zunächst mal noch mittels `EventDropType()` herausfinden was genau gedropt wurde. Ich nehme an dich interessiert vor allem `#PB_Drop_Image` und `#PB_Drop_Files`. Je nachdem musst du etwas anders reagieren. Andererseits hast du ja nur `#PB_Drop_Files` erlaubt mittels `EnableGadgetDrop()`.

`#PB_Drop_Image` bezieht sich auf Bilder, die du als Bild auf dein Gadget droppst. Zum Beispiel wenn du hier im Forum dein Avatar-Bild anfasst und dann auf den Gadget ziehst. Wenn so ein Event kommt (siehe `EventDropType()`), dann musst du mit `EventDropImage()` arbeiten um es in ein Image-Objekt zu verwandeln, das du dann wiederum deinem `ImageGadget()` zuordnen kannst.

Ansonsten hätte ich noch eine Empfehlung zu deinem Programmierstil. Statt der Nummer 0 bis 4 für deine Gadgets könntest du auch sprechende Konstanten nehmen. Das würde es etwas leichter zu lesen machen für andere.
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Drag and Drop Fragen

Beitrag von TheCube »

Ah, danke, jetzt ist einiges klarer und ich komme weiter.
Diesen "Stil" mit Direkt-Gadgetnummern habe ich zum schnellen Testen aus der PB-Hilfe übernommen. :oops:

Muss ich nur noch rausfinden, ob ich das Bilderanordnen per Drag'ndrop-Ziehen lössen kann, oder doch klassisch (wie bei einem Schachprogramm) mit "klicke Feld1, Klicke Feld2" -> Image1 wandert nach Image2. (per Gadget und Mouse-Events)
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Drag and Drop Fragen

Beitrag von TheCube »

Und für die Leute, die es interessiert ... aber genauso blind sind wie ich : :freak:
In der PB-Hilfe gibt es das "DragDrop.pb"-Beispiel, einfach dort suchen. Klärt einiges und man kann sich ein paar Lösungs-Ideen holen.

-Edit-
Übrigens:
Man kann die EnableGadgetDrop()-Formate (z.B. #PB_Drop_Files und #PB_Drop_Image) NICHT kombinieren , so wie man es z.B. bei OpenWindow() kennt mit "#PB_Window_SystemMenu | #PB_Window_ScreenCentered". Bei 15|8 bleibt es halt bei 15 ... /:->
Nach einiger Zeit bin ich drauf gekommen .... wenn man beide Formate auf sein (Image-) Gadget droppen möchte dann funktioniert es z.B. so:

Code: Alles auswählen

    EnableGadgetDrop(#DropGadget, #PB_Drop_Files, #PB_Drag_Copy)
    EnableGadgetDrop(#DropGadget, #PB_Drop_Image, #PB_Drag_Copy)
Antworten