Add droppable merge empty state

This commit is contained in:
Stu Leak 2025-12-10 16:43:20 -05:00
parent 8e5cac5653
commit 0221c04a4f
2 changed files with 85 additions and 9 deletions

View File

@ -50,12 +50,12 @@ func (m *MonoTheme) Size(name fyne.ThemeSizeName) float32 {
// ModuleTile is a clickable tile widget for module selection
type ModuleTile struct {
widget.BaseWidget
label string
color color.Color
enabled bool
onTapped func()
onDropped func([]fyne.URI)
flashing bool
label string
color color.Color
enabled bool
onTapped func()
onDropped func([]fyne.URI)
flashing bool
draggedOver bool
}
@ -263,6 +263,70 @@ func (r *tappableRenderer) Objects() []fyne.CanvasObject {
return []fyne.CanvasObject{r.content}
}
// Droppable wraps any canvas object and makes it a drop target (files/URIs)
type Droppable struct {
widget.BaseWidget
content fyne.CanvasObject
onDropped func([]fyne.URI)
}
// NewDroppable creates a new droppable wrapper
func NewDroppable(content fyne.CanvasObject, onDropped func([]fyne.URI)) *Droppable {
d := &Droppable{
content: content,
onDropped: onDropped,
}
d.ExtendBaseWidget(d)
return d
}
// CreateRenderer creates the renderer for the droppable
func (d *Droppable) CreateRenderer() fyne.WidgetRenderer {
return &droppableRenderer{
droppable: d,
content: d.content,
}
}
// DraggedOver highlights when drag is over (optional)
func (d *Droppable) DraggedOver(pos fyne.Position) {
_ = pos
}
// DraggedOut clears highlight (optional)
func (d *Droppable) DraggedOut() {}
// Dropped handles drop events
func (d *Droppable) Dropped(pos fyne.Position, items []fyne.URI) {
_ = pos
if d.onDropped != nil {
d.onDropped(items)
}
}
type droppableRenderer struct {
droppable *Droppable
content fyne.CanvasObject
}
func (r *droppableRenderer) Layout(size fyne.Size) {
r.content.Resize(size)
}
func (r *droppableRenderer) MinSize() fyne.Size {
return r.content.MinSize()
}
func (r *droppableRenderer) Refresh() {
r.content.Refresh()
}
func (r *droppableRenderer) Destroy() {}
func (r *droppableRenderer) Objects() []fyne.CanvasObject {
return []fyne.CanvasObject{r.content}
}
// DraggableVScroll creates a vertical scroll container with draggable track
type DraggableVScroll struct {
widget.BaseWidget

18
main.go
View File

@ -1574,9 +1574,21 @@ func (s *appState) showMergeView() {
buildList = func() {
listBox.Objects = nil
if len(s.mergeClips) == 0 {
empty := widget.NewLabel("Add at least two clips to merge.")
empty.Alignment = fyne.TextAlignCenter
listBox.Add(container.NewCenter(empty))
emptyLabel := widget.NewLabel("Add at least two clips to merge.")
emptyLabel.Alignment = fyne.TextAlignCenter
// Make empty state a drop target
emptyDrop := ui.NewDroppable(container.NewCenter(emptyLabel), func(items []fyne.URI) {
var paths []string
for _, uri := range items {
if uri.Scheme() == "file" {
paths = append(paths, uri.Path())
}
}
if len(paths) > 0 {
addFiles(paths)
}
})
listBox.Add(container.NewMax(emptyDrop))
} else {
for i, c := range s.mergeClips {
idx := i