Pārlūkot izejas kodu

feat(ui): implement guild folders (#182)

ayntgl 3 gadi atpakaļ
vecāks
revīzija
3f124bebec
3 mainītis faili ar 49 papildinājumiem un 17 dzēšanām
  1. 42 16
      ui/app.go
  2. 1 1
      ui/channels.go
  3. 6 0
      ui/guilds.go

+ 42 - 16
ui/app.go

@@ -2,7 +2,6 @@ package ui
 
 import (
 	"context"
-	"sort"
 	"strings"
 
 	"github.com/ayntgl/discordo/config"
@@ -111,26 +110,53 @@ func (app *App) DrawMainFlex() {
 }
 
 func (app *App) onStateReady(r *gateway.ReadyEvent) {
-	sort.Slice(r.Guilds, func(a, b int) bool {
-		found := false
-		for _, guildID := range r.UserSettings.GuildPositions {
-			if found && guildID == r.Guilds[b].ID {
-				return true
+	rootNode := app.GuildsTree.GetRoot()
+	for _, gf := range r.UserSettings.GuildFolders {
+		if gf.ID == 0 {
+			for _, gID := range gf.GuildIDs {
+				g, err := app.State.Cabinet.Guild(gID)
+				if err != nil {
+					return
+				}
+
+				guildNode := tview.NewTreeNode(g.Name)
+				guildNode.SetReference(g.ID)
+				rootNode.AddChild(guildNode)
 			}
-			if !found && guildID == r.Guilds[a].ID {
-				found = true
+		} else {
+			var b strings.Builder
+
+			if gf.Color != discord.NullColor {
+				b.WriteByte('[')
+				b.WriteString(gf.Color.String())
+				b.WriteByte(']')
+			} else {
+				b.WriteString("[#ED4245]")
 			}
-		}
 
-		return false
-	})
+			if gf.Name != "" {
+				b.WriteString(gf.Name)
+			} else {
+				b.WriteString("Folder")
+			}
 
-	rootNode := app.GuildsTree.GetRoot()
-	for _, g := range r.Guilds {
-		guildNode := tview.NewTreeNode(g.Name)
-		guildNode.SetReference(g.ID)
+			b.WriteString("[-]")
+
+			folderNode := tview.NewTreeNode(b.String())
+			rootNode.AddChild(folderNode)
+
+			for _, gID := range gf.GuildIDs {
+				g, err := app.State.Cabinet.Guild(gID)
+				if err != nil {
+					return
+				}
+
+				guildNode := tview.NewTreeNode(g.Name)
+				guildNode.SetReference(g.ID)
+				folderNode.AddChild(guildNode)
+			}
+		}
 
-		rootNode.AddChild(guildNode)
 	}
 
 	app.GuildsTree.SetCurrentNode(rootNode)

+ 1 - 1
ui/channels.go

@@ -43,7 +43,7 @@ func (ct *ChannelsTree) onSelected(node *tview.TreeNode) {
 		return
 	}
 
-	// If the channel is a category channel, expend the selected node if it is not expanded already.
+	// If the channel is a category channel, expand the selected node if it is collapsed, otherwise collapse.
 	if c.Type == discord.GuildCategory {
 		node.SetExpanded(!node.IsExpanded())
 		return

+ 6 - 0
ui/guilds.go

@@ -44,6 +44,12 @@ func (gt *GuildsTree) onSelected(node *tview.TreeNode) {
 		SetTitle("")
 	gt.app.MessageInputField.SetText("")
 
+	// If the selected node has children (guild folder), expand the selected node if it is collapsed, otherwise collapse.
+	if len(node.GetChildren()) != 0 {
+		node.SetExpanded(!node.IsExpanded())
+		return
+	}
+
 	ref := node.GetReference()
 	// If the reference of the selected node is nil, it must be the direct messages node.
 	if ref == nil {