summaryrefslogtreecommitdiff
path: root/internal/app/model_sort.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-10-02 08:38:03 +0300
committerPaul Buetow <paul@buetow.org>2025-10-02 08:38:03 +0300
commit0c1b108ff5fccf39ae5bc6dc06802ce565bda633 (patch)
tree914e65e04bae26d3eae565f9d6a64d08ade361d0 /internal/app/model_sort.go
parent36be499ed342d92969ccaaff083c557a0951def9 (diff)
new version major refactorv0.2.0
Diffstat (limited to 'internal/app/model_sort.go')
-rw-r--r--internal/app/model_sort.go58
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)
+ }
+}