Create MainFlex struct

This commit is contained in:
ayn2op 2023-01-26 16:41:25 +05:30
parent 43234d4153
commit 5466aa84b1
8 changed files with 76 additions and 70 deletions

View file

@ -50,7 +50,7 @@ func newAttachmentImage(a discord.Attachment) (*AttachmentImage, error) {
func (ai *AttachmentImage) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
if event.Name() == config.Current.Keys.Cancel {
app.SetRoot(mainFlex, true)
app.SetFocus(messagesText)
app.SetFocus(mainFlex.messagesText)
return nil
}

View file

@ -163,8 +163,8 @@ PARENT_CHANNELS:
func (gt *GuildsTree) onSelected(n *tview.TreeNode) {
gt.selectedChannelID = 0
messagesText.reset()
messageInput.reset()
mainFlex.messagesText.reset()
mainFlex.messageInput.reset()
if len(n.GetChildren()) != 0 {
n.SetExpanded(!n.IsExpanded())
@ -193,7 +193,7 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) {
}
for i := len(ms) - 1; i >= 0; i-- {
messagesText.createMessage(ms[i])
mainFlex.messagesText.createMessage(ms[i])
}
c, err := discordState.Cabinet.Channel(ref)
@ -202,10 +202,10 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) {
return
}
messagesText.SetTitle(gt.channelToString(*c))
mainFlex.messagesText.SetTitle(gt.channelToString(*c))
gt.selectedChannelID = ref
app.SetFocus(messageInput)
app.SetFocus(mainFlex.messageInput)
case nil: // Direct messages
cs, err := discordState.Cabinet.PrivateChannels()
if err != nil {

View file

@ -63,21 +63,13 @@ func (lf *LoginForm) onLoginButtonSelected() {
}
}
mainFlex = newMainFlex()
// We got the token, return with a new Session.
discordState, err = openState(l.Token)
if err != nil {
log.Fatal(err)
}
right := tview.NewFlex()
right.SetDirection(tview.FlexRow)
right.AddItem(messagesText, 0, 1, false)
right.AddItem(messageInput, 3, 1, false)
// The guilds tree is always focused first at start-up.
mainFlex.AddItem(guildsTree, 0, 1, true)
mainFlex.AddItem(right, 0, 4, false)
mainFlex.SetInputCapture(onInputCapture)
app.SetRoot(mainFlex, true)
}

24
main.go
View file

