diff --git a/components/channels.cpp b/components/channels.cpp index ee53046..453f1a2 100644 --- a/components/channels.cpp +++ b/components/channels.cpp @@ -54,6 +54,26 @@ ChannelListRowDMChannel::ChannelListRowDMChannel(const ChannelData *data) { m_lbl = Gtk::manage(new Gtk::TextView); MakeReadOnly(m_lbl); + AddWidgetMenuHandler(m_ev, m_menu); + AddWidgetMenuHandler(m_lbl, m_menu); + + m_menu_copy_id = Gtk::manage(new Gtk::MenuItem("_Copy ID", true)); + m_menu_copy_id->signal_activate().connect([this] { + Gtk::Clipboard::get()->set_text(std::to_string(ID)); + }); + + if (data->Type == ChannelType::GROUP_DM) + m_menu_close = Gtk::manage(new Gtk::MenuItem("_Leave DM", true)); + else + m_menu_close = Gtk::manage(new Gtk::MenuItem("_Close DM", true)); + m_menu_close->signal_activate().connect([this] { + Abaddon::Get().GetDiscordClient().CloseDM(ID); + }); + + m_menu.append(*m_menu_copy_id); + m_menu.append(*m_menu_close); + m_menu.show_all(); + get_style_context()->add_class("channel-row"); m_lbl->get_style_context()->add_class("channel-row-label"); diff --git a/components/channels.hpp b/components/channels.hpp index 31c494c..8515d02 100644 --- a/components/channels.hpp +++ b/components/channels.hpp @@ -44,6 +44,10 @@ protected: StatusIndicator *m_status = nullptr; Gtk::TextView *m_lbl; Gtk::Image *m_icon = nullptr; + + Gtk::Menu m_menu; + Gtk::MenuItem *m_menu_close; // leave if group + Gtk::MenuItem *m_menu_copy_id; }; class ChannelListRowGuild : public ChannelListRow { diff --git a/discord/discord.cpp b/discord/discord.cpp index 851357b..52f3125 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -436,6 +436,12 @@ void DiscordClient::CreateDM(Snowflake user_id, sigc::slot DiscordClient::FindDM(Snowflake user_id) { const auto &channels = m_store.GetChannels(); for (const auto &id : channels) { diff --git a/discord/discord.hpp b/discord/discord.hpp index 0e9dab7..fc03682 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -109,6 +109,7 @@ public: void UpdateStatus(PresenceStatus status, bool is_afk, const ActivityData &obj); void CreateDM(Snowflake user_id); void CreateDM(Snowflake user_id, sigc::slot callback); + void CloseDM(Snowflake channel_id); std::optional FindDM(Snowflake user_id); // wont find group dms void AddReaction(Snowflake id, Glib::ustring param); void RemoveReaction(Snowflake id, Glib::ustring param);