From ef8bf980ce48b777eaab2fde8f1a4a5ba42727a2 Mon Sep 17 00:00:00 2001 From: David Ashby Date: Sat, 10 May 2025 23:01:08 -0400 Subject: [PATCH] more refactoring --- filetypes/filetypes.go | 20 ++++++++++ main.go | 87 ++++++++++++++++++------------------------ 2 files changed, 58 insertions(+), 49 deletions(-) diff --git a/filetypes/filetypes.go b/filetypes/filetypes.go index 58cd5eb..96eb4dd 100644 --- a/filetypes/filetypes.go +++ b/filetypes/filetypes.go @@ -2,6 +2,10 @@ package filetypes import ( "fmt" + "os" + "path/filepath" + "slices" + "strings" tk "modernc.org/tk9.0" ) @@ -95,3 +99,19 @@ func GetTkTypes(fds []FileDescription) []tk.FileType { } return fts } + +func IsImage(entry os.DirEntry) bool { + if entry.IsDir() { + return false + } + ext := filepath.Ext(entry.Name()) + if ext == "" { + return false + } + for _, ft := range Valid { + if slices.Contains(ft.MacExtensions, strings.ToLower(ext[1:])) { + return true + } + } + return false +} diff --git a/main.go b/main.go index a0ec1bd..5c1937e 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,12 @@ import ( tk "modernc.org/tk9.0" ) +type state struct { + currentDirectory string + currentFile string + images []string +} + //go:embed noise.png var noise []byte // this is a default image @@ -31,11 +37,10 @@ var fileList *tk.ToplevelWidget var lb *tk.ListboxWidget var img = tk.Label() var fileListBindVar = tk.Variable("FileList") +var directoryState state -var directoryState struct { - currentDirectory string - currentFile string - images []string +func (d state) pathToImageAtIndex(i int) string { + return filepath.Join(directoryState.currentDirectory, directoryState.images[i]) } func must[T any](t T, err error) T { @@ -49,33 +54,38 @@ func checkErr[T any](_ T, err error) bool { return err == nil } -func isImage(entry os.DirEntry) bool { - if entry.IsDir() { - return false - } - ext := filepath.Ext(entry.Name()) - if ext == "" { - return false - } - for _, ft := range validFileTypes { - if slices.Contains(ft.MacExtensions, ext[1:]) { - return true - } - } - return false -} - func newFileInDirectory() { files := tk.GetOpenFile(tk.Filetypes(filetypes.GetTkTypes(validFileTypes)), tk.Multiple(false)) if len(files) < 1 || files[0] == "" { log.Println("no file chosen") return } - file := strings.Join(files, " ") // GetOpenFile returns an array split on spaces! - openFileAndDirectory(file) + // GetOpenFile returns an array split on spaces! + newBrowse(strings.Join(files, " ")) } -func openFileAndDirectory(file string) { +func newDirectory() { + dir := tk.ChooseDirectory() + if dir == "" { + log.Println("no directory chosen") + return + } + dirfiles, err := os.ReadDir(dir) + if err != nil { + log.Println("could not read chosen directory") + return + } + for _, v := range dirfiles { + // loop until we find an image to start the browser with + if filetypes.IsImage(v) { + newBrowse(filepath.Join(dir, v.Name())) + return + } + } + log.Printf("no images found in dir: %s", dir) +} + +func newBrowse(file string) { directoryState.currentFile = filepath.Base(file) directoryState.currentDirectory = filepath.Dir(file) dirfiles, err := os.ReadDir(directoryState.currentDirectory) @@ -85,34 +95,13 @@ func openFileAndDirectory(file string) { } directoryState.images = []string{} for _, v := range dirfiles { - if isImage(v) { + if filetypes.IsImage(v) { directoryState.images = append(directoryState.images, v.Name()) } } updateImage(file) } -func newDirectory() { - dir := tk.ChooseDirectory() - if dir == "" { - log.Println("no directory chosen") - return - } - directoryState.currentDirectory = dir - dirfiles, err := os.ReadDir(directoryState.currentDirectory) - if err != nil { - log.Println(err) - return - } - directoryState.images = []string{} - for _, v := range dirfiles { - if isImage(v) { - directoryState.images = append(directoryState.images, v.Name()) - } - } - updateImage(filepath.Join(directoryState.currentDirectory, directoryState.images[0])) -} - func updateImage(file string) { var i image.Image @@ -181,7 +170,7 @@ func constructFileList() { tk.Pack(lb) tk.Bind(lb, "<>", tk.Command(func() { selection := lb.Curselection() - updateImage(filepath.Join(directoryState.currentDirectory, directoryState.images[selection[0]])) + updateImage(directoryState.pathToImageAtIndex(selection[0])) })) tk.Bind(fileList, "", tk.Command(func(e *tk.Event) { // list closed by user click on @@ -221,12 +210,12 @@ func keyPress(e *tk.Event) { } case "Up", "Left": if curr > 0 { - updateImage(filepath.Join(directoryState.currentDirectory, directoryState.images[curr-1])) + updateImage(directoryState.pathToImageAtIndex(curr - 1)) moveSelectInFileList(curr - 1) } case "Down", "Right": if curr < len(directoryState.images)-1 && curr != -1 { - updateImage(filepath.Join(directoryState.currentDirectory, directoryState.images[curr+1])) + updateImage(directoryState.pathToImageAtIndex(curr + 1)) moveSelectInFileList(curr + 1) } } @@ -234,7 +223,7 @@ func keyPress(e *tk.Event) { func main() { tk.App.IconPhoto(tk.NewPhoto(tk.Data(icon))) - tk.MacOpenDocument(openFileAndDirectory) + tk.MacOpenDocument(newBrowse) menubar := tk.Menu() fileMenu := menubar.Menu()