@ -16,11 +16,8 @@ var (
discordState *State
app = tview.NewApplication()
mainFlex = tview.NewFlex()
guildsTree *GuildsTree
messagesText *MessagesText
messageInput *MessageInput
app = tview.NewApplication()
mainFlex *MainFlex
)
func init() {
@ -64,30 +61,17 @@ func main() {
log.Fatal(err)
}
// Initialize UI widgets
guildsTree = newGuildsTree()
messagesText = newMessagesText()
messageInput = newMessageInput()
// mission failed, we'll get 'em next time
if token == "" {
app.SetRoot(newLoginForm(), true)
} else {
mainFlex = newMainFlex()
discordState, err = openState(token)
if err != nil {
log.Fatal(err)
}
right := tview.NewFlex()
right.SetDirection(tview.FlexRow)
right.AddItem(messagesText, 0, 1, false)
right.AddItem(messageInput, 3, 1, false)
// The guilds tree is always focused first at start-up.
mainFlex.AddItem(guildsTree, 0, 1, true)
mainFlex.AddItem(right, 0, 4, false)
mainFlex.SetInputCapture(onInputCapture)
app.SetRoot(mainFlex, true)
}

View file

@ -3,18 +3,48 @@ package main
import (
"github.com/ayn2op/discordo/internal/config"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
func onInputCapture(event *tcell.EventKey) *tcell.EventKey {
type MainFlex struct {
*tview.Flex
guildsTree *GuildsTree
messagesText *MessagesText
messageInput *MessageInput
}
func newMainFlex() *MainFlex {
mf := &MainFlex{
Flex: tview.NewFlex(),
guildsTree: newGuildsTree(),
messagesText: newMessagesText(),
messageInput: newMessageInput(),
}
right := tview.NewFlex()
right.SetDirection(tview.FlexRow)
right.AddItem(mf.messagesText, 0, 1, false)
right.AddItem(mf.messageInput, 3, 1, false)
// The guilds tree is always focused first at start-up.
mf.AddItem(mf.guildsTree, 0, 1, true)
mf.AddItem(right, 0, 4, false)
mf.SetInputCapture(mf.onInputCapture)
return mf
}
func (mf *MainFlex) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
switch event.Name() {
case config.Current.Keys.GuildsTree.Focus:
app.SetFocus(guildsTree)
app.SetFocus(mf.guildsTree)
return nil
case config.Current.Keys.MessagesText.Focus:
app.SetFocus(messagesText)
app.SetFocus(mf.messagesText)
return nil
case config.Current.Keys.MessageInput.Focus:
app.SetFocus(messageInput)
app.SetFocus(mf.messageInput)
return nil
}

View file

@ -53,7 +53,7 @@ func (mi *MessageInput) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
mi.pasteAction()
return nil
case config.Current.Keys.MessageInput.LaunchEditor:
messageInput.launchEditorAction()
mainFlex.messageInput.launchEditorAction()
return nil
case config.Current.Keys.Cancel:
mi.reset()
@ -64,7 +64,7 @@ func (mi *MessageInput) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
}
func (mi *MessageInput) sendAction() {
if !guildsTree.selectedChannelID.IsValid() {
if !mainFlex.guildsTree.selectedChannelID.IsValid() {
return
}
@ -74,8 +74,8 @@ func (mi *MessageInput) sendAction() {
}
var err error
if messagesText.selectedMessage != -1 {
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
if mainFlex.messagesText.selectedMessage != -1 {
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return
@ -83,7 +83,7 @@ func (mi *MessageInput) sendAction() {
data := api.SendMessageData{
Content: text,
Reference: &discord.MessageReference{MessageID: ms[messagesText.selectedMessage].ID},
Reference: &discord.MessageReference{MessageID: ms[mainFlex.messagesText.selectedMessage].ID},
AllowedMentions: &api.AllowedMentions{RepliedUser: option.False},
}
@ -91,9 +91,9 @@ func (mi *MessageInput) sendAction() {
data.AllowedMentions.RepliedUser = option.True
}
go discordState.SendMessageComplex(guildsTree.selectedChannelID, data)
go discordState.SendMessageComplex(mainFlex.guildsTree.selectedChannelID, data)
} else {
go discordState.SendMessage(guildsTree.selectedChannelID, text)
go discordState.SendMessage(mainFlex.guildsTree.selectedChannelID, text)
}
if err != nil {
@ -101,8 +101,8 @@ func (mi *MessageInput) sendAction() {
return
}
messagesText.selectedMessage = -1
messagesText.Highlight()
mainFlex.messagesText.selectedMessage = -1
mainFlex.messagesText.Highlight()
mi.reset()
}

View file

@ -53,7 +53,7 @@ func newMessagesText() *MessagesText {
}
func (mt *MessagesText) reset() {
messagesText.selectedMessage = -1
mainFlex.messagesText.selectedMessage = -1
mt.SetTitle("")
mt.Clear()
@ -135,10 +135,10 @@ func (mt *MessagesText) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
mt.showImageAction()
return nil
case config.Current.Keys.Cancel:
guildsTree.selectedChannelID = 0
mainFlex.guildsTree.selectedChannelID = 0
messagesText.reset()
messageInput.reset()
mainFlex.messagesText.reset()
mainFlex.messageInput.reset()
return nil
}
@ -157,20 +157,20 @@ func (mt *MessagesText) replyAction(mention bool) {
title += "Replying to "
}
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return
}
title += ms[mt.selectedMessage].Author.Tag()
messageInput.SetTitle(title)
mainFlex.messageInput.SetTitle(title)
app.SetFocus(messageInput)
app.SetFocus(mainFlex.messageInput)
}
func (mt *MessagesText) selectPreviousAction() {
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return
@ -190,7 +190,7 @@ func (mt *MessagesText) selectPreviousAction() {
}
func (mt *MessagesText) selectNextAction() {
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return
@ -210,7 +210,7 @@ func (mt *MessagesText) selectNextAction() {
}
func (mt *MessagesText) selectFirstAction() {
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return
@ -222,7 +222,7 @@ func (mt *MessagesText) selectFirstAction() {
}
func (mt *MessagesText) selectLastAction() {
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return
@ -238,7 +238,7 @@ func (mt *MessagesText) selectReplyAction() {
return
}
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return
@ -262,7 +262,7 @@ func (mt *MessagesText) copyContentAction() {
return
}
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return
@ -280,7 +280,7 @@ func (mt *MessagesText) showImageAction() {
return
}
ms, err := discordState.Cabinet.Messages(guildsTree.selectedChannelID)
ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID)
if err != nil {
log.Println(err)
return

View file

@ -60,7 +60,7 @@ func (s *State) onRequest(r httpdriver.Request) error {
func (s *State) onReady(r *gateway.ReadyEvent) {
dmNode := tview.NewTreeNode("Direct Messages")
guildsTree.root.AddChild(dmNode)
mainFlex.guildsTree.root.AddChild(dmNode)
for _, gf := range r.UserSettings.GuildFolders {
/// If the ID of the guild folder is zero, the guild folder only contains single guild.
@ -71,18 +71,18 @@ func (s *State) onReady(r *gateway.ReadyEvent) {
continue
}
guildsTree.createGuildNode(guildsTree.root, *g)
mainFlex.guildsTree.createGuildNode(mainFlex.guildsTree.root, *g)
} else {
guildsTree.createGuildFolderNode(guildsTree.root, gf)
mainFlex.guildsTree.createGuildFolderNode(mainFlex.guildsTree.root, gf)
}
}
guildsTree.SetCurrentNode(guildsTree.root)
app.SetFocus(guildsTree)
mainFlex.guildsTree.SetCurrentNode(mainFlex.guildsTree.root)
app.SetFocus(mainFlex.guildsTree)
}
func (s *State) onMessageCreate(m *gateway.MessageCreateEvent) {
if guildsTree.selectedChannelID.IsValid() && guildsTree.selectedChannelID == m.ChannelID {
messagesText.createMessage(m.Message)
if mainFlex.guildsTree.selectedChannelID.IsValid() && mainFlex.guildsTree.selectedChannelID == m.ChannelID {
mainFlex.messagesText.createMessage(m.Message)
}
}