diff --git a/main.go b/main.go index 3178e7d..8610c69 100644 --- a/main.go +++ b/main.go @@ -75,7 +75,12 @@ var ProfileSelectionDone bool = false var ProfileSelectionProfile *HashbangProfile // The visibility that the post is going to be posted with -var PostVisibility string +var PostVisibility string = "public" + +var ReplyIDEntry *widget.Entry + +// The current page of the home timeline +var HomePage int = 1 // This function saves the config in memory to disk. func SaveConfigToDisk() error { @@ -262,15 +267,27 @@ func ProfileLaunch() { ) for _, v := range Profiles { + ext := "" + btn := widget.NewButton("Log in", func() { + ProfileSelectionDone = true + ProfileSelectionProfile = v + MainWindow.Close() + }) + + if v.InternalName == LoadedConfig.ProfileName { + ext = "🚪 " + btn.Importance = widget.DangerImportance + } else { + btn.Importance = widget.HighImportance + } + + btn.Text = ext + btn.Text + ProfileSelection.Add( container.NewHBox( widget.NewLabel(v.Name), - widget.NewButton("Log in", func() { - ProfileSelectionDone = true - ProfileSelectionProfile = v - MainWindow.Close() - }), + btn, ), ) } @@ -396,20 +413,57 @@ func main() { App = app.New() MainWindow = App.NewWindow("Hashbang") TootEntry := widget.NewMultiLineEntry() - ReplyIDEntry := widget.NewEntry() + ReplyIDEntry = widget.NewEntry() ReplyIDLabel := widget.NewLabel("In reply to") ReplyBox := container.NewGridWithColumns(2, ReplyIDLabel, ReplyIDEntry) Timeline := container.NewGridWithColumns(4) + PostTimeline := container.NewVBox(widget.NewLabel("Posts")) VisibilitySelector := widget.NewSelect([]string{"public", "unlisted", "private", "direct"}, func(value string) { PostVisibility = value }) + VisibilitySelector.Selected = "public" + + ShowTimeline := func() { + PostTimeline.RemoveAll() + pg := new(mastodon.Pagination) + posts, err := Client.GetTimelineHome(context.Background(), pg) + if err != nil { + PostTimeline.Objects[0] = widget.NewLabel(fmt.Sprintf("Error getting posts: %s", err.Error())) + return + } + + for _, status := range posts { + avatar_uri := status.Account.AvatarStatic + log.Println(avatar_uri) + u, err := storage.ParseURI(avatar_uri) + if err != nil { + continue + } + + + im := canvas.NewImageFromURI(u) + im.Resize(fyne.NewSize(25,25)) + im.FillMode = canvas.ImageFillContain + lab := widget.NewLabel(fmt.Sprintf("%s: %s", status.Account.Username, html2text.HTML2Text(status.Content))) + lab.Selectable = true + actions := container.NewHBox() + actions.Add(widget.NewButton("Favorite", func() {})) + actions.Add(widget.NewButton("Boost", func() {})) + actions.Add(widget.NewButton("Reply", func() { + ReplyIDEntry.SetText(string(status.ID)) + })) + actions.Add(widget.NewButton("Bookmark", func() {})) + lab.Wrapping = fyne.TextWrapWord + PostTimeline.Add(container.NewGridWithColumns(3, im, lab, actions)) + } + } + ShowNotifications := func() { Timeline.RemoveAll() pg := new(mastodon.Pagination) - //NewTimeline := container.NewVBox(widget.NewLabel("Notifications")) notis, err := Client.GetNotifications(context.Background(), pg) if err != nil { Timeline.Objects[0] = widget.NewLabel(fmt.Sprintf("Error getting notifications: %s", err.Error())) @@ -428,7 +482,6 @@ func main() { } else { label = widget.NewLabel("No content set") } - //label.Truncation = fyne.TextTruncateClip label.Wrapping = fyne.TextWrapWord avatar_uri := v.Account.Avatar u, err := storage.ParseURI(avatar_uri) @@ -453,10 +506,15 @@ func main() { } go ShowNotifications() + go ShowTimeline() - RefreshNotis := widget.NewButton("Refresh", ShowNotifications) + RefreshAll := widget.NewButton("Refresh", func(){ + ShowNotifications() + ShowTimeline() + }) - MainWindow.SetContent(container.NewHSplit(container.NewVBox(TootEntry, ReplyBox, VisibilitySelector, widget.NewButton("Post", func() { + + MainWindow.SetContent(container.NewVSplit(container.NewVScroll(PostTimeline), container.NewHSplit(container.NewVBox(TootEntry, ReplyBox, VisibilitySelector, widget.NewButton("Post", func() { toot := mastodon.Toot{ Status: TootEntry.Text, Visibility: PostVisibility, @@ -467,6 +525,6 @@ func main() { if err != nil { dialog.ShowError(err, MainWindow) } - }), RefreshNotis), container.NewVScroll(Timeline))) + }), RefreshAll), container.NewVScroll(Timeline)))) MainWindow.ShowAndRun() }