diff options
Diffstat (limited to 'internal/app/model_sort.go')
| -rw-r--r-- | internal/app/model_sort.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/internal/app/model_sort.go b/internal/app/model_sort.go new file mode 100644 index 0000000..e3120c4 --- /dev/null +++ b/internal/app/model_sort.go @@ -0,0 +1,58 @@ +package app + +import ( + "sort" + "strings" + + "github.com/charmbracelet/bubbles/table" +) + +func (m *model) toggleSort(target sortField) { + if m.sortField == target { + m.sortAscending = !m.sortAscending + return + } + m.sortField = target + m.sortAscending = true +} + +func (m *model) applyFiltersAndSort() { + filtered := make([]video, 0, len(m.videos)) + for _, v := range m.videos { + if m.passesFilters(v) { + filtered = append(filtered, v) + } + } + sort.Slice(filtered, func(i, j int) bool { + return m.less(filtered[i], filtered[j]) + }) + m.filtered = filtered + m.updateTableRows() +} + +func (m *model) less(a, b video) bool { + var less bool + switch m.sortField { + case sortByName: + less = strings.ToLower(a.Name) < strings.ToLower(b.Name) + case sortByDuration: + less = a.Duration < b.Duration + case sortByAge: + less = a.ModTime.Before(b.ModTime) + } + if m.sortAscending { + return less + } + return !less +} + +func (m *model) updateTableRows() { + rows := make([]table.Row, 0, len(m.filtered)) + for _, v := range m.filtered { + rows = append(rows, videoRow(v)) + } + m.table.SetRows(rows) + if len(rows) > 0 { + m.table.SetCursor(0) + } +} |
