diff --git a/gtk-message.go b/gtk-message.go index d01a36a..a16afdf 100644 --- a/gtk-message.go +++ b/gtk-message.go @@ -17,6 +17,7 @@ import ( "path/filepath" "runtime" "strings" + xmpp_color "mellium.im/xmpp/color" ) func generatePresenceWidget(p stanza.Packet) gtk.Widgetter { @@ -84,7 +85,13 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { sid := StanzaID{} m.Get(&sid) - mainBox := gtk.NewBox(gtk.OrientationVertical, 10) + padding := 10 + orientation := gtk.OrientationVertical + if loadedConfig.CompactMode { + padding = 5 + orientation = gtk.OrientationHorizontal + } + mainBox := gtk.NewBox(orientation, padding) gesture := gtk.NewGestureClick() gesture.SetButton(3) // Right click @@ -141,143 +148,158 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { ocu := OccupantID{} m.Get(&ocu) - //id := ocu.ID - // if id == "" { id := JidMustParse(m.From).Resource - // } - authorBox := gtk.NewBox(gtk.OrientationHorizontal, 10) + if loadedConfig.CompactMode { + al := gtk.NewLabel(id) + ycbcr := xmpp_color.String(id, 255, loadedConfig.CVD) + r, g, b, _ := ycbcr.RGBA() + hexcolor := fmt.Sprintf("#%02x%02x%02x", r, g, b) - contentBox := gtk.NewBox(gtk.OrientationHorizontal, 0) - // im := newImageFromPath("debug.png") + al.SetMarkup(fmt.Sprintf("%s", hexcolor, id)) + al.SetSelectable(true) + al.SetVAlign(gtk.AlignStart) + mainBox.Append(al) - // authorBox.Append(im) + mlabel := gtk.NewLabel(m.Body) - n := JidMustParse(m.From).Resource - if n == "" { - n = JidMustParse(m.From).Resource - } - al := gtk.NewLabel(n) - al.AddCSSClass("author") - al.SetSelectable(true) + if m.Body == "" { + mlabel.SetText(loadedLocale["noBodySet"]) + mlabel.AddCSSClass("visitor") + } + mlabel.SetWrap(true) + mlabel.SetSelectable(true) + // mlabel.SetHAlign(gtk.AlignFill) + mainBox.Append(mlabel) + } else { + authorBox := gtk.NewBox(gtk.OrientationHorizontal, 10) + contentBox := gtk.NewBox(gtk.OrientationHorizontal, 0) + n := JidMustParse(m.From).Resource + if n == "" { + n = JidMustParse(m.From).Resource + } + al := gtk.NewLabel(n) + al.AddCSSClass("author") + al.SetSelectable(true) - if m.Type == stanza.MessageTypeGroupchat { - mo, _ := mucmembers.Load(JidMustParse(m.From).Bare()) - mm := mo.(mucUnit) - mmm := mm.Members - mmmm, ok := mmm.Load(id) - if ok { - pres := mmmm.(stanza.Presence) - var vu VCardUpdate - pres.Get(&vu) - im := createIdenticon(m.From, false) - im.SetPixelSize(40) - im.AddCSSClass("author_img") - authorBox.Append(im) - if vu.Photo != "" { - go func() { - new_im := getAvatar(m.From, vu.Photo) - glib.IdleAdd(func() { - new_im.SetPixelSize(40) - new_im.AddCSSClass("author_img") - authorBox.Remove(im) - authorBox.Prepend(new_im) - }) - }() + if m.Type == stanza.MessageTypeGroupchat { + mo, _ := mucmembers.Load(JidMustParse(m.From).Bare()) + mm := mo.(mucUnit) + mmm := mm.Members + mmmm, ok := mmm.Load(id) + if ok { + pres := mmmm.(stanza.Presence) + var vu VCardUpdate + pres.Get(&vu) + im := createIdenticon(m.From, false) + im.SetPixelSize(40) + im.AddCSSClass("author_img") + authorBox.Append(im) + if vu.Photo != "" { + go func() { + new_im := getAvatar(m.From, vu.Photo) + glib.IdleAdd(func() { + new_im.SetPixelSize(40) + new_im.AddCSSClass("author_img") + authorBox.Remove(im) + authorBox.Prepend(new_im) + }) + }() + } + + } else { + im := createIdenticon(m.From, false) + im.SetPixelSize(40) + im.AddCSSClass("author_img") + authorBox.Append(im) } + } else if m.Type == stanza.MessageTypeChat { + al.SetText(al.Text() + loadedLocale["whispers"]) + } - } else { - im := createIdenticon(m.From, false) - im.SetPixelSize(40) - im.AddCSSClass("author_img") + authorBox.Append(al) + + if m.Thread != "" { + im := createIdenticon(m.Thread, true) + im.SetPixelSize(10) authorBox.Append(im) } - } else if m.Type == stanza.MessageTypeChat { - al.SetText(al.Text() + loadedLocale["whispers"]) - } - authorBox.Append(al) - - if m.Thread != "" { - im := createIdenticon(m.Thread, true) - im.SetPixelSize(10) - authorBox.Append(im) - } - - wxdc := XDCEl{} - ok = m.Get(&wxdc) - if ok { - authorBox.Append(gtk.NewLabel("🎮")) - } - - mlabel := gtk.NewLabel(m.Body) - if m.Body == "" { - mlabel.SetText(loadedLocale["noBodySet"]) - mlabel.AddCSSClass("visitor") - } - mlabel.SetWrap(true) - mlabel.SetSelectable(true) - mlabel.SetHAlign(gtk.AlignFill) - - /* - mum := MucUser{} - ok = m.Get(&mum) + wxdc := XDCEl{} + ok = m.Get(&wxdc) if ok { - mlabel.SetText(fmt.Sprintf("%s%s%s", mum.MucUserItem.JID, loadedLocale["affilChange"], mum.MucUserItem.Affiliation)) + authorBox.Append(gtk.NewLabel("🎮")) } - */ - contentBox.Append(mlabel) + mlabel := gtk.NewLabel(m.Body) + if m.Body == "" { + mlabel.SetText(loadedLocale["noBodySet"]) + mlabel.AddCSSClass("visitor") + } + mlabel.SetWrap(true) + mlabel.SetSelectable(true) + mlabel.SetHAlign(gtk.AlignFill) - mainBox.Append(authorBox) - mainBox.Append(contentBox) + /* + mum := MucUser{} + ok = m.Get(&mum) + if ok { + mlabel.SetText(fmt.Sprintf("%s%s%s", mum.MucUserItem.JID, loadedLocale["affilChange"], mum.MucUserItem.Affiliation)) + } + */ - oob := stanza.OOB{} - ok = m.Get(&oob) - if ok { - // media := newPictureFromWeb(oob.URL) - // media.SetCanShrink(false) - // mainBox.Append(media) - // media.AddCSSClass("chat_image") - mbtn := gtk.NewButtonWithLabel("🖼️") - // mbtn.SetChild(newImageFromWeb(oob.URL)) - mbtn.ConnectClicked(func() { - gopen.Open(oob.URL) - }) - authorBox.Append(mbtn) - } + contentBox.Append(mlabel) - if m.Subject != "" { - subjectlabel := gtk.NewLabel(m.Subject) - subjectlabel.SetWrap(true) - subjectlabel.SetSelectable(true) - subjectlabel.SetHAlign(gtk.AlignFill) - subjectlabel.AddCSSClass("subject") - mainBox.Append(subjectlabel) - } + mainBox.Append(authorBox) + mainBox.Append(contentBox) - link_preview := LinkPreview{} - ok = m.Get(&link_preview) - if ok { - lp_box := gtk.NewBox(gtk.OrientationVertical, 10) - lp_box.AddCSSClass("link_preview") - lp_title := gtk.NewLabel(link_preview.Title) - lp_title.SetSelectable(true) - lp_title.SetWrap(true) - lp_title.SetHAlign(gtk.AlignFill) - lp_desc := gtk.NewLabel(link_preview.URL + "\n" + link_preview.Description) - lp_desc.SetSelectable(true) - lp_desc.SetWrap(true) - lp_desc.SetHAlign(gtk.AlignFill) + oob := stanza.OOB{} + ok = m.Get(&oob) + if ok { + // media := newPictureFromWeb(oob.URL) + // media.SetCanShrink(false) + // mainBox.Append(media) + // media.AddCSSClass("chat_image") + mbtn := gtk.NewButtonWithLabel("🖼️") + // mbtn.SetChild(newImageFromWeb(oob.URL)) + mbtn.ConnectClicked(func() { + gopen.Open(oob.URL) + }) + authorBox.Append(mbtn) + } - lp_box.Append(lp_title) - lp_box.Append(lp_desc) + if m.Subject != "" { + subjectlabel := gtk.NewLabel(m.Subject) + subjectlabel.SetWrap(true) + subjectlabel.SetSelectable(true) + subjectlabel.SetHAlign(gtk.AlignFill) + subjectlabel.AddCSSClass("subject") + mainBox.Append(subjectlabel) + } - warning := gtk.NewLabel("⚠️") - warning.SetTooltipText(loadedLocale["linkPreviewWarning"]) - lp_box.Append(warning) + link_preview := LinkPreview{} + ok = m.Get(&link_preview) + if ok { + lp_box := gtk.NewBox(gtk.OrientationVertical, 10) + lp_box.AddCSSClass("link_preview") + lp_title := gtk.NewLabel(link_preview.Title) + lp_title.SetSelectable(true) + lp_title.SetWrap(true) + lp_title.SetHAlign(gtk.AlignFill) + lp_desc := gtk.NewLabel(link_preview.URL + "\n" + link_preview.Description) + lp_desc.SetSelectable(true) + lp_desc.SetWrap(true) + lp_desc.SetHAlign(gtk.AlignFill) - mainBox.Append(lp_box) + lp_box.Append(lp_title) + lp_box.Append(lp_desc) + + warning := gtk.NewLabel("⚠️") + warning.SetTooltipText(loadedLocale["linkPreviewWarning"]) + lp_box.Append(warning) + + mainBox.Append(lp_box) + } } return mainBox diff --git a/types.go b/types.go index 290b03f..5cf88d1 100644 --- a/types.go +++ b/types.go @@ -25,6 +25,7 @@ type lambdaConfig struct { Identicons bool Debug bool ShowPresenceUpdates bool + CompactMode bool } type mucUnit struct {