treeviews.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package ui
  2. import (
  3. "github.com/diamondburned/arikawa/v3/discord"
  4. "github.com/rivo/tview"
  5. )
  6. // NewGuildsTreeView creates and returns a new guilds treeview.
  7. func NewGuildsTreeView(onGuildsTreeViewSelected func(*tview.TreeNode)) (treeV *tview.TreeView) {
  8. treeN := tview.NewTreeNode("")
  9. treeV = tview.NewTreeView()
  10. treeV.
  11. SetTopLevel(1).
  12. SetRoot(treeN).
  13. SetSelectedFunc(onGuildsTreeViewSelected).
  14. SetBorder(true).
  15. SetBorderPadding(0, 0, 1, 0).
  16. SetTitle("Guilds").
  17. SetTitleAlign(tview.AlignLeft)
  18. return
  19. }
  20. // NewChannelsTreeView creates and returns a new channels treeview.
  21. func NewChannelsTreeView(onChannelsTreeViewSelected func(*tview.TreeNode)) (treeV *tview.TreeView) {
  22. treeN := tview.NewTreeNode("")
  23. treeV = tview.NewTreeView()
  24. treeV.
  25. SetTopLevel(1).
  26. SetRoot(treeN).
  27. SetSelectedFunc(onChannelsTreeViewSelected).
  28. SetBorder(true).
  29. SetBorderPadding(0, 0, 1, 0).
  30. SetTitle("Channels").
  31. SetTitleAlign(tview.AlignLeft)
  32. return
  33. }
  34. // NewTextChannelTreeNode creates and returns a new text channel treenode.
  35. func NewTextChannelTreeNode(c discord.Channel) (n *tview.TreeNode) {
  36. n = tview.NewTreeNode("[::d]#" + c.Name + "[::-]").
  37. SetReference(c.ID)
  38. return
  39. }
  40. // GetTreeNodeByReference gets the TreeNode that has reference r from the given treeview.
  41. func GetTreeNodeByReference(r interface{}, treeV *tview.TreeView) (mn *tview.TreeNode) {
  42. treeV.GetRoot().Walk(func(n, _ *tview.TreeNode) bool {
  43. if n.GetReference() == r {
  44. mn = n
  45. return false
  46. }
  47. return true
  48. })
  49. return
  50. }
  51. // CreateTopLevelTreeNodes creates treenodes for the top-level (orphan) channels.
  52. func CreateTopLevelTreeNodes(rootN *tview.TreeNode, cs []discord.Channel) {
  53. for _, c := range cs {
  54. if (c.Type == discord.GuildText || c.Type == discord.GuildNews) && (c.ParentID == 0 || c.ParentID == discord.NullChannelID) {
  55. cn := NewTextChannelTreeNode(c)
  56. rootN.AddChild(cn)
  57. continue
  58. }
  59. }
  60. }
  61. // CreateSecondLevelTreeNodes creates treenodes for the second-level (category children) channels.
  62. func CreateSecondLevelTreeNodes(channelsTreeView *tview.TreeView, rootN *tview.TreeNode, cs []discord.Channel) {
  63. for _, c := range cs {
  64. if (c.Type == discord.GuildText || c.Type == discord.GuildNews) && (c.ParentID != 0 && c.ParentID != discord.NullChannelID) {
  65. if pn := GetTreeNodeByReference(c.ParentID, channelsTreeView); pn != nil {
  66. cn := NewTextChannelTreeNode(c)
  67. pn.AddChild(cn)
  68. }
  69. }
  70. }
  71. }