diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-06-16 03:53:30 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-06-16 03:53:30 -0400 |
commit | 51fdcddaea49c8a23475be12b16c772d4d33b8ee (patch) | |
tree | e707dbbddc6c554bf4c52486517c28af176a014d /components | |
parent | d527669d39d96e40b6dabfc0a687d1a20faa23da (diff) | |
download | abaddon-portaudio-51fdcddaea49c8a23475be12b16c772d4d33b8ee.tar.gz abaddon-portaudio-51fdcddaea49c8a23475be12b16c772d4d33b8ee.zip |
move chat message menu into the chatlist
Diffstat (limited to 'components')
-rw-r--r-- | components/chatlist.cpp | 65 | ||||
-rw-r--r-- | components/chatlist.hpp | 8 | ||||
-rw-r--r-- | components/chatmessage.cpp | 78 | ||||
-rw-r--r-- | components/chatmessage.hpp | 25 |
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 ¶m) { 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 { |