diff options
Diffstat (limited to 'src/page_artists.go')
-rw-r--r-- | src/page_artists.go | 97 |
1 files changed, 92 insertions, 5 deletions
diff --git a/src/page_artists.go b/src/page_artists.go index 6b6def6..c064785 100644 --- a/src/page_artists.go +++ b/src/page_artists.go | |||
@@ -1,15 +1,102 @@ | |||
1 | package src | 1 | package src |
2 | 2 | ||
3 | import "github.com/rivo/tview" | 3 | import ( |
4 | "fmt" | ||
5 | "time" | ||
6 | |||
7 | "github.com/gdamore/tcell/v2" | ||
8 | "github.com/rivo/tview" | ||
9 | ) | ||
10 | |||
11 | type selection struct { | ||
12 | entryType string | ||
13 | id string | ||
14 | } | ||
4 | 15 | ||
5 | func artistsPage(a *app) tview.Primitive { | 16 | func artistsPage(a *app) tview.Primitive { |
6 | grid := tview.NewGrid(). | 17 | grid := tview.NewGrid(). |
7 | SetRows(1). | 18 | SetColumns(40, 0). |
8 | SetColumns(30, 0). | ||
9 | SetBorders(true) | 19 | SetBorders(true) |
10 | 20 | ||
11 | grid.AddItem(tview.NewTextView().SetText("Artist & Album list"), 0, 0, 1, 1, 0, 0, true) | 21 | root := tview.NewTreeNode("Subsonic server").SetColor(tcell.ColorYellow) |
12 | grid.AddItem(tview.NewTextView().SetText("Song list!"), 0, 1, 1, 2, 0, 0, false) | 22 | a.artistsTree = tview.NewTreeView(). |
23 | SetRoot(root). | ||
24 | SetCurrentNode(root). | ||
25 | SetPrefixes([]string{"", " ", " "}). | ||
26 | SetSelectedFunc(func(node *tview.TreeNode) { | ||
27 | if node.GetReference() == nil { | ||
28 | return | ||
29 | } | ||
30 | |||
31 | sel := node.GetReference().(selection) | ||
32 | if sel.entryType == "artist" { | ||
33 | node.SetExpanded(!node.IsExpanded()) | ||
34 | return | ||
35 | } | ||
36 | |||
37 | loadAlbumInPanel(a, sel.id) | ||
38 | a.tv.SetFocus(a.songsList) | ||
39 | }) | ||
40 | |||
41 | a.songsList = tview.NewList() | ||
42 | a.songsList.ShowSecondaryText(false) | ||
43 | |||
44 | grid.AddItem(a.artistsTree, 0, 0, 1, 1, 0, 0, true) | ||
45 | grid.AddItem(a.songsList, 0, 1, 1, 2, 0, 0, false) | ||
13 | 46 | ||
14 | return grid | 47 | return grid |
15 | } | 48 | } |
49 | |||
50 | func refreshArtists(a *app) error { | ||
51 | artistsID3, err := a.sub.GetArtists(nil) | ||
52 | if err != nil { | ||
53 | return err | ||
54 | } | ||
55 | |||
56 | a.artistsTree.GetRoot().ClearChildren() | ||
57 | for _, index := range artistsID3.Index { | ||
58 | for _, artist := range index.Artist { | ||
59 | node := tview.NewTreeNode(artist.Name) | ||
60 | node.SetReference(selection{"artist", artist.ID}) | ||
61 | node.SetColor(tcell.ColorRed) | ||
62 | node.SetSelectable(true) | ||
63 | node.SetExpanded(false) | ||
64 | |||
65 | albums, err := a.sub.GetMusicDirectory(artist.ID) | ||
66 | if err != nil { | ||
67 | return err | ||
68 | } | ||
69 | |||
70 | for _, album := range albums.Child { | ||
71 | subnode := tview.NewTreeNode(album.Title) | ||
72 | subnode.SetReference(selection{"album", album.ID}) | ||
73 | subnode.SetColor(tcell.ColorBlue) | ||
74 | subnode.SetSelectable(true) | ||
75 | |||
76 | node.AddChild(subnode) | ||
77 | } | ||
78 | |||
79 | a.artistsTree.GetRoot().AddChild(node) | ||
80 | } | ||
81 | } | ||
82 | |||
83 | a.artistsTree.GetRoot().SetExpanded(true) | ||
84 | |||
85 | return nil | ||
86 | } | ||
87 | |||
88 | func loadAlbumInPanel(a *app, id string) error { | ||
89 | album, err := a.sub.GetMusicDirectory(id) | ||
90 | if err != nil { | ||
91 | return err | ||
92 | } | ||
93 | |||
94 | a.songsList.SetTitle(album.Name) | ||
95 | a.songsList.Clear() | ||
96 | for _, song := range album.Child { | ||
97 | dur := time.Duration(song.Duration) * time.Second | ||
98 | a.songsList.AddItem(fmt.Sprintf("%-10s %d - %s", fmt.Sprintf("[%s]", dur.String()), song.Track, song.Title), "", 0, nil) | ||
99 | } | ||
100 | |||
101 | return nil | ||
102 | } | ||