summaryrefslogtreecommitdiff
path: root/src/components/chatmessage.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2022-11-29 15:53:02 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2022-11-29 15:53:02 -0500
commit573a61919149d8d0119601a06e23322b71c778c3 (patch)
tree0f9fd234f4b7f5c409172a5d6afe9897b6f88097 /src/components/chatmessage.cpp
parent77dd9fabfa054bd8fa24f869b976da7ee69c8a87 (diff)
parentc5807a3463aaefc89e2432730b997437305af59a (diff)
downloadabaddon-portaudio-573a61919149d8d0119601a06e23322b71c778c3.tar.gz
abaddon-portaudio-573a61919149d8d0119601a06e23322b71c778c3.zip
Merge branch 'master' into keychain
Diffstat (limited to 'src/components/chatmessage.cpp')
-rw-r--r--src/components/chatmessage.cpp91
1 files changed, 55 insertions, 36 deletions
diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp
index 863349f..3afdf9f 100644
--- a/src/components/chatmessage.cpp
+++ b/src/components/chatmessage.cpp
@@ -32,7 +32,6 @@ ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(const Message &d
if (!data.Content.empty() || data.Type != MessageType::DEFAULT) {
container->m_text_component = container->CreateTextComponent(data);
- container->AttachEventHandlers(*container->m_text_component);
container->m_main.add(*container->m_text_component);
}
@@ -101,7 +100,6 @@ void ChatMessageItemContainer::UpdateContent() {
if (!data->Embeds.empty()) {
m_embed_component = CreateEmbedsComponent(data->Embeds);
- AttachEventHandlers(*m_embed_component);
m_main.add(*m_embed_component);
m_embed_component->show_all();
}
@@ -152,12 +150,12 @@ void ChatMessageItemContainer::UpdateAttributes() {
void ChatMessageItemContainer::AddClickHandler(Gtk::Widget *widget, const std::string &url) {
// clang-format off
- widget->signal_button_press_event().connect([url](GdkEventButton *event) -> bool {
- if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_PRIMARY) {
+ widget->signal_button_release_event().connect([url](GdkEventButton *event) -> bool {
+ if (event->type == GDK_BUTTON_RELEASE && event->button == GDK_BUTTON_PRIMARY) {
LaunchBrowser(url);
- return false;
+ return true;
}
- return true;
+ return false;
}, false);
// clang-format on
}
@@ -174,6 +172,8 @@ Gtk::TextView *ChatMessageItemContainer::CreateTextComponent(const Message &data
tv->set_halign(Gtk::ALIGN_FILL);
tv->set_hexpand(true);
+ tv->signal_button_press_event().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::OnTextViewButtonPress), false);
+
UpdateTextComponent(tv);
return tv;
@@ -281,8 +281,6 @@ void ChatMessageItemContainer::UpdateTextComponent(Gtk::TextView *tv) {
tag->property_weight() = Pango::WEIGHT_BOLD;
m_channel_tagmap[tag] = *data->MessageReference->ChannelID;
b->insert_with_tag(iter, data->Content, tag);
-
- tv->signal_button_press_event().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::OnClickChannel), false);
} else {
b->insert_markup(s, "<i><span color='#999999'>" + author->GetEscapedBoldName() + " started a thread: </span><b>" + Glib::Markup::escape_text(data->Content) + "</b></i>");
}
@@ -297,12 +295,10 @@ Gtk::Widget *ChatMessageItemContainer::CreateEmbedsComponent(const std::vector<E
if (IsEmbedImageOnly(embed)) {
auto *widget = CreateImageComponent(*embed.Thumbnail->ProxyURL, *embed.Thumbnail->URL, *embed.Thumbnail->Width, *embed.Thumbnail->Height);
widget->show();
- AttachEventHandlers(*widget);
box->add(*widget);
} else {
auto *widget = CreateEmbedComponent(embed);
widget->show();
- AttachEventHandlers(*widget);
box->add(*widget);
}
}
@@ -361,8 +357,8 @@ Gtk::Widget *ChatMessageItemContainer::CreateEmbedComponent(const EmbedData &emb
if (embed.URL.has_value()) {
AddPointerCursor(*title_ev);
auto url = *embed.URL;
- title_ev->signal_button_press_event().connect([url = std::move(url)](GdkEventButton *event) -> bool {
- if (event->button == GDK_BUTTON_PRIMARY) {
+ title_ev->signal_button_release_event().connect([url = std::move(url)](GdkEventButton *event) -> bool {
+ if (event->type == GDK_BUTTON_RELEASE && event->button == GDK_BUTTON_PRIMARY) {
LaunchBrowser(url);
return true;
}
@@ -493,12 +489,22 @@ Gtk::Widget *ChatMessageItemContainer::CreateImageComponent(const std::string &p
Gtk::EventBox *ev = Gtk::manage(new Gtk::EventBox);
Gtk::Image *widget = Gtk::manage(new LazyImage(proxy_url, w, h, false));
ev->add(*widget);
+ ev->set_halign(Gtk::ALIGN_START);
widget->set_halign(Gtk::ALIGN_START);
widget->set_size_request(w, h);
- AttachEventHandlers(*ev);
AddClickHandler(ev, url);
+ const auto on_button_press_event = [this, url](GdkEventButton *e) -> bool {
+ if (e->type == GDK_BUTTON_PRESS && e->button == GDK_BUTTON_SECONDARY) {
+ m_selected_link = url;
+ m_link_menu.popup_at_pointer(reinterpret_cast<GdkEvent *>(e));
+ return true;
+ }
+ return false;
+ };
+ ev->signal_button_press_event().connect(on_button_press_event, false);
+
return ev;
}
@@ -510,9 +516,18 @@ Gtk::Widget *ChatMessageItemContainer::CreateAttachmentComponent(const Attachmen
ev->get_style_context()->add_class("message-attachment-box");
ev->add(*btn);
- AttachEventHandlers(*ev);
AddClickHandler(ev, data.URL);
+ const auto on_button_press_event = [this, url = data.URL](GdkEventButton *e) -> bool {
+ if (e->type == GDK_BUTTON_PRESS && e->button == GDK_BUTTON_SECONDARY) {
+ m_selected_link = url;
+ m_link_menu.popup_at_pointer(reinterpret_cast<GdkEvent *>(e));
+ return true;
+ }
+ return false;
+ };
+ ev->signal_button_press_event().connect(on_button_press_event, false);
+
return ev;
}
@@ -534,7 +549,6 @@ Gtk::Widget *ChatMessageItemContainer::CreateStickersComponent(const std::vector
box->show();
- AttachEventHandlers(*box);
return box;
}
@@ -641,13 +655,19 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data)
const auto role = discord.GetRole(role_id);
if (role.has_value()) {
const auto author = discord.GetUser(author_id);
- return "<b><span color=\"#" + IntToCSSColor(role->Color) + "\">" + author->GetEscapedString() + "</span></b>";
+ if (author.has_value()) {
+ return "<b><span color=\"#" + IntToCSSColor(role->Color) + "\">" + author->GetEscapedString() + "</span></b>";
+ }
}
}
}
const auto author = discord.GetUser(author_id);
- return author->GetEscapedBoldString<false>();
+ if (author.has_value()) {
+ return author->GetEscapedBoldString<false>();
+ }
+
+ return "<b>Unknown User</b>";
};
// if the message wasnt fetched from store it might have an un-fetched reference
@@ -659,15 +679,15 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data)
}
if (data.Interaction.has_value()) {
- const auto user = *discord.GetUser(data.Interaction->User.ID);
-
if (data.GuildID.has_value()) {
- lbl->set_markup(get_author_markup(user.ID, *data.GuildID) +
+ lbl->set_markup(get_author_markup(data.Interaction->User.ID, *data.GuildID) +
" used <span color='#697ec4'>/" +
Glib::Markup::escape_text(data.Interaction->Name) +
"</span>");
+ } else if (const auto user = discord.GetUser(data.Interaction->User.ID); user.has_value()) {
+ lbl->set_markup(user->GetEscapedBoldString<false>());
} else {
- lbl->set_markup(user.GetEscapedBoldString<false>());
+ lbl->set_markup("<b>Unknown User</b>");
}
} else if (referenced_message.has_value()) {
if (referenced_message.value() == nullptr) {
@@ -956,7 +976,6 @@ void ChatMessageItemContainer::HandleChannelMentions(const Glib::RefPtr<Gtk::Tex
}
void ChatMessageItemContainer::HandleChannelMentions(Gtk::TextView *tv) {
- tv->signal_button_press_event().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::OnClickChannel), false);
HandleChannelMentions(tv->get_buffer());
}
@@ -990,6 +1009,20 @@ bool ChatMessageItemContainer::OnClickChannel(GdkEventButton *ev) {
return false;
}
+bool ChatMessageItemContainer::OnTextViewButtonPress(GdkEventButton *ev) {
+ // run all button press handlers and propagate if none return true
+ if (OnLinkClick(ev)) return true;
+ if (OnClickChannel(ev)) return true;
+
+ if (ev->type == GDK_BUTTON_PRESS && ev->button == GDK_BUTTON_SECONDARY) {
+ // send the event upward skipping TextView's handler because we dont want it
+ gtk_propagate_event(GTK_WIDGET(m_main.gobj()), reinterpret_cast<GdkEvent *>(ev));
+ return true;
+ }
+
+ return false;
+}
+
void ChatMessageItemContainer::on_link_menu_copy() {
Gtk::Clipboard::get()->set_text(m_selected_link);
}
@@ -997,8 +1030,6 @@ void ChatMessageItemContainer::on_link_menu_copy() {
void ChatMessageItemContainer::HandleLinks(Gtk::TextView &tv) {
const auto rgx = Glib::Regex::create(R"(\bhttps?:\/\/[^\s]+\.[^\s]+\b)");
- tv.signal_button_press_event().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::OnLinkClick), false);
-
auto buf = tv.get_buffer();
Glib::ustring text = GetText(buf);
@@ -1070,18 +1101,6 @@ ChatMessageItemContainer::type_signal_action_reaction_remove ChatMessageItemCont
return m_signal_action_reaction_remove;
}
-void ChatMessageItemContainer::AttachEventHandlers(Gtk::Widget &widget) {
- const auto on_button_press_event = [this](GdkEventButton *e) -> bool {
- if (e->type == GDK_BUTTON_PRESS && e->button == GDK_BUTTON_SECONDARY) {
- event(reinterpret_cast<GdkEvent *>(e)); // illegal ooooooh
- return true;
- }
-
- return false;
- };
- widget.signal_button_press_event().connect(on_button_press_event, false);
-}
-
ChatMessageHeader::ChatMessageHeader(const Message &data)
: m_main_box(Gtk::ORIENTATION_HORIZONTAL)
, m_content_box(Gtk::ORIENTATION_VERTICAL)