guilds_tree.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package ui
  2. import (
  3. "sort"
  4. "github.com/diamondburned/arikawa/v3/discord"
  5. "github.com/rivo/tview"
  6. )
  7. type GuildsTree struct {
  8. *tview.TreeView
  9. app *App
  10. }
  11. func NewGuildsTree(app *App) *GuildsTree {
  12. gt := &GuildsTree{
  13. TreeView: tview.NewTreeView(),
  14. app: app,
  15. }
  16. rootNode := tview.NewTreeNode("")
  17. rootNode.AddChild(tview.NewTreeNode("Direct Messages"))
  18. gt.SetRoot(rootNode)
  19. gt.SetTopLevel(1)
  20. gt.SetSelectedFunc(gt.onSelected)
  21. gt.SetTitle("Guilds")
  22. gt.SetTitleAlign(tview.AlignLeft)
  23. gt.SetBorder(true)
  24. gt.SetBorderPadding(0, 0, 1, 1)
  25. return gt
  26. }
  27. func (gt *GuildsTree) onSelected(node *tview.TreeNode) {
  28. gt.app.ChannelsTree.SelectedChannel = nil
  29. gt.app.MessagesPanel.SelectedMessage = -1
  30. rootNode := gt.app.ChannelsTree.GetRoot()
  31. rootNode.ClearChildren()
  32. gt.app.MessagesPanel.
  33. Highlight().
  34. Clear().
  35. SetTitle("")
  36. gt.app.MessageInputField.SetText("")
  37. // If the selected node has children (guild folder), expand the selected node if it is collapsed, otherwise collapse.
  38. if len(node.GetChildren()) != 0 {
  39. node.SetExpanded(!node.IsExpanded())
  40. return
  41. }
  42. ref := node.GetReference()
  43. // If the reference of the selected node is nil, it must be the direct messages node.
  44. if ref == nil {
  45. cs, err := gt.app.State.Cabinet.PrivateChannels()
  46. if err != nil {
  47. return
  48. }
  49. sort.Slice(cs, func(i, j int) bool {
  50. return cs[i].LastMessageID > cs[j].LastMessageID
  51. })
  52. for _, c := range cs {
  53. rootNode.AddChild(gt.app.ChannelsTree.createChannelNode(c))
  54. }
  55. } else { // Guild
  56. cs, err := gt.app.State.Cabinet.Channels(ref.(discord.GuildID))
  57. if err != nil {
  58. return
  59. }
  60. sort.Slice(cs, func(i, j int) bool {
  61. return cs[i].Position < cs[j].Position
  62. })
  63. gt.app.ChannelsTree.createOrphanChannelNodes(rootNode, cs)
  64. gt.app.ChannelsTree.createCategoryChannelNodes(rootNode, cs)
  65. gt.app.ChannelsTree.createChildrenChannelNodes(rootNode, cs)
  66. }
  67. gt.app.ChannelsTree.SetCurrentNode(rootNode)
  68. gt.app.SetFocus(gt.app.ChannelsTree)
  69. }