Show multi-file list in thumbnails

This commit is contained in:
Stu Leak 2026-01-03 23:51:37 -05:00
parent f9479c6aaf
commit 530baf8711
2 changed files with 69 additions and 11 deletions

25
main.go
View File

@ -899,6 +899,7 @@ type appState struct {
// Thumbnail module state
thumbFile *videoSource
thumbFiles []*videoSource
thumbCount int
thumbWidth int
thumbContactSheet bool
@ -11120,24 +11121,32 @@ func (s *appState) handleDrop(pos fyne.Position, items []fyne.URI) {
return
}
// Multi-drop: add jobs for each file and set first as current preview
// Multi-drop: load list and add jobs for each file
go func() {
src, err := probeVideo(videoPaths[0])
if err != nil {
logging.Debug(logging.CatModule, "failed to load video for thumb: %v", err)
var sources []*videoSource
for _, path := range videoPaths {
src, err := probeVideo(path)
if err != nil {
logging.Debug(logging.CatModule, "failed to load video for thumb: %v", err)
continue
}
sources = append(sources, src)
}
if len(sources) == 0 {
fyne.CurrentApp().Driver().DoFromGoroutine(func() {
dialog.ShowError(fmt.Errorf("failed to load video: %w", err), s.window)
dialog.ShowError(fmt.Errorf("failed to load video files for thumbnails"), s.window)
}, false)
return
}
fyne.CurrentApp().Driver().DoFromGoroutine(func() {
s.thumbFile = src
s.thumbFiles = sources
s.thumbFile = sources[0]
s.showThumbView()
logging.Debug(logging.CatModule, "loaded video into thumb module")
logging.Debug(logging.CatModule, "loaded %d videos into thumb module", len(sources))
}, false)
if len(videoPaths) > 1 && s.jobQueue != nil {
if s.jobQueue != nil {
for _, path := range videoPaths {
s.jobQueue.Add(s.createThumbJobForPath(path))
}

View File

@ -27,6 +27,18 @@ func (s *appState) showThumbView() {
s.setContent(buildThumbView(s))
}
func (s *appState) addThumbSource(src *videoSource) {
if src == nil {
return
}
for _, existing := range s.thumbFiles {
if existing != nil && existing.Path == src.Path {
return
}
}
s.thumbFiles = append(s.thumbFiles, src)
}
func buildThumbView(state *appState) fyne.CanvasObject {
thumbColor := moduleColor("thumb")
@ -100,6 +112,7 @@ func buildThumbView(state *appState) fyne.CanvasObject {
}
state.thumbFile = src
state.addThumbSource(src)
state.showThumbView()
logging.Debug(logging.CatModule, "loaded thumbnail file: %s", path)
}, state.window)
@ -108,6 +121,7 @@ func buildThumbView(state *appState) fyne.CanvasObject {
// Clear button
clearBtn := widget.NewButton("Clear", func() {
state.thumbFile = nil
state.thumbFiles = nil
state.showThumbView()
})
clearBtn.Importance = widget.LowImportance
@ -360,9 +374,44 @@ func buildThumbView(state *appState) fyne.CanvasObject {
)
// Main content - split layout with preview on left, settings on right
leftColumn := container.NewVBox(
videoContainer,
)
leftColumn := container.NewVBox(videoContainer)
if len(state.thumbFiles) > 1 {
list := widget.NewList(
func() int { return len(state.thumbFiles) },
func() fyne.CanvasObject { return widget.NewLabel("") },
func(i widget.ListItemID, o fyne.CanvasObject) {
if i < 0 || i >= len(state.thumbFiles) {
return
}
label := o.(*widget.Label)
src := state.thumbFiles[i]
if src == nil {
label.SetText("")
return
}
label.SetText(utils.ShortenMiddle(filepath.Base(src.Path), 60))
},
)
list.OnSelected = func(id widget.ListItemID) {
if id < 0 || id >= len(state.thumbFiles) {
return
}
state.thumbFile = state.thumbFiles[id]
state.showThumbView()
}
if state.thumbFile != nil {
for i, src := range state.thumbFiles {
if src != nil && src.Path == state.thumbFile.Path {
list.Select(i)
break
}
}
}
listScroll := container.NewVScroll(list)
listScroll.SetMinSize(fyne.NewSize(0, 140))
leftColumn.Add(widget.NewLabel("Loaded Videos:"))
leftColumn.Add(listScroll)
}
rightColumn := container.NewVBox(
settingsPanel,