summaryrefslogtreecommitdiff
path: root/abaddon.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-11-08 00:44:26 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2020-11-08 00:44:26 -0500
commitf124626a6dcecf928be90193b2faf8e265ba502b (patch)
treeca8a04dbfa7eca331440312f72f955ff3ed3069a /abaddon.cpp
parent0c442a423eaebe04a61decc91d7018c33e3fdbde (diff)
downloadabaddon-portaudio-f124626a6dcecf928be90193b2faf8e265ba502b.tar.gz
abaddon-portaudio-f124626a6dcecf928be90193b2faf8e265ba502b.zip
allow multiple components to display shared user menu
Diffstat (limited to 'abaddon.cpp')
-rw-r--r--abaddon.cpp53
1 files changed, 49 insertions, 4 deletions
diff --git a/abaddon.cpp b/abaddon.cpp
index 4ac1780..805e976 100644
--- a/abaddon.cpp
+++ b/abaddon.cpp
@@ -58,6 +58,22 @@ int Abaddon::StartGTK() {
m_main_window->show();
m_main_window->UpdateComponents();
+ // crashes for some stupid reason if i put it somewhere else
+ m_user_menu = Gtk::manage(new Gtk::Menu);
+ m_user_menu_insert_mention = Gtk::manage(new Gtk::MenuItem("Insert Mention"));
+ m_user_menu_ban = Gtk::manage(new Gtk::MenuItem("Ban"));
+ m_user_menu_kick = Gtk::manage(new Gtk::MenuItem("Kick"));
+ m_user_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
+ m_user_menu_insert_mention->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_insert_mention));
+ m_user_menu_ban->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_ban));
+ m_user_menu_kick->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_kick));
+ m_user_menu_copy_id->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_copy_id));
+ m_user_menu->append(*m_user_menu_insert_mention);
+ m_user_menu->append(*m_user_menu_ban);
+ m_user_menu->append(*m_user_menu_kick);
+ m_user_menu->append(*m_user_menu_copy_id);
+ m_user_menu->show_all();
+
m_main_window->signal_action_connect().connect(sigc::mem_fun(*this, &Abaddon::ActionConnect));
m_main_window->signal_action_disconnect().connect(sigc::mem_fun(*this, &Abaddon::ActionDisconnect));
m_main_window->signal_action_set_token().connect(sigc::mem_fun(*this, &Abaddon::ActionSetToken));
@@ -65,6 +81,8 @@ int Abaddon::StartGTK() {
m_main_window->signal_action_join_guild().connect(sigc::mem_fun(*this, &Abaddon::ActionJoinGuildDialog));
m_main_window->signal_action_set_status().connect(sigc::mem_fun(*this, &Abaddon::ActionSetStatus));
+ m_main_window->signal_action_show_user_menu().connect(sigc::mem_fun(*this, &Abaddon::ShowUserMenu));
+
m_main_window->GetChannelList()->signal_action_channel_item_select().connect(sigc::mem_fun(*this, &Abaddon::ActionChannelOpened));
m_main_window->GetChannelList()->signal_action_guild_move_up().connect(sigc::mem_fun(*this, &Abaddon::ActionMoveGuildUp));
m_main_window->GetChannelList()->signal_action_guild_move_down().connect(sigc::mem_fun(*this, &Abaddon::ActionMoveGuildDown));
@@ -77,10 +95,6 @@ int Abaddon::StartGTK() {
m_main_window->GetChatWindow()->signal_action_channel_click().connect(sigc::mem_fun(*this, &Abaddon::ActionChannelOpened));
m_main_window->GetChatWindow()->signal_action_insert_mention().connect(sigc::mem_fun(*this, &Abaddon::ActionInsertMention));
- m_main_window->GetMemberList()->signal_action_insert_mention().connect(sigc::mem_fun(*this, &Abaddon::ActionInsertMention));
- m_main_window->GetMemberList()->signal_action_kick().connect(sigc::mem_fun(*this, &Abaddon::ActionKickMember));
- m_main_window->GetMemberList()->signal_action_ban().connect(sigc::mem_fun(*this, &Abaddon::ActionBanMember));
-
ActionReloadCSS();
m_gtk_app->signal_shutdown().connect([&]() {
@@ -186,6 +200,37 @@ const SettingsManager &Abaddon::GetSettings() const {
return m_settings;
}
+void Abaddon::ShowUserMenu(const GdkEvent *event, Snowflake id, Snowflake guild_id) {
+ m_shown_user_menu_id = id;
+ m_shown_user_menu_guild_id = guild_id;
+
+ const auto me = m_discord.GetUserData().ID;
+ const bool has_kick = m_discord.HasGuildPermission(me, guild_id, Permission::KICK_MEMBERS);
+ const bool has_ban = m_discord.HasGuildPermission(me, guild_id, Permission::BAN_MEMBERS);
+ const bool can_manage = m_discord.CanManageMember(guild_id, me, id);
+
+ m_user_menu_kick->set_sensitive(has_kick && can_manage);
+ m_user_menu_ban->set_sensitive(has_ban && can_manage);
+
+ m_user_menu->popup_at_pointer(event);
+}
+
+void Abaddon::on_user_menu_insert_mention() {
+ ActionInsertMention(m_shown_user_menu_id);
+}
+
+void Abaddon::on_user_menu_ban() {
+ ActionBanMember(m_shown_user_menu_id, m_shown_user_menu_guild_id);
+}
+
+void Abaddon::on_user_menu_kick() {
+ ActionKickMember(m_shown_user_menu_id, m_shown_user_menu_guild_id);
+}
+
+void Abaddon::on_user_menu_copy_id() {
+ Gtk::Clipboard::get()->set_text(std::to_string(m_shown_user_menu_id));
+}
+
void Abaddon::ActionConnect() {
if (!m_discord.IsStarted())
StartDiscord();