From 11ff1d56915cd44e1c26c82f0a7a8bfbb0180962 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 20 Jan 2025 16:39:29 +0000 Subject: [PATCH 1/3] Sort filenames case insensitive --- dialog/file.go | 13 +++++++++++++ dialog/file_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/dialog/file.go b/dialog/file.go index 3610341026..db99b93060 100644 --- a/dialog/file.go +++ b/dialog/file.go @@ -6,6 +6,7 @@ import ( "os" "path/filepath" "runtime" + "sort" "strings" "fyne.io/fyne/v2" @@ -422,6 +423,18 @@ func (f *fileDialog) refreshDir(dir fyne.ListableURI) { } } + toSort := icons + if parent != nil { + toSort = icons[1:] + } + sort.Slice(toSort, func(i, j int) bool { + if parent != nil { // avoiding the parent in [0] + i++ + j++ + } + + return strings.ToLower(icons[i].Name()) < strings.ToLower(icons[j].Name()) + }) f.data = icons f.files.Refresh() diff --git a/dialog/file_test.go b/dialog/file_test.go index 39583f0ee6..a82ffb1006 100644 --- a/dialog/file_test.go +++ b/dialog/file_test.go @@ -471,6 +471,47 @@ func TestFileFilters(t *testing.T) { assert.Equal(t, 11, count) } +func TestFileSort(t *testing.T) { + testDataPath, _ := filepath.Abs("testdata") + testData := storage.NewFileURI(testDataPath) + dir, err := storage.ListerForURI(testData) + if err != nil { + t.Error("Failed to open testdata dir", err) + } + + win := test.NewTempWindow(t, widget.NewLabel("Content")) + d := NewFileOpen(func(file fyne.URIReadCloser, err error) { + }, win) + d.SetLocation(dir) + d.Show() + + popup := win.Canvas().Overlays().Top().(*widget.PopUp) + defer win.Canvas().Overlays().Remove(popup) + assert.NotNil(t, popup) + + ui := popup.Content.(*fyne.Container) + + files := ui.Objects[0].(*container.Split).Trailing.(*fyne.Container).Objects[1].(*container.Scroll).Content.(*fyne.Container).Objects[0].(*widget.GridWrap) + objects := test.TempWidgetRenderer(t, files).Objects()[0].(*container.Scroll).Content.(*fyne.Container).Objects + assert.NotEmpty(t, objects) + + binPos := -1 + capitalPos := -1 + for i, icon := range objects { + item := test.TempWidgetRenderer(t, icon.(fyne.Widget)).Objects()[1].(*fileDialogItem) + switch item.name { + case "bin": + binPos = i + case "Capitalised": + capitalPos = i + } + } + + assert.NotEqual(t, -1, binPos, "bin file not found") + assert.NotEqual(t, -1, capitalPos, "Capitalised.txt file not found") + assert.Less(t, binPos, capitalPos) +} + func TestView(t *testing.T) { win := test.NewTempWindow(t, widget.NewLabel("Content")) From 0ef3edd96fd905bc2bb6b85b5e441d43d919847c Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 20 Jan 2025 16:39:49 +0000 Subject: [PATCH 2/3] Fix grammatical errors warned in linter too --- dialog/file_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dialog/file_test.go b/dialog/file_test.go index a82ffb1006..7a8cf88f09 100644 --- a/dialog/file_test.go +++ b/dialog/file_test.go @@ -276,7 +276,7 @@ func TestHiddenFiles(t *testing.T) { t.Error("Failed to open testdata dir", err) } - // git does not preserve windows hidden flag so we have to set it. + // git does not preserve windows hidden flag, so we have to set it. // just an empty function for non windows builds if err := hideFile(filepath.Join(testDataPath, ".hidden")); err != nil { t.Error("Failed to hide .hidden", err) @@ -326,7 +326,7 @@ func TestHiddenFiles(t *testing.T) { target = item } } - assert.NotNil(t, target, "Failed,.hidden not found in testdata") + assert.NotNil(t, target, "Failed, .hidden not found in testdata") } func TestShowFileSave(t *testing.T) { From 532bcab4830d04b21fec9b5fce4ab135a785c19c Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 20 Jan 2025 16:47:16 +0000 Subject: [PATCH 3/3] Adding missed file --- dialog/testdata/Capitalised.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 dialog/testdata/Capitalised.txt diff --git a/dialog/testdata/Capitalised.txt b/dialog/testdata/Capitalised.txt new file mode 100644 index 0000000000..ca8315b74d --- /dev/null +++ b/dialog/testdata/Capitalised.txt @@ -0,0 +1 @@ +adsfasdfasdfasdfdsfasdfasdfafdafdasf \ No newline at end of file