diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-09-05 00:55:06 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-09-05 00:55:06 -0400 |
commit | 8941d5f204fdfc60c33f26f50aedc603bf091e6f (patch) | |
tree | b9e19ee17d4c97cd294632907c209072faf73802 /components | |
parent | 153f55668192a235c1874b332a665de6d5883306 (diff) | |
download | abaddon-portaudio-8941d5f204fdfc60c33f26f50aedc603bf091e6f.tar.gz abaddon-portaudio-8941d5f204fdfc60c33f26f50aedc603bf091e6f.zip |
lazy loading, member list, some other shit
Diffstat (limited to 'components')
-rw-r--r-- | components/memberlist.cpp | 59 | ||||
-rw-r--r-- | components/memberlist.hpp | 20 |
2 files changed, 77 insertions, 2 deletions
diff --git a/components/memberlist.cpp b/components/memberlist.cpp index f1553b8..edbc752 100644 --- a/components/memberlist.cpp +++ b/components/memberlist.cpp @@ -1,9 +1,66 @@ #include "memberlist.hpp" +#include "../abaddon.hpp" MemberList::MemberList() { - m_main = Gtk::manage(new Gtk::Box); + m_update_member_list_dispatcher.connect(sigc::mem_fun(*this, &MemberList::UpdateMemberListInternal)); + + m_main = Gtk::manage(new Gtk::ScrolledWindow); + m_listbox = Gtk::manage(new Gtk::ListBox); + + m_main->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + m_main->add(*m_listbox); + m_main->show_all(); } Gtk::Widget *MemberList::GetRoot() const { return m_main; } + +void MemberList::SetActiveChannel(Snowflake id) { + std::scoped_lock<std::mutex> guard(m_mutex); + m_chan_id = id; + m_guild_id = m_abaddon->GetDiscordClient().GetChannel(id)->GuildID; +} + +void MemberList::UpdateMemberList() { + std::scoped_lock<std::mutex> guard(m_mutex); + m_update_member_list_dispatcher.emit(); +} + +void MemberList::UpdateMemberListInternal() { + auto children = m_listbox->get_children(); + auto it = children.begin(); + while (it != children.end()) { + delete *it; + it++; + } + + if (!m_chan_id.IsValid()) return; + + auto &discord = m_abaddon->GetDiscordClient(); + auto *chan = discord.GetChannel(m_chan_id); + std::unordered_set<Snowflake> ids; + if (chan->Type == ChannelType::DM) { + for (const auto &user : chan->Recipients) + ids.insert(user.ID); + } else { + ids = discord.GetUsersInGuild(m_guild_id); + } + + for (const auto &id : ids) { + auto *user = discord.GetUser(id); + auto *row = Gtk::manage(new Gtk::ListBoxRow); + auto *label = Gtk::manage(new Gtk::Label); + label->set_single_line_mode(true); + label->set_ellipsize(Pango::ELLIPSIZE_END); + label->set_text(user->Username + "#" + user->Discriminator); + label->set_halign(Gtk::ALIGN_START); + row->add(*label); + row->show_all(); + m_listbox->add(*row); + } +} + +void MemberList::SetAbaddon(Abaddon *ptr) { + m_abaddon = ptr; +} diff --git a/components/memberlist.hpp b/components/memberlist.hpp index 5434324..cce7bcd 100644 --- a/components/memberlist.hpp +++ b/components/memberlist.hpp @@ -1,11 +1,29 @@ #pragma once #include <gtkmm.h> +#include <mutex> +#include "../discord/discord.hpp" +class Abaddon; class MemberList { public: MemberList(); Gtk::Widget *GetRoot() const; + void UpdateMemberList(); + void SetActiveChannel(Snowflake id); + + void SetAbaddon(Abaddon *ptr); + private: - Gtk::Box *m_main; + void UpdateMemberListInternal(); + + std::mutex m_mutex; + Glib::Dispatcher m_update_member_list_dispatcher; + + Gtk::ScrolledWindow *m_main; + Gtk::ListBox *m_listbox; + + Snowflake m_guild_id; + Snowflake m_chan_id; + Abaddon *m_abaddon = nullptr; }; |