add guild menus to classic guild list

This commit is contained in:
ouwou
2024-02-10 22:28:03 -05:00
parent 8f6bafa78a
commit bddaf99c12
3 changed files with 83 additions and 1 deletions

View File

@@ -92,6 +92,14 @@ void ChannelList::ConnectSignals() {
m_tree.signal_action_guild_settings().connect([this](Snowflake id) {
m_signal_action_guild_settings.emit(id);
});
m_guilds.signal_action_guild_leave().connect([this](Snowflake id) {
m_signal_action_guild_leave.emit(id);
});
m_guilds.signal_action_guild_settings().connect([this](Snowflake id) {
m_signal_action_guild_settings.emit(id);
});
}
#ifdef WITH_LIBHANDY

View File

@@ -18,10 +18,41 @@ private:
Gtk::Image m_img;
};
GuildList::GuildList() {
GuildList::GuildList()
: m_menu_guild_copy_id("_Copy ID", true)
, m_menu_guild_settings("View _Settings", true)
, m_menu_guild_leave("_Leave", true)
, m_menu_guild_mark_as_read("Mark as _Read", true) {
get_style_context()->add_class("guild-list");
set_selection_mode(Gtk::SELECTION_NONE);
show_all_children();
m_menu_guild_copy_id.signal_activate().connect([this] {
Gtk::Clipboard::get()->set_text(std::to_string(m_menu_guild_target));
});
m_menu_guild_settings.signal_activate().connect([this] {
m_signal_action_guild_settings.emit(m_menu_guild_target);
});
m_menu_guild_leave.signal_activate().connect([this] {
m_signal_action_guild_leave.emit(m_menu_guild_target);
});
m_menu_guild_mark_as_read.signal_activate().connect([this] {
Abaddon::Get().GetDiscordClient().MarkGuildAsRead(m_menu_guild_target, [](...) {});
});
m_menu_guild_toggle_mute.signal_activate().connect([this] {
const auto id = m_menu_guild_target;
auto &discord = Abaddon::Get().GetDiscordClient();
if (discord.IsGuildMuted(id))
discord.UnmuteGuild(id, NOOP_CALLBACK);
else
discord.MuteGuild(id, NOOP_CALLBACK);
});
m_menu_guild.append(m_menu_guild_mark_as_read);
m_menu_guild.append(m_menu_guild_settings);
m_menu_guild.append(m_menu_guild_leave);
m_menu_guild.append(m_menu_guild_toggle_mute);
m_menu_guild.append(m_menu_guild_copy_id);
m_menu_guild.show_all();
}
void GuildList::UpdateListing() {
@@ -76,6 +107,10 @@ GuildListGuildItem *GuildList::CreateGuildWidget(Snowflake id) {
item->signal_button_press_event().connect([this, id](GdkEventButton *event) -> bool {
if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_PRIMARY) {
m_signal_guild_selected.emit(id);
} else if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_SECONDARY) {
m_menu_guild_target = id;
OnGuildSubmenuPopup();
m_menu_guild.popup_at_pointer(reinterpret_cast<GdkEvent *>(event));
}
return true;
});
@@ -111,6 +146,20 @@ void GuildList::Clear() {
}
}
void GuildList::OnGuildSubmenuPopup() {
const auto id = m_menu_guild_target;
auto &discord = Abaddon::Get().GetDiscordClient();
if (discord.IsGuildMuted(id)) {
m_menu_guild_toggle_mute.set_label("Unmute");
} else {
m_menu_guild_toggle_mute.set_label("Mute");
}
const auto guild = discord.GetGuild(id);
const auto self_id = discord.GetUserData().ID;
m_menu_guild_leave.set_sensitive(!(guild.has_value() && guild->OwnerID == self_id));
}
GuildList::type_signal_guild_selected GuildList::signal_guild_selected() {
return m_signal_guild_selected;
}
@@ -118,3 +167,11 @@ GuildList::type_signal_guild_selected GuildList::signal_guild_selected() {
GuildList::type_signal_dms_selected GuildList::signal_dms_selected() {
return m_signal_dms_selected;
}
GuildList::type_signal_action_guild_leave GuildList::signal_action_guild_leave() {
return m_signal_action_guild_leave;
}
GuildList::type_signal_action_guild_settings GuildList::signal_action_guild_settings() {
return m_signal_action_guild_settings;
}

View File

@@ -18,14 +18,31 @@ private:
GuildListGuildItem *CreateGuildWidget(Snowflake id);
// todo code duplication not good no sir
Gtk::Menu m_menu_guild;
Gtk::MenuItem m_menu_guild_copy_id;
Gtk::MenuItem m_menu_guild_settings;
Gtk::MenuItem m_menu_guild_leave;
Gtk::MenuItem m_menu_guild_mark_as_read;
Gtk::MenuItem m_menu_guild_toggle_mute;
Snowflake m_menu_guild_target;
void OnGuildSubmenuPopup();
public:
using type_signal_guild_selected = sigc::signal<void, Snowflake>;
using type_signal_dms_selected = sigc::signal<void>;
using type_signal_action_guild_leave = sigc::signal<void, Snowflake>;
using type_signal_action_guild_settings = sigc::signal<void, Snowflake>;
type_signal_guild_selected signal_guild_selected();
type_signal_dms_selected signal_dms_selected();
type_signal_action_guild_leave signal_action_guild_leave();
type_signal_action_guild_settings signal_action_guild_settings();
private:
type_signal_guild_selected m_signal_guild_selected;
type_signal_dms_selected m_signal_dms_selected;
type_signal_action_guild_leave m_signal_action_guild_leave;
type_signal_action_guild_settings m_signal_action_guild_settings;
};