Add droppable merge empty state
This commit is contained in:
parent
eb9bedfcb1
commit
66f57da8ad
|
|
@ -50,12 +50,12 @@ func (m *MonoTheme) Size(name fyne.ThemeSizeName) float32 {
|
||||||
// ModuleTile is a clickable tile widget for module selection
|
// ModuleTile is a clickable tile widget for module selection
|
||||||
type ModuleTile struct {
|
type ModuleTile struct {
|
||||||
widget.BaseWidget
|
widget.BaseWidget
|
||||||
label string
|
label string
|
||||||
color color.Color
|
color color.Color
|
||||||
enabled bool
|
enabled bool
|
||||||
onTapped func()
|
onTapped func()
|
||||||
onDropped func([]fyne.URI)
|
onDropped func([]fyne.URI)
|
||||||
flashing bool
|
flashing bool
|
||||||
draggedOver bool
|
draggedOver bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -263,6 +263,70 @@ func (r *tappableRenderer) Objects() []fyne.CanvasObject {
|
||||||
return []fyne.CanvasObject{r.content}
|
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
|
// DraggableVScroll creates a vertical scroll container with draggable track
|
||||||
type DraggableVScroll struct {
|
type DraggableVScroll struct {
|
||||||
widget.BaseWidget
|
widget.BaseWidget
|
||||||
|
|
|
||||||
18
main.go
18
main.go
|
|
@ -1574,9 +1574,21 @@ func (s *appState) showMergeView() {
|
||||||
buildList = func() {
|
buildList = func() {
|
||||||
listBox.Objects = nil
|
listBox.Objects = nil
|
||||||
if len(s.mergeClips) == 0 {
|
if len(s.mergeClips) == 0 {
|
||||||
empty := widget.NewLabel("Add at least two clips to merge.")
|
emptyLabel := widget.NewLabel("Add at least two clips to merge.")
|
||||||
empty.Alignment = fyne.TextAlignCenter
|
emptyLabel.Alignment = fyne.TextAlignCenter
|
||||||
listBox.Add(container.NewCenter(empty))
|
// 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 {
|
} else {
|
||||||
for i, c := range s.mergeClips {
|
for i, c := range s.mergeClips {
|
||||||
idx := i
|
idx := i
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user