channel list: handle guild create/delete

This commit is contained in:
ouwou
2021-07-03 19:47:13 -04:00
parent 66e2311bf0
commit 67c944f219
2 changed files with 97 additions and 58 deletions

View File

@@ -54,6 +54,8 @@ Gtk::Widget *ChannelList::GetRoot() const {
}
void ChannelList::UpdateListing() {
m_model->clear();
auto &discord = Abaddon::Get().GetDiscordClient();
auto &img = Abaddon::Get().GetImageManager();
@@ -63,71 +65,32 @@ void ChannelList::UpdateListing() {
const auto guild = discord.GetGuild(guild_id);
if (!guild.has_value()) continue;
auto guild_row = *m_model->append();
guild_row[m_columns.m_type] = RenderType::Guild;
guild_row[m_columns.m_id] = guild_id;
guild_row[m_columns.m_name] = "<b>" + Glib::Markup::escape_text(guild->Name) + "</b>";
guild_row[m_columns.m_icon] = img.GetPlaceholder(24);
guild_row[m_columns.m_sort] = ++sortnum;
if (guild->HasIcon()) {
const auto cb = [this, guild_row](const Glib::RefPtr<Gdk::Pixbuf> &pb) {
guild_row[m_columns.m_icon] = pb->scale_simple(24, 24, Gdk::INTERP_BILINEAR);
};
img.LoadFromURL(guild->GetIconURL("png", "32"), sigc::track_obj(cb, *this));
}
if (!guild->Channels.has_value()) continue;
// separate out the channels
std::vector<ChannelData> orphan_channels;
std::map<Snowflake, std::vector<ChannelData>> categories;
for (const auto &channel_ : *guild->Channels) {
const auto channel = discord.GetChannel(channel_.ID);
if (!channel.has_value()) continue;
if (channel->Type == ChannelType::GUILD_TEXT || channel->Type == ChannelType::GUILD_NEWS) {
if (channel->ParentID.has_value())
categories[*channel->ParentID].push_back(*channel);
else
orphan_channels.push_back(*channel);
} else if (channel->Type == ChannelType::GUILD_CATEGORY) {
categories[channel->ID];
}
}
for (const auto &channel : orphan_channels) {
auto channel_row = *m_model->append(guild_row.children());
channel_row[m_columns.m_type] = RenderType::TextChannel;
channel_row[m_columns.m_id] = channel.ID;
channel_row[m_columns.m_name] = Glib::Markup::escape_text(*channel.Name);
channel_row[m_columns.m_sort] = *channel.Position - 100; // subtract 100 to make sure they stay behind categories
}
for (const auto &[category_id, channels] : categories) {
const auto category = discord.GetChannel(category_id);
if (!category.has_value()) continue;
auto cat_row = *m_model->append(guild_row.children());
cat_row[m_columns.m_type] = RenderType::Category;
cat_row[m_columns.m_id] = category_id;
cat_row[m_columns.m_name] = Glib::Markup::escape_text(*category->Name);
cat_row[m_columns.m_sort] = *category->Position;
for (const auto &channel : channels) {
auto channel_row = *m_model->append(cat_row.children());
channel_row[m_columns.m_type] = RenderType::TextChannel;
channel_row[m_columns.m_id] = channel.ID;
channel_row[m_columns.m_name] = Glib::Markup::escape_text(*channel.Name);
channel_row[m_columns.m_sort] = *channel.Position;
}
}
auto iter = AddGuild(*guild);
(*iter)[m_columns.m_sort] = sortnum++;
}
}
void ChannelList::UpdateNewGuild(Snowflake id) {
const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(id);
auto &img = Abaddon::Get().GetImageManager();
if (!guild.has_value()) return;
auto iter = AddGuild(*guild);
// update sort order
int sortnum = 0;
for (const auto guild_id : Abaddon::Get().GetDiscordClient().GetUserSortedGuilds()) {
auto iter = GetIteratorForGuildFromID(guild_id);
if (iter)
(*iter)[m_columns.m_sort] = ++sortnum;
}
}
void ChannelList::UpdateRemoveGuild(Snowflake id) {
auto iter = GetIteratorForGuildFromID(id);
if (!iter) return;
m_model->erase(iter);
}
void ChannelList::UpdateRemoveChannel(Snowflake id) {
@@ -148,6 +111,79 @@ void ChannelList::UpdateGuild(Snowflake id) {
void ChannelList::SetActiveChannel(Snowflake id) {
}
Gtk::TreeModel::iterator ChannelList::AddGuild(const GuildData &guild) {
auto &discord = Abaddon::Get().GetDiscordClient();
auto &img = Abaddon::Get().GetImageManager();
auto guild_row = *m_model->append();
guild_row[m_columns.m_type] = RenderType::Guild;
guild_row[m_columns.m_id] = guild.ID;
guild_row[m_columns.m_name] = "<b>" + Glib::Markup::escape_text(guild.Name) + "</b>";
guild_row[m_columns.m_icon] = img.GetPlaceholder(24);
if (guild.HasIcon()) {
const auto cb = [this, guild_row](const Glib::RefPtr<Gdk::Pixbuf> &pb) {
guild_row[m_columns.m_icon] = pb->scale_simple(24, 24, Gdk::INTERP_BILINEAR);
};
img.LoadFromURL(guild.GetIconURL("png", "32"), sigc::track_obj(cb, *this));
}
if (!guild.Channels.has_value()) return guild_row;
// separate out the channels
std::vector<ChannelData> orphan_channels;
std::map<Snowflake, std::vector<ChannelData>> categories;
for (const auto &channel_ : *guild.Channels) {
const auto channel = discord.GetChannel(channel_.ID);
if (!channel.has_value()) continue;
if (channel->Type == ChannelType::GUILD_TEXT || channel->Type == ChannelType::GUILD_NEWS) {
if (channel->ParentID.has_value())
categories[*channel->ParentID].push_back(*channel);
else
orphan_channels.push_back(*channel);
} else if (channel->Type == ChannelType::GUILD_CATEGORY) {
categories[channel->ID];
}
}
for (const auto &channel : orphan_channels) {
auto channel_row = *m_model->append(guild_row.children());
channel_row[m_columns.m_type] = RenderType::TextChannel;
channel_row[m_columns.m_id] = channel.ID;
channel_row[m_columns.m_name] = Glib::Markup::escape_text(*channel.Name);
channel_row[m_columns.m_sort] = *channel.Position - 100; // subtract 100 to make sure they stay behind categories
}
for (const auto &[category_id, channels] : categories) {
const auto category = discord.GetChannel(category_id);
if (!category.has_value()) continue;
auto cat_row = *m_model->append(guild_row.children());
cat_row[m_columns.m_type] = RenderType::Category;
cat_row[m_columns.m_id] = category_id;
cat_row[m_columns.m_name] = Glib::Markup::escape_text(*category->Name);
cat_row[m_columns.m_sort] = *category->Position;
for (const auto &channel : channels) {
auto channel_row = *m_model->append(cat_row.children());
channel_row[m_columns.m_type] = RenderType::TextChannel;
channel_row[m_columns.m_id] = channel.ID;
channel_row[m_columns.m_name] = Glib::Markup::escape_text(*channel.Name);
channel_row[m_columns.m_sort] = *channel.Position;
}
}
return guild_row;
}
Gtk::TreeModel::iterator ChannelList::GetIteratorForGuildFromID(Snowflake id) {
for (const auto child : m_model->children()) {
if (child[m_columns.m_id] == id)
return child;
}
return {};
}
ChannelList::type_signal_action_channel_item_select ChannelList::signal_action_channel_item_select() {
return m_signal_action_channel_item_select;
}

View File

@@ -119,6 +119,9 @@ protected:
ModelColumns m_columns;
Glib::RefPtr<Gtk::TreeStore> m_model;
Gtk::TreeModel::iterator AddGuild(const GuildData &guild);
Gtk::TreeModel::iterator GetIteratorForGuildFromID(Snowflake id);
public:
typedef sigc::signal<void, Snowflake> type_signal_action_channel_item_select;
typedef sigc::signal<void, Snowflake> type_signal_action_guild_leave;