From ac013e7969bbb01950624e5e253b54197240e25d Mon Sep 17 00:00:00 2001 From: sunglocto Date: Sun, 1 Feb 2026 18:16:55 +0000 Subject: [PATCH] right-click menus alongside other changes --- gtk-helpers.go | 2 ++ gtk-message.go | 50 +++++++++++++++++++++++++++++++++++++------------- gtk-signin.go | 10 ++++++++-- main.go | 8 ++++---- 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/gtk-helpers.go b/gtk-helpers.go index 86ee942..2663bf8 100644 --- a/gtk-helpers.go +++ b/gtk-helpers.go @@ -121,6 +121,8 @@ func switchToTab(jid string, w *gtk.Window) { if mu.MucUserItem.JID != "" { profile_box.Append(gtk.NewLabel(mu.MucUserItem.JID)) } + profile_box.Append(gtk.NewLabel("Connected with role " + mu.MucUserItem.Role)) + profile_box.Append(gtk.NewLabel("Affiliated as " + mu.MucUserItem.Affiliation)) } go func() { diff --git a/gtk-message.go b/gtk-message.go index d53bea8..ddc0e88 100644 --- a/gtk-message.go +++ b/gtk-message.go @@ -7,6 +7,7 @@ import ( "encoding/base64" "fmt" "github.com/diamondburned/gotk4/pkg/gtk/v4" + "github.com/diamondburned/gotk4/pkg/gdk/v4" "github.com/google/uuid" "github.com/jacoblockett/sanitizefilename" "github.com/jasonlovesdoggo/gopen" @@ -59,17 +60,21 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { gesture := gtk.NewGestureClick() gesture.SetButton(3) // Right click - vis := false - reactions := gtk.NewBox(gtk.OrientationHorizontal, 0) - reactions.SetVisible(false) + popover := gtk.NewPopover() + popover.SetParent(mainBox) + popover.SetHasArrow(false) + + rc_box := gtk.NewBox(gtk.OrientationVertical, 0) + + reactions := gtk.NewBox(gtk.OrientationHorizontal, 0) reaction := []string{"👍", "👎", "♥️", "🤣", "😭"} for _, v := range reaction { like := gtk.NewButton() like.SetLabel(v) like.SetHExpand(true) like.ConnectClicked(func() { - fmt.Println("licked") + fmt.Println("licked") // TODO: Implement proper support for reactions via extension client.SendRaw(fmt.Sprintf(` @@ -81,14 +86,30 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { reactions.Append(like) } + rc_box.Append(reactions) + + if m.Type == stanza.MessageTypeGroupchat { + moderate := gtk.NewButtonWithLabel("Moderate") // TODO: Implement proper support for moderations via extension + moderate.ConnectClicked(func() { + client.SendRaw(fmt.Sprintf(` + + + + Retracted + + + `, jid.MustParse(m.From).Bare().String(), uuid.New().String(), sid.ID)) + }) + rc_box.Append(moderate) + } + + + popover.SetChild(rc_box) + gesture.Connect("pressed", func(n_press, x, y int) { - if !vis { - vis = true - reactions.SetVisible(true) - } else { - vis = false - reactions.SetVisible(false) - } + rect := gdk.NewRectangle(x, y, 1, 1) + popover.SetPointingTo(&rect) + popover.Popup() }) mainBox.AddController(gesture) @@ -111,6 +132,9 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { // authorBox.Append(im) + al := gtk.NewLabel(jid.MustParse(m.From).Resourcepart()) + al.AddCSSClass("author") + if m.Type == stanza.MessageTypeGroupchat { mo, _ := mucmembers.Load(jid.MustParse(m.From).Bare().String()) mm := mo.(mucUnit) @@ -138,10 +162,10 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { im.AddCSSClass("author_img") authorBox.Append(im) } + } else if m.Type == stanza.MessageTypeChat { + al.SetText(al.Text() + " whispers") } - al := gtk.NewLabel(jid.MustParse(m.From).Resourcepart()) - al.AddCSSClass("author") authorBox.Append(al) mlabel := gtk.NewLabel(m.Body) diff --git a/gtk-signin.go b/gtk-signin.go index bcdbb13..c055813 100644 --- a/gtk-signin.go +++ b/gtk-signin.go @@ -26,25 +26,31 @@ func dropToSignInPage(err error) { insecure_box := gtk.NewBox(gtk.OrientationHorizontal, 0) server_label := gtk.NewLabel("Server: ") - username_label := gtk.NewLabel("Username: ") + username_label := gtk.NewLabel("JID: ") password_label := gtk.NewLabel("Password: ") nickname_label := gtk.NewLabel("Nickname: ") - insecure_label := gtk.NewLabel("Insecure: ") + insecure_label := gtk.NewLabel("Insecure: (?)") + insecure_label.SetTooltipText("Tick this if you need to connect without TLS, usually for connecting to Tor XMPP servers") server_entry := gtk.NewEntry() server_entry.SetHAlign(gtk.AlignEnd) + server_entry.SetHExpand(true) username_entry := gtk.NewEntry() username_entry.SetHAlign(gtk.AlignEnd) + username_entry.SetHExpand(true) password_entry := gtk.NewPasswordEntry() password_entry.SetHAlign(gtk.AlignEnd) + password_entry.SetHExpand(true) nickname_entry := gtk.NewEntry() nickname_entry.SetHAlign(gtk.AlignEnd) + nickname_entry.SetHExpand(true) insecure_check := gtk.NewCheckButton() insecure_check.SetHAlign(gtk.AlignEnd) + insecure_check.SetHExpand(true) server_box.Append(server_label) diff --git a/main.go b/main.go index 0a9e816..cf1e664 100644 --- a/main.go +++ b/main.go @@ -174,7 +174,7 @@ func main() { originator := jid.MustParse(m.From).Bare().String() glib.IdleAdd(func() { - uiQueue <- func() { + //uiQueue <- func() { b := gtk.NewBox(gtk.OrientationVertical, 0) ba, ok := generateMessageWidget(p).(*gtk.Box) if ok { @@ -190,7 +190,7 @@ func main() { } else { fmt.Println("Got message when the tab does not exist!") } - } + //} }) }) @@ -230,7 +230,7 @@ func main() { } else { typed_unit.Members.Delete(ocu.ID) glib.IdleAdd(func() { - uiQueue <- func() { + //uiQueue <- func() { b := gtk.NewLabel("") ba, ok := generatePresenceWidget(p).(*gtk.Label) if ok { @@ -246,7 +246,7 @@ func main() { } else { fmt.Println("Got message when the tab does not exist!") } - } + //} }) }