summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-09-05 00:55:06 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2020-09-05 00:55:06 -0400
commit8941d5f204fdfc60c33f26f50aedc603bf091e6f (patch)
treeb9e19ee17d4c97cd294632907c209072faf73802 /components
parent153f55668192a235c1874b332a665de6d5883306 (diff)
downloadabaddon-portaudio-8941d5f204fdfc60c33f26f50aedc603bf091e6f.tar.gz
abaddon-portaudio-8941d5f204fdfc60c33f26f50aedc603bf091e6f.zip
lazy loading, member list, some other shit
Diffstat (limited to 'components')
-rw-r--r--components/memberlist.cpp59
-rw-r--r--components/memberlist.hpp20
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;
};