Erfahrungen mit Drag & Drop in Fyne Golang

TimmyDuese

Ensign
Registriert
Apr. 2022
Beiträge
155
Hallo zusammen,

ich möchte eine kleine Desktop-Anwendung mit Go entwickeln, in der Benutzer Aufgaben per Drag & Drop umsortieren können – ähnlich wie in Trello oder ClickUp. Ziel ist es, eine Art Kanban-Board mit Karten zu bauen, die zwischen Spalten verschoben werden können.

Ich habe mir Fyne angesehen und gesehen, dass es das Draggable-Interface gibt. Allerdings scheint das nur für einfache Drag-Vorgänge innerhalb eines Widgets zu funktionieren – kein echtes Drag & Drop zwischen Layout-Containern oder gar zwischen Fenstern.

Meine Anforderungen:
  • Drag & Drop von Elementen (z. B. „Karten“) zwischen Bereichen (z. B. Spalten)
  • Möglichkeit, Drop-Ziele zu erkennen und zu verarbeiten
  • Idealerweise plattformübergreifend (Windows/macOS)
  • Kein Webbrowser oder Electron – ich suche native oder native-ähnliche Performance und Look

Hat jemand bereits mit Fyne komplexere Drag & Drop-Logik umgesetzt oder kennt ein anderes Go-Framework, das dafür besser geeignet ist?

Danke im Voraus für eure Einschätzungen!
 
Schau mal hier, das laeuft bei mir in ArchLinux im Terminal und laesst sich per Mouse draggen und droppen:

package main

import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
"image/color"
)

type DraggableButton struct {
widget.Button
parent *fyne.Container
rect *canvas.Rectangle
isDragging bool
lastPos fyne.Position
}

func NewDraggableButton(text string, parent *fyne.Container, rect *canvas.Rectangle) *DraggableButton {
btn := &DraggableButton{
parent: parent,
rect: rect,
}
btn.ExtendBaseWidget(btn)
btn.SetText(text)
btn.OnTapped = func() {
btn.SetText(text + " - Clicked!")
}
return btn
}

func (d *DraggableButton) Dragged(e *fyne.DragEvent) {
if !d.isDragging {
d.isDragging = true
d.SetText("Dragging...")
}

// Move both button and rectangle
newPos := fyne.NewPos(d.Position().X+e.Dragged.DX, d.Position().Y+e.Dragged.DY)
d.Move(newPos)
d.rect.Move(newPos)
d.parent.Refresh()
}

func (d *DraggableButton) DragEnd() {
d.isDragging = false
d.SetText("Drag ended!")
}

func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Draggable Widgets Demo")
myWindow.Resize(fyne.NewSize(600, 400))

// Create colored rectangles as backgrounds
rect1 := canvas.NewRectangle(color.RGBA{200, 200, 255, 255})
rect1.Resize(fyne.NewSize(200, 100))
rect1.Move(fyne.NewPos(50, 50))

rect2 := canvas.NewRectangle(color.RGBA{255, 200, 200, 255})
rect2.Resize(fyne.NewSize(200, 100))
rect2.Move(fyne.NewPos(300, 200))

content := container.NewWithoutLayout(rect1, rect2)

// Create draggable buttons
button1 := NewDraggableButton("Widget 1 - Ready", content, rect1)
button1.Resize(fyne.NewSize(200, 100))
button1.Move(fyne.NewPos(50, 50))

button2 := NewDraggableButton("Widget 2 - Ready", content, rect2)
button2.Resize(fyne.NewSize(200, 100))
button2.Move(fyne.NewPos(300, 200))

content.Add(button1)
content.Add(button2)

myWindow.SetContent(content)
myWindow.ShowAndRun()
}

 
Zurück
Oben