summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-06-16 03:53:30 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2021-06-16 03:53:30 -0400
commit51fdcddaea49c8a23475be12b16c772d4d33b8ee (patch)
treee707dbbddc6c554bf4c52486517c28af176a014d /components
parentd527669d39d96e40b6dabfc0a687d1a20faa23da (diff)
downloadabaddon-portaudio-51fdcddaea49c8a23475be12b16c772d4d33b8ee.tar.gz
abaddon-portaudio-51fdcddaea49c8a23475be12b16c772d4d33b8ee.zip
move chat message menu into the chatlist
Diffstat (limited to 'components')
-rw-r--r--components/chatlist.cpp65
-rw-r--r--components/chatlist.hpp8
-rw-r--r--components/chatmessage.cpp78
-rw-r--r--components/chatmessage.hpp25
4 files changed, 67 insertions, 109 deletions
diff --git a/components/chatlist.cpp b/components/chatlist.cpp
index d927cc8..e9c0f8a 100644
--- a/components/chatlist.cpp
+++ b/components/chatlist.cpp
@@ -29,6 +29,40 @@ ChatList::ChatList() {
add(m_list);
m_list.show();
+
+ m_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
+ m_menu_copy_id->signal_activate().connect([this] {
+ Gtk::Clipboard::get()->set_text(std::to_string(m_menu_selected_message));
+ });
+ m_menu.append(*m_menu_copy_id);
+
+ m_menu_delete_message = Gtk::manage(new Gtk::MenuItem("Delete Message"));
+ m_menu_delete_message->signal_activate().connect([this] {
+ m_signal_action_message_delete.emit(m_active_channel, m_menu_selected_message);
+ });
+ m_menu.append(*m_menu_delete_message);
+
+ m_menu_edit_message = Gtk::manage(new Gtk::MenuItem("Edit Message"));
+ m_menu_edit_message->signal_activate().connect([this] {
+ m_signal_action_message_edit.emit(m_active_channel, m_menu_selected_message);
+ });
+ m_menu.append(*m_menu_edit_message);
+
+ m_menu_copy_content = Gtk::manage(new Gtk::MenuItem("Copy Content"));
+ m_menu_copy_content->signal_activate().connect([this] {
+ const auto msg = Abaddon::Get().GetDiscordClient().GetMessage(m_menu_selected_message);
+ if (msg.has_value())
+ Gtk::Clipboard::get()->set_text(msg->Content);
+ });
+ m_menu.append(*m_menu_copy_content);
+
+ m_menu_reply_to = Gtk::manage(new Gtk::MenuItem("Reply To"));
+ m_menu_reply_to->signal_activate().connect([this] {
+ m_signal_action_reply_to.emit(m_menu_selected_message);
+ });
+ m_menu.append(*m_menu_reply_to);
+
+ m_menu.show_all();
}
void ChatList::Clear() {
@@ -110,13 +144,29 @@ void ChatList::ProcessNewMessage(const Message &data, bool prepend) {
header->AddContent(content, prepend);
m_id_to_widget[data.ID] = content;
+ const auto cb = [this, id = data.ID](GdkEventButton *ev) -> bool {
+ if (ev->type == GDK_BUTTON_PRESS && ev->button == GDK_BUTTON_SECONDARY) {
+ m_menu_selected_message = id;
+
+ const auto &client = Abaddon::Get().GetDiscordClient();
+ const auto data = client.GetMessage(id);
+ if (data->IsDeleted()) {
+ m_menu_delete_message->set_sensitive(false);
+ m_menu_edit_message->set_sensitive(false);
+ } else {
+ const bool can_edit = client.GetUserData().ID == data->Author.ID;
+ const bool can_delete = can_edit || client.HasChannelPermission(client.GetUserData().ID, m_active_channel, Permission::MANAGE_MESSAGES);
+ m_menu_delete_message->set_sensitive(can_delete);
+ m_menu_edit_message->set_sensitive(can_edit);
+ }
+
+ m_menu.popup_at_pointer(reinterpret_cast<GdkEvent *>(ev));
+ }
+ return false;
+ };
+ content->signal_button_press_event().connect(cb);
+
if (!data.IsPending) {
- content->signal_action_delete().connect([this, id = data.ID] {
- m_signal_action_message_delete.emit(m_active_channel, id);
- });
- content->signal_action_edit().connect([this, id = data.ID] {
- m_signal_action_message_edit.emit(m_active_channel, id);
- });
content->signal_action_reaction_add().connect([this, id = data.ID](const Glib::ustring &param) {
m_signal_action_reaction_add.emit(id, param);
});
@@ -126,9 +176,6 @@ void ChatList::ProcessNewMessage(const Message &data, bool prepend) {
content->signal_action_channel_click().connect([this](const Snowflake &id) {
m_signal_action_channel_click.emit(id);
});
- content->signal_action_reply_to().connect([this](const Snowflake &id) {
- m_signal_action_reply_to.emit(id);
- });
}
}
diff --git a/components/chatlist.hpp b/components/chatlist.hpp
index 71ee4ed..e9470d2 100644
--- a/components/chatlist.hpp
+++ b/components/chatlist.hpp
@@ -27,6 +27,14 @@ private:
void ScrollToBottom();
void RemoveMessageAndHeader(Gtk::Widget *widget);
+ Gtk::Menu m_menu;
+ Gtk::MenuItem *m_menu_copy_id;
+ Gtk::MenuItem *m_menu_copy_content;
+ Gtk::MenuItem *m_menu_delete_message;
+ Gtk::MenuItem *m_menu_edit_message;
+ Gtk::MenuItem *m_menu_reply_to;
+ Snowflake m_menu_selected_message;
+
Snowflake m_active_channel;
int m_num_messages = 0;
diff --git a/components/chatmessage.cpp b/components/chatmessage.cpp
index 0554cf7..727b64a 100644
--- a/components/chatmessage.cpp
+++ b/components/chatmessage.cpp
@@ -14,28 +14,6 @@ ChatMessageItemContainer::ChatMessageItemContainer() {
m_main = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL));
add(*m_main);
- m_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
- m_menu_copy_id->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_copy_id));
- m_menu.append(*m_menu_copy_id);
-
- m_menu_delete_message = Gtk::manage(new Gtk::MenuItem("Delete Message"));
- m_menu_delete_message->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_delete_message));
- m_menu.append(*m_menu_delete_message);
-
- m_menu_edit_message = Gtk::manage(new Gtk::MenuItem("Edit Message"));
- m_menu_edit_message->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_edit_message));
- m_menu.append(*m_menu_edit_message);
-
- m_menu_copy_content = Gtk::manage(new Gtk::MenuItem("Copy Content"));
- m_menu_copy_content->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_copy_content));
- m_menu.append(*m_menu_copy_content);
-
- m_menu_reply_to = Gtk::manage(new Gtk::MenuItem("Reply To"));
- m_menu_reply_to->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_reply_to));
- m_menu.append(*m_menu_reply_to);
-
- m_menu.show_all();
-
m_link_menu_copy = Gtk::manage(new Gtk::MenuItem("Copy Link"));
m_link_menu_copy->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_link_menu_copy));
m_link_menu.append(*m_link_menu_copy);
@@ -988,52 +966,6 @@ bool ChatMessageItemContainer::OnLinkClick(GdkEventButton *ev) {
return false;
}
-void ChatMessageItemContainer::ShowMenu(GdkEvent *event) {
- const auto &client = Abaddon::Get().GetDiscordClient();
- const auto data = client.GetMessage(ID);
- if (data->IsDeleted()) {
- m_menu_delete_message->set_sensitive(false);
- m_menu_edit_message->set_sensitive(false);
- } else {
- const bool can_edit = client.GetUserData().ID == data->Author.ID;
- const bool can_delete = can_edit || client.HasChannelPermission(client.GetUserData().ID, ChannelID, Permission::MANAGE_MESSAGES);
- m_menu_delete_message->set_sensitive(can_delete);
- m_menu_edit_message->set_sensitive(can_edit);
- }
-
- m_menu.popup_at_pointer(event);
-}
-
-void ChatMessageItemContainer::on_menu_copy_id() {
- Gtk::Clipboard::get()->set_text(std::to_string(ID));
-}
-
-void ChatMessageItemContainer::on_menu_delete_message() {
- m_signal_action_delete.emit();
-}
-
-void ChatMessageItemContainer::on_menu_edit_message() {
- m_signal_action_edit.emit();
-}
-
-void ChatMessageItemContainer::on_menu_copy_content() {
- const auto msg = Abaddon::Get().GetDiscordClient().GetMessage(ID);
- if (msg.has_value())
- Gtk::Clipboard::get()->set_text(msg->Content);
-}
-
-void ChatMessageItemContainer::on_menu_reply_to() {
- m_signal_action_reply_to.emit(ID);
-}
-
-ChatMessageItemContainer::type_signal_action_delete ChatMessageItemContainer::signal_action_delete() {
- return m_signal_action_delete;
-}
-
-ChatMessageItemContainer::type_signal_action_edit ChatMessageItemContainer::signal_action_edit() {
- return m_signal_action_edit;
-}
-
ChatMessageItemContainer::type_signal_channel_click ChatMessageItemContainer::signal_action_channel_click() {
return m_signal_action_channel_click;
}
@@ -1046,14 +978,10 @@ ChatMessageItemContainer::type_signal_action_reaction_remove ChatMessageItemCont
return m_signal_action_reaction_remove;
}
-ChatMessageItemContainer::type_signal_action_reply_to ChatMessageItemContainer::signal_action_reply_to() {
- return m_signal_action_reply_to;
-}
-
void ChatMessageItemContainer::AttachEventHandlers(Gtk::Widget &widget) {
- const auto on_button_press_event = [this](GdkEventButton *event) -> bool {
- if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_SECONDARY) {
- ShowMenu(reinterpret_cast<GdkEvent *>(event));
+ 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;
}
diff --git a/components/chatmessage.hpp b/components/chatmessage.hpp
index 4adb0a4..7bc050d 100644
--- a/components/chatmessage.hpp
+++ b/components/chatmessage.hpp
@@ -56,20 +56,6 @@ protected:
std::map<Glib::RefPtr<Gtk::TextTag>, Snowflake> m_channel_tagmap;
void AttachEventHandlers(Gtk::Widget &widget);
- void ShowMenu(GdkEvent *event);
-
- Gtk::Menu m_menu;
- Gtk::MenuItem *m_menu_copy_id;
- Gtk::MenuItem *m_menu_copy_content;
- Gtk::MenuItem *m_menu_delete_message;
- Gtk::MenuItem *m_menu_edit_message;
- Gtk::MenuItem *m_menu_reply_to;
-
- void on_menu_copy_id();
- void on_menu_delete_message();
- void on_menu_edit_message();
- void on_menu_copy_content();
- void on_menu_reply_to();
Gtk::EventBox *m_ev;
Gtk::Box *m_main;
@@ -80,29 +66,18 @@ protected:
Gtk::Widget *m_reactions_component = nullptr;
public:
- typedef sigc::signal<void> type_signal_action_delete;
- typedef sigc::signal<void> type_signal_action_edit;
typedef sigc::signal<void, Snowflake> type_signal_channel_click;
typedef sigc::signal<void, Glib::ustring> type_signal_action_reaction_add;
typedef sigc::signal<void, Glib::ustring> type_signal_action_reaction_remove;
- typedef sigc::signal<void, Snowflake> type_signal_action_reply_to;
- typedef sigc::signal<void> type_signal_enter;
- typedef sigc::signal<void> type_signal_leave;
- type_signal_action_delete signal_action_delete();
- type_signal_action_edit signal_action_edit();
type_signal_channel_click signal_action_channel_click();
type_signal_action_reaction_add signal_action_reaction_add();
type_signal_action_reaction_remove signal_action_reaction_remove();
- type_signal_action_reply_to signal_action_reply_to();
private:
- type_signal_action_delete m_signal_action_delete;
- type_signal_action_edit m_signal_action_edit;
type_signal_channel_click m_signal_action_channel_click;
type_signal_action_reaction_add m_signal_action_reaction_add;
type_signal_action_reaction_remove m_signal_action_reaction_remove;
- type_signal_action_reply_to m_signal_action_reply_to;
};
class ChatMessageHeader : public Gtk::ListBoxRow {