summaryrefslogtreecommitdiff
path: root/internal/app/model_sort.go
blob: e3120c402ac256d57f5ba8a9a8f579e21507f17c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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)
	}
}