Add droppable merge empty state
This commit is contained in:
parent
8e5cac5653
commit
0221c04a4f
|
|
@ -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
18
main.go
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user