treeviews.go 2.3 KB

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