treeviews.go 3.1 KB

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