You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
4.7 KiB

package main
import (
"context"
"fmt"
"log"
"github.com/mattn/go-mastodon"
"github.com/rivo/tview"
)
type FocusAt uint
const (
LeftPaneFocus FocusAt = iota
RightPaneFocus
CmdBarFocus
MessageFocus
MessageAttachmentFocus
LinkOverlayFocus
AuthOverlayFocus
)
type UI struct {
app *App
Focus FocusAt
Top *tview.TextView
StatusText *StatusText
TootList *TootList
MessageBox *MessageBox
CmdBar *CmdBar
Status *tview.TextView
Pages *tview.Pages
AuthOverlay *AuthOverlay
MediaOverlay *MediaView
Timeline TimelineType
}
func (ui *UI) SetFocus(f FocusAt) {
ui.Focus = f
switch f {
case RightPaneFocus:
ui.Status.SetText("-- VIEW --")
ui.app.App.SetFocus(ui.StatusText.View)
case CmdBarFocus:
ui.Status.SetText("-- CMD --")
ui.app.App.SetFocus(ui.CmdBar.View)
case MessageFocus:
ui.Status.SetText("-- TOOT --")
ui.Pages.ShowPage("toot")
ui.Pages.HidePage("media")
ui.app.App.SetFocus(ui.MessageBox.View)
case MessageAttachmentFocus:
ui.Pages.ShowPage("media")
case LinkOverlayFocus:
ui.Status.SetText("-- LINK --")
ui.Pages.ShowPage("links")
ui.app.App.SetFocus(ui.StatusText.LinkOverlay.List)
case AuthOverlayFocus:
ui.Status.SetText("-- LOGIN --")
ui.Pages.ShowPage("login")
ui.app.App.SetFocus(ui.StatusText.app.UI.AuthOverlay.View)
default:
ui.Status.SetText("-- LIST --")
ui.app.App.SetFocus(ui.Pages)
ui.Pages.HidePage("toot")
ui.Pages.HidePage("media")
ui.Pages.HidePage("links")
ui.Pages.HidePage("login")
}
}
func (ui *UI) SetTimeline(tl TimelineType) {
ui.Timeline = tl
statuses, err := ui.app.API.GetStatuses(tl)
if err != nil {
log.Fatalln(err)
}
ui.TootList.SetFeedStatuses(statuses)
}
func (ui *UI) ShowThread() {
status, err := ui.TootList.GetStatus(ui.TootList.Index)
if err != nil {
log.Fatalln(err)
}
thread, index, err := ui.app.API.GetThread(status)
if err != nil {
log.Fatalln(err)
}
ui.TootList.SetThread(thread, index)
ui.TootList.FocusThread()
ui.SetFocus(LeftPaneFocus)
ui.TootList.Draw()
}
func (ui *UI) ShowSensetive() {
ui.StatusText.ShowTootOptions(ui.TootList.GetIndex(), true)
}
func (ui *UI) NewToot() {
ui.app.App.SetFocus(ui.MessageBox.View)
ui.app.UI.MediaOverlay.Reset()
ui.MessageBox.NewToot()
ui.MessageBox.Draw()
ui.SetFocus(MessageFocus)
}
func (ui *UI) Reply() {
status, err := ui.TootList.GetStatus(ui.TootList.GetIndex())
if err != nil {
log.Fatalln(err)
}
if status.Reblog != nil {
status = status.Reblog
}
ui.app.UI.MediaOverlay.Reset()
ui.MessageBox.Reply(status)
ui.MessageBox.Draw()
ui.SetFocus(MessageFocus)
}
func (ui *UI) ShowLinks() {
ui.SetFocus(LinkOverlayFocus)
}
func (ui *UI) OpenMedia() {
status, err := ui.TootList.GetStatus(ui.TootList.GetIndex())
if err != nil {
log.Fatalln(err)
}
if status.Reblog != nil {
status = status.Reblog
}
if len(status.MediaAttachments) == 0 {
//TODO show error that there's no media
return
}
mediaGroup := make(map[string][]mastodon.Attachment)
for _, m := range status.MediaAttachments {
mediaGroup[m.Type] = append(mediaGroup[m.Type], m)
}
for key := range mediaGroup {
var files []string
for _, m := range mediaGroup[key] {
f, err := downloadFile(m.URL)
if err != nil {
continue
}
files = append(files, f)
}
go openMedia(files)
}
}
func (ui *UI) LoggedIn() {
ui.SetFocus(LeftPaneFocus)
fmt.Fprint(ui.Top, "tut\n")
me, err := ui.app.API.Client.GetAccountCurrentUser(context.Background())
if err != nil {
log.Fatalln(err)
}
ui.app.Me = me
ui.SetTimeline(ui.Timeline)
}
func (ui *UI) LoadNewer(status *mastodon.Status) int {
statuses, _, err := ui.app.API.GetStatusesNewer(ui.Timeline, status)
if err != nil {
log.Fatalln(err)
}
ui.app.UI.TootList.PrependFeedStatuses(statuses)
return len(statuses)
}
func (ui *UI) LoadOlder(status *mastodon.Status) int {
statuses, _, err := ui.app.API.GetStatusesOlder(ui.Timeline, status)
if err != nil {
log.Fatalln(err)
}
ui.app.UI.TootList.AppendFeedStatuses(statuses)
return len(statuses)
}
func (ui *UI) FavoriteEvent() {
status, err := ui.TootList.GetStatus(ui.TootList.GetIndex())
if err != nil {
log.Fatalln(err)
}
if status.Favourited == true {
err = ui.app.API.Unfavorite(status)
} else {
err = ui.app.API.Favorite(status)
}
}
func (ui *UI) BoostEvent() {
status, err := ui.TootList.GetStatus(ui.TootList.GetIndex())
if err != nil {
log.Fatalln(err)
}
if status.Reblogged == true {
err = ui.app.API.Unboost(status)
} else {
err = ui.app.API.Boost(status)
}
if err != nil {
log.Fatalln(err)
}
}
func (ui *UI) DeleteStatus() {
status, err := ui.TootList.GetStatus(ui.TootList.GetIndex())
if err != nil {
log.Fatalln(err)
}
err = ui.app.API.DeleteStatus(status)
if err != nil {
log.Fatalln(err)
}
}