summaryrefslogtreecommitdiff
path: root/windows
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-08-22 01:21:06 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2021-08-22 01:21:06 -0400
commit69e03bbfb7ffa9167ca608d72caa6bc90ec190a6 (patch)
treeb003d416c08ef9d42b9ecc7d7b6baeaef573c3ed /windows
parent962cda957d21e633e3f3ecea5c0e3e84a782d367 (diff)
downloadabaddon-portaudio-69e03bbfb7ffa9167ca608d72caa6bc90ec190a6.tar.gz
abaddon-portaudio-69e03bbfb7ffa9167ca608d72caa6bc90ec190a6.zip
public/private filter in threads window
Diffstat (limited to 'windows')
-rw-r--r--windows/threadswindow.cpp50
-rw-r--r--windows/threadswindow.hpp23
2 files changed, 67 insertions, 6 deletions
diff --git a/windows/threadswindow.cpp b/windows/threadswindow.cpp
index a772eeb..1bfb326 100644
--- a/windows/threadswindow.cpp
+++ b/windows/threadswindow.cpp
@@ -4,8 +4,10 @@
ThreadsWindow::ThreadsWindow(const ChannelData &channel)
: m_channel_id(channel.ID)
, m_box(Gtk::ORIENTATION_VERTICAL)
- , m_active(channel)
- , m_archived(channel) {
+ , m_active(channel, sigc::mem_fun(*this, &ThreadsWindow::ListFilterFunc))
+ , m_archived(channel, sigc::mem_fun(*this, &ThreadsWindow::ListFilterFunc))
+ , m_filter_public(m_group, "Public")
+ , m_filter_private(m_group, "Private") {
set_name("threads-window");
set_default_size(450, 375);
set_title("#" + *channel.Name + " - Threads");
@@ -27,27 +29,58 @@ ThreadsWindow::ThreadsWindow(const ChannelData &channel)
m_stack.add(m_active, "active", "Active Threads");
m_stack.add(m_archived, "archived", "Archived Threads");
+ m_filter_buttons.set_homogeneous(true);
+ m_filter_buttons.set_halign(Gtk::ALIGN_CENTER);
+ m_filter_buttons.add(m_filter_public);
+ m_filter_buttons.add(m_filter_private);
+
+ // a little strange
+ const auto btncb = [this](Gtk::RadioButton *btn) {
+ if (btn->get_active()) {
+ if (btn == &m_filter_public)
+ m_filter_mode = FILTER_PUBLIC;
+ else if (btn == &m_filter_private)
+ m_filter_mode = FILTER_PRIVATE;
+
+ m_active.InvalidateFilter();
+ m_archived.InvalidateFilter();
+ }
+ };
+ m_filter_public.signal_toggled().connect(sigc::bind(btncb, &m_filter_public));
+ m_filter_private.signal_toggled().connect(sigc::bind(btncb, &m_filter_private));
+
m_active.show();
m_archived.show();
m_switcher.show();
+ m_filter_buttons.show_all();
m_stack.show();
m_box.show();
m_box.add(m_switcher);
+ m_box.add(m_filter_buttons);
m_box.add(m_stack);
add(m_box);
}
+bool ThreadsWindow::ListFilterFunc(Gtk::ListBoxRow *row_) {
+ if (auto *row = dynamic_cast<ThreadListRow *>(row_))
+ return (m_filter_mode == FILTER_PUBLIC && (row->Type == ChannelType::GUILD_PUBLIC_THREAD || row->Type == ChannelType::GUILD_NEWS_THREAD)) ||
+ (m_filter_mode == FILTER_PRIVATE && row->Type == ChannelType::GUILD_PRIVATE_THREAD);
+ return false;
+}
+
ThreadListRow::ThreadListRow(const ChannelData &channel)
: ID(channel.ID)
+ , Type(channel.Type)
, m_label(*channel.Name, Gtk::ALIGN_START) {
m_label.show();
add(m_label);
}
-ActiveThreadsList::ActiveThreadsList(const ChannelData &channel) {
+ActiveThreadsList::ActiveThreadsList(const ChannelData &channel, const Gtk::ListBox::SlotFilter &filter) {
set_vexpand(true);
+ m_list.set_filter_func(filter);
m_list.set_selection_mode(Gtk::SELECTION_SINGLE);
m_list.set_hexpand(true);
m_list.show();
@@ -70,13 +103,18 @@ ActiveThreadsList::ActiveThreadsList(const ChannelData &channel) {
}
}
+void ActiveThreadsList::InvalidateFilter() {
+ m_list.invalidate_filter();
+}
+
ActiveThreadsList::type_signal_thread_open ActiveThreadsList::signal_thread_open() {
return m_signal_thread_open;
}
-ArchivedThreadsList::ArchivedThreadsList(const ChannelData &channel) {
+ArchivedThreadsList::ArchivedThreadsList(const ChannelData &channel, const Gtk::ListBox::SlotFilter &filter) {
set_vexpand(true);
+ m_list.set_filter_func(filter);
m_list.set_selection_mode(Gtk::SELECTION_SINGLE);
m_list.set_hexpand(true);
m_list.show();
@@ -94,6 +132,10 @@ ArchivedThreadsList::ArchivedThreadsList(const ChannelData &channel) {
Abaddon::Get().GetDiscordClient().GetArchivedPublicThreads(channel.ID, sigc::mem_fun(*this, &ArchivedThreadsList::OnPublicFetched));
}
+void ArchivedThreadsList::InvalidateFilter() {
+ m_list.invalidate_filter();
+}
+
void ArchivedThreadsList::OnPublicFetched(DiscordError code, const ArchivedThreadsResponseData &data) {
for (const auto &thread : data.Threads) {
auto row = Gtk::manage(new ThreadListRow(thread));
diff --git a/windows/threadswindow.hpp b/windows/threadswindow.hpp
index a0c77e8..28d9c7f 100644
--- a/windows/threadswindow.hpp
+++ b/windows/threadswindow.hpp
@@ -4,7 +4,9 @@
class ActiveThreadsList : public Gtk::ScrolledWindow {
public:
- ActiveThreadsList(const ChannelData &channel);
+ ActiveThreadsList(const ChannelData &channel, const Gtk::ListBox::SlotFilter &filter);
+
+ void InvalidateFilter();
private:
Gtk::ListBox m_list;
@@ -18,7 +20,9 @@ public:
class ArchivedThreadsList : public Gtk::ScrolledWindow {
public:
- ArchivedThreadsList(const ChannelData &channel);
+ ArchivedThreadsList(const ChannelData &channel, const Gtk::ListBox::SlotFilter &filter);
+
+ void InvalidateFilter();
private:
Gtk::ListBox m_list;
@@ -38,11 +42,25 @@ public:
ThreadsWindow(const ChannelData &channel);
private:
+ // this filtering is rather cringe but idk what a better alternative would be
+ bool ListFilterFunc(Gtk::ListBoxRow *row_);
+
+ enum FilterMode {
+ FILTER_PUBLIC = 0,
+ FILTER_PRIVATE = 1,
+ };
+ bool m_filter_mode = FILTER_PUBLIC;
+
Snowflake m_channel_id;
Gtk::StackSwitcher m_switcher;
Gtk::Stack m_stack;
+ Gtk::RadioButtonGroup m_group;
+ Gtk::ButtonBox m_filter_buttons;
+ Gtk::RadioButton m_filter_public;
+ Gtk::RadioButton m_filter_private;
+
Gtk::Box m_box;
ActiveThreadsList m_active;
@@ -54,6 +72,7 @@ public:
ThreadListRow(const ChannelData &channel);
Snowflake ID;
+ ChannelType Type;
private:
Gtk::Label m_label;