From 3e0cd83dd6026dc701c548dc40b41f5accbc29db Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 16 Oct 2023 21:31:28 -0400 Subject: start channel list refactor for server list --- .../channellist/classic/guildlistfolderitem.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/components/channellist/classic/guildlistfolderitem.cpp (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp new file mode 100644 index 0000000..36d5a5a --- /dev/null +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -0,0 +1,18 @@ +#include "guildlistfolderitem.hpp" + +GuildListFolderItem::GuildListFolderItem() { + m_revealer.add(m_box); + m_revealer.set_reveal_child(true); + + m_ev.signal_button_press_event().connect([this](GdkEventButton *event) -> bool { + if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_PRIMARY) { + m_revealer.set_reveal_child(!m_revealer.get_reveal_child()); + } + return false; + }); + + m_ev.add(m_image); + add(m_ev); + add(m_revealer); + show_all_children(); +} -- cgit v1.2.3 From 09cfa864be6e706fd2576eee60a285d5f4431b04 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Thu, 26 Oct 2023 01:20:10 -0400 Subject: create folders in guild list --- src/components/channellist/classic/guildlist.cpp | 55 +++++++++++++++++++--- src/components/channellist/classic/guildlist.hpp | 6 +++ .../channellist/classic/guildlistfolderitem.cpp | 7 +++ .../channellist/classic/guildlistfolderitem.hpp | 4 ++ 4 files changed, 66 insertions(+), 6 deletions(-) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlist.cpp b/src/components/channellist/classic/guildlist.cpp index 6c1fbc3..7a4b87c 100644 --- a/src/components/channellist/classic/guildlist.cpp +++ b/src/components/channellist/classic/guildlist.cpp @@ -12,15 +12,37 @@ void GuildList::UpdateListing() { Clear(); // does this function still even work ??lol - const auto ids = discord.GetUserSortedGuilds(); - for (const auto id : ids) { - AddGuild(id); + const auto folders = discord.GetUserSettings().GuildFolders; + const auto guild_ids = discord.GetUserSortedGuilds(); + + // same logic from ChannelListTree + + std::set foldered_guilds; + for (const auto &group : folders) { + foldered_guilds.insert(group.GuildIDs.begin(), group.GuildIDs.end()); + } + + for (auto iter = guild_ids.crbegin(); iter != guild_ids.crend(); iter++) { + if (foldered_guilds.find(*iter) == foldered_guilds.end()) { + AddGuild(*iter); + } + } + + for (const auto &group : folders) { + AddFolder(group); } } void GuildList::AddGuild(Snowflake id) { + if (auto item = CreateGuildWidget(id)) { + item->show(); + add(*item); + } +} + +GuildListGuildItem *GuildList::CreateGuildWidget(Snowflake id) { const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(id); - if (!guild.has_value()) return; + if (!guild.has_value()) return nullptr; auto *item = Gtk::make_managed(*guild); item->signal_button_press_event().connect([this, id](GdkEventButton *event) -> bool { @@ -29,8 +51,29 @@ void GuildList::AddGuild(Snowflake id) { } return true; }); - item->show(); - add(*item); + + return item; +} + +void GuildList::AddFolder(const UserSettingsGuildFoldersEntry &folder) { + // groups with no ID arent actually folders + if (!folder.ID.has_value()) { + if (!folder.GuildIDs.empty()) { + AddGuild(folder.GuildIDs[0]); + } + return; + } + + auto *folder_widget = Gtk::make_managed(); + for (const auto guild_id : folder.GuildIDs) { + if (auto *guild_widget = CreateGuildWidget(guild_id)) { + guild_widget->show(); + folder_widget->AddGuildWidget(guild_widget); + } + } + + folder_widget->show(); + add(*folder_widget); } void GuildList::Clear() { diff --git a/src/components/channellist/classic/guildlist.hpp b/src/components/channellist/classic/guildlist.hpp index 856cf4d..dc19102 100644 --- a/src/components/channellist/classic/guildlist.hpp +++ b/src/components/channellist/classic/guildlist.hpp @@ -1,6 +1,9 @@ #pragma once #include #include "discord/snowflake.hpp" +#include "discord/usersettings.hpp" + +class GuildListGuildItem; class GuildList : public Gtk::ListBox { public: @@ -10,8 +13,11 @@ public: private: void AddGuild(Snowflake id); + void AddFolder(const UserSettingsGuildFoldersEntry &folder); void Clear(); + GuildListGuildItem *CreateGuildWidget(Snowflake id); + public: using type_signal_guild_selected = sigc::signal; diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index 36d5a5a..aead848 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -1,9 +1,12 @@ #include "guildlistfolderitem.hpp" +#include "guildlistguilditem.hpp" GuildListFolderItem::GuildListFolderItem() { m_revealer.add(m_box); m_revealer.set_reveal_child(true); + m_image.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(48); + m_ev.signal_button_press_event().connect([this](GdkEventButton *event) -> bool { if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_PRIMARY) { m_revealer.set_reveal_child(!m_revealer.get_reveal_child()); @@ -16,3 +19,7 @@ GuildListFolderItem::GuildListFolderItem() { add(m_revealer); show_all_children(); } + +void GuildListFolderItem::AddGuildWidget(GuildListGuildItem *widget) { + m_box.add(*widget); +} diff --git a/src/components/channellist/classic/guildlistfolderitem.hpp b/src/components/channellist/classic/guildlistfolderitem.hpp index 3506969..4b7ba0a 100644 --- a/src/components/channellist/classic/guildlistfolderitem.hpp +++ b/src/components/channellist/classic/guildlistfolderitem.hpp @@ -6,10 +6,14 @@ #include "guildlistguilditem.hpp" +class GuildListGuildItem; + class GuildListFolderItem : public Gtk::VBox { public: GuildListFolderItem(); + void AddGuildWidget(GuildListGuildItem *widget); + private: Gtk::EventBox m_ev; Gtk::Image m_image; -- cgit v1.2.3 From 8bd628c1776c20dbf41d2fb18f6204c4a398da0e Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 3 Nov 2023 01:00:29 -0400 Subject: show guild icon previews as grid in folder button --- src/components/channellist/classic/guildlist.cpp | 2 +- .../channellist/classic/guildlistfolderitem.cpp | 53 ++++++++++++++++++++-- .../channellist/classic/guildlistfolderitem.hpp | 3 +- 3 files changed, 53 insertions(+), 5 deletions(-) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlist.cpp b/src/components/channellist/classic/guildlist.cpp index 7a4b87c..97741cf 100644 --- a/src/components/channellist/classic/guildlist.cpp +++ b/src/components/channellist/classic/guildlist.cpp @@ -64,7 +64,7 @@ void GuildList::AddFolder(const UserSettingsGuildFoldersEntry &folder) { return; } - auto *folder_widget = Gtk::make_managed(); + auto *folder_widget = Gtk::make_managed(folder); for (const auto guild_id : folder.GuildIDs) { if (auto *guild_widget = CreateGuildWidget(guild_id)) { guild_widget->show(); diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index aead848..acf1a2c 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -1,7 +1,46 @@ #include "guildlistfolderitem.hpp" #include "guildlistguilditem.hpp" -GuildListFolderItem::GuildListFolderItem() { +// doing my best to copy discord here + +const int FolderGridButtonSize = 48; +const int FolderGridImageSize = 24; + +class GuildListFolderButton : public Gtk::Grid { +public: + GuildListFolderButton() { + set_size_request(FolderGridButtonSize, FolderGridButtonSize); + } + + void SetGuilds(const std::vector &guild_ids) { + for (int y = 0; y < 2; y++) { + for (int x = 0; x < 2; x++) { + const size_t i = y * 2 + x; + auto &widget = m_images[x][y]; + widget.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(FolderGridImageSize); + attach(widget, x, y, 1, 1); + + if (i < guild_ids.size()) { + widget.show(); + + if (const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(guild_ids[i]); guild.has_value()) { + const auto cb = [&widget](const Glib::RefPtr &pb) { + widget.property_pixbuf() = pb->scale_simple(FolderGridImageSize, FolderGridImageSize, Gdk::INTERP_BILINEAR); + }; + Abaddon::Get().GetImageManager().LoadFromURL(guild->GetIconURL("png", "32"), sigc::track_obj(cb, *this)); + } + } + } + } + } + +private: + Gtk::Image m_images[2][2]; +}; + +GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &folder) { + get_style_context()->add_class("classic-guild-folder"); + m_revealer.add(m_box); m_revealer.set_reveal_child(true); @@ -14,10 +53,18 @@ GuildListFolderItem::GuildListFolderItem() { return false; }); - m_ev.add(m_image); + auto *btn = Gtk::make_managed(); + btn->SetGuilds(folder.GuildIDs); + m_ev.add(*btn); add(m_ev); add(m_revealer); - show_all_children(); + + btn->show(); + m_ev.show(); + m_revealer.show(); + m_box.show(); + m_image.show(); + show(); } void GuildListFolderItem::AddGuildWidget(GuildListGuildItem *widget) { diff --git a/src/components/channellist/classic/guildlistfolderitem.hpp b/src/components/channellist/classic/guildlistfolderitem.hpp index 4b7ba0a..460fd07 100644 --- a/src/components/channellist/classic/guildlistfolderitem.hpp +++ b/src/components/channellist/classic/guildlistfolderitem.hpp @@ -5,12 +5,13 @@ #include #include "guildlistguilditem.hpp" +#include "discord/usersettings.hpp" class GuildListGuildItem; class GuildListFolderItem : public Gtk::VBox { public: - GuildListFolderItem(); + GuildListFolderItem(const UserSettingsGuildFoldersEntry &folder); void AddGuildWidget(GuildListGuildItem *widget); -- cgit v1.2.3 From 6f8417525883acfb77af856f44aee26c1477ca91 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 8 Jan 2024 02:59:34 -0500 Subject: dont reveal folders by default --- src/components/channellist/classic/guildlistfolderitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index acf1a2c..b6e49f1 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -42,7 +42,7 @@ GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &fo get_style_context()->add_class("classic-guild-folder"); m_revealer.add(m_box); - m_revealer.set_reveal_child(true); + m_revealer.set_reveal_child(false); m_image.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(48); -- cgit v1.2.3 From 9131158cbbf5800dd103d5b5fbfff96384352c77 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 8 Jan 2024 20:53:40 -0500 Subject: add stack with icon and grid for classic listing folder icon --- .../channellist/classic/guildlistfolderitem.cpp | 71 +++++++++++++--------- .../channellist/classic/guildlistfolderitem.hpp | 13 ++++ src/settings.cpp | 1 + src/settings.hpp | 1 + 4 files changed, 56 insertions(+), 30 deletions(-) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index b6e49f1..e60bd5f 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -6,37 +6,31 @@ const int FolderGridButtonSize = 48; const int FolderGridImageSize = 24; -class GuildListFolderButton : public Gtk::Grid { -public: - GuildListFolderButton() { - set_size_request(FolderGridButtonSize, FolderGridButtonSize); - } +GuildListFolderButton::GuildListFolderButton() { + set_size_request(FolderGridButtonSize, FolderGridButtonSize); +} + +void GuildListFolderButton::SetGuilds(const std::vector &guild_ids) { + for (int y = 0; y < 2; y++) { + for (int x = 0; x < 2; x++) { + const size_t i = y * 2 + x; + auto &widget = m_images[x][y]; + widget.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(FolderGridImageSize); + attach(widget, x, y, 1, 1); - void SetGuilds(const std::vector &guild_ids) { - for (int y = 0; y < 2; y++) { - for (int x = 0; x < 2; x++) { - const size_t i = y * 2 + x; - auto &widget = m_images[x][y]; - widget.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(FolderGridImageSize); - attach(widget, x, y, 1, 1); - - if (i < guild_ids.size()) { - widget.show(); - - if (const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(guild_ids[i]); guild.has_value()) { - const auto cb = [&widget](const Glib::RefPtr &pb) { - widget.property_pixbuf() = pb->scale_simple(FolderGridImageSize, FolderGridImageSize, Gdk::INTERP_BILINEAR); - }; - Abaddon::Get().GetImageManager().LoadFromURL(guild->GetIconURL("png", "32"), sigc::track_obj(cb, *this)); - } + if (i < guild_ids.size()) { + widget.show(); + + if (const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(guild_ids[i]); guild.has_value()) { + const auto cb = [&widget](const Glib::RefPtr &pb) { + widget.property_pixbuf() = pb->scale_simple(FolderGridImageSize, FolderGridImageSize, Gdk::INTERP_BILINEAR); + }; + Abaddon::Get().GetImageManager().LoadFromURL(guild->GetIconURL("png", "32"), sigc::track_obj(cb, *this)); } } } } - -private: - Gtk::Image m_images[2][2]; -}; +} GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &folder) { get_style_context()->add_class("classic-guild-folder"); @@ -49,17 +43,34 @@ GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &fo m_ev.signal_button_press_event().connect([this](GdkEventButton *event) -> bool { if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_PRIMARY) { m_revealer.set_reveal_child(!m_revealer.get_reveal_child()); + if (!Abaddon::Get().GetSettings().FolderIconOnly) { + if (m_revealer.get_reveal_child()) { + m_stack.set_visible_child("icon", Gtk::STACK_TRANSITION_TYPE_SLIDE_DOWN); + } else { + m_stack.set_visible_child("grid", Gtk::STACK_TRANSITION_TYPE_SLIDE_UP); + } + } } + return false; }); - auto *btn = Gtk::make_managed(); - btn->SetGuilds(folder.GuildIDs); - m_ev.add(*btn); + m_grid.SetGuilds(folder.GuildIDs); + m_grid.show(); + + m_icon.property_icon_name() = "folder-symbolic"; + m_icon.property_icon_size() = Gtk::ICON_SIZE_DND; + m_icon.show(); + + m_stack.add(m_grid, "grid"); + m_stack.add(m_icon, "icon"); + m_stack.set_visible_child(Abaddon::Get().GetSettings().FolderIconOnly ? "icon" : "grid"); + m_stack.show(); + + m_ev.add(m_stack); add(m_ev); add(m_revealer); - btn->show(); m_ev.show(); m_revealer.show(); m_box.show(); diff --git a/src/components/channellist/classic/guildlistfolderitem.hpp b/src/components/channellist/classic/guildlistfolderitem.hpp index 460fd07..6a9fb50 100644 --- a/src/components/channellist/classic/guildlistfolderitem.hpp +++ b/src/components/channellist/classic/guildlistfolderitem.hpp @@ -9,6 +9,15 @@ class GuildListGuildItem; +class GuildListFolderButton : public Gtk::Grid { +public: + GuildListFolderButton(); + void SetGuilds(const std::vector &guild_ids); + +private: + Gtk::Image m_images[2][2]; +}; + class GuildListFolderItem : public Gtk::VBox { public: GuildListFolderItem(const UserSettingsGuildFoldersEntry &folder); @@ -16,6 +25,10 @@ public: void AddGuildWidget(GuildListGuildItem *widget); private: + Gtk::Stack m_stack; + GuildListFolderButton m_grid; + Gtk::Image m_icon; + Gtk::EventBox m_ev; Gtk::Image m_image; Gtk::Revealer m_revealer; diff --git a/src/settings.cpp b/src/settings.cpp index 23b2b89..6b051e7 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -96,6 +96,7 @@ void SettingsManager::DefineSettings() { AddSetting("gui", "hide_to_try", false, &Settings::HideToTray); AddSetting("gui", "show_deleted_indicator", true, &Settings::ShowDeletedIndicator); AddSetting("gui", "font_scale", -1.0, &Settings::FontScale); + AddSetting("gui", "folder_icon_only", false, &Settings::FolderIconOnly); AddSetting("http", "concurrent", 20, &Settings::CacheHTTPConcurrency); AddSetting("http", "user_agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"s, &Settings::UserAgent); diff --git a/src/settings.hpp b/src/settings.hpp index be9660e..e508270 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -28,6 +28,7 @@ public: bool HideToTray; bool ShowDeletedIndicator; double FontScale; + bool FolderIconOnly; // [http] int CacheHTTPConcurrency; -- cgit v1.2.3 From 781bdc5d7a72cacb9d0ce6e2893dcbba04088417 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 8 Jan 2024 21:27:53 -0500 Subject: add folder colors to symbol icon --- src/components/channellist/classic/guildlistfolderitem.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index e60bd5f..f79227b 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -60,6 +60,9 @@ GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &fo m_icon.property_icon_name() = "folder-symbolic"; m_icon.property_icon_size() = Gtk::ICON_SIZE_DND; + if (folder.Color.has_value()) { + m_icon.override_color(IntToRGBA(*folder.Color)); + } m_icon.show(); m_stack.add(m_grid, "grid"); -- cgit v1.2.3 From fe95335d1245152bb23c6787b5d55ea5874fd78a Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 9 Jan 2024 00:26:40 -0500 Subject: set folder name tooltip --- src/components/channellist/classic/guildlistfolderitem.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index f79227b..e79a5f7 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -35,6 +35,10 @@ void GuildListFolderButton::SetGuilds(const std::vector &guild_ids) { GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &folder) { get_style_context()->add_class("classic-guild-folder"); + if (folder.Name.has_value()) { + set_tooltip_text(*folder.Name); + } + m_revealer.add(m_box); m_revealer.set_reveal_child(false); -- cgit v1.2.3 From d1f6e1daa99e70ab3a9d583a0de286c97ab13413 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 19 Jan 2024 01:29:25 -0500 Subject: headers --- src/components/channellist/channellist.cpp | 2 ++ src/components/channellist/channellisttree.cpp | 6 +++++- src/components/channellist/classic/guildlist.cpp | 2 ++ src/components/channellist/classic/guildlistfolderitem.cpp | 3 +++ src/components/channellist/classic/guildlistfolderitem.hpp | 2 ++ src/components/channellist/classic/guildlistguilditem.cpp | 2 ++ src/components/channellist/classic/guildlistguilditem.hpp | 1 + 7 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/channellist.cpp b/src/components/channellist/channellist.cpp index 873de41..1cdf619 100644 --- a/src/components/channellist/channellist.cpp +++ b/src/components/channellist/channellist.cpp @@ -1,5 +1,7 @@ #include "channellist.hpp" +#include "abaddon.hpp" + ChannelList::ChannelList() { ConnectSignals(); diff --git a/src/components/channellist/channellisttree.cpp b/src/components/channellist/channellisttree.cpp index a509f21..8049f58 100644 --- a/src/components/channellist/channellisttree.cpp +++ b/src/components/channellist/channellisttree.cpp @@ -1,9 +1,13 @@ #include "channellisttree.hpp" -#include "imgmanager.hpp" + #include #include #include + +#include + #include "abaddon.hpp" +#include "imgmanager.hpp" #include "util.hpp" ChannelListTree::ChannelListTree() diff --git a/src/components/channellist/classic/guildlist.cpp b/src/components/channellist/classic/guildlist.cpp index 53ba1d7..ae613bf 100644 --- a/src/components/channellist/classic/guildlist.cpp +++ b/src/components/channellist/classic/guildlist.cpp @@ -1,4 +1,6 @@ #include "guildlist.hpp" + +#include "abaddon.hpp" #include "guildlistfolderitem.hpp" class GuildListDMsButton : public Gtk::EventBox { diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index e79a5f7..fea735c 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -1,5 +1,8 @@ #include "guildlistfolderitem.hpp" + +#include "abaddon.hpp" #include "guildlistguilditem.hpp" +#include "util.hpp" // doing my best to copy discord here diff --git a/src/components/channellist/classic/guildlistfolderitem.hpp b/src/components/channellist/classic/guildlistfolderitem.hpp index 6a9fb50..82a5a14 100644 --- a/src/components/channellist/classic/guildlistfolderitem.hpp +++ b/src/components/channellist/classic/guildlistfolderitem.hpp @@ -1,8 +1,10 @@ #pragma once #include #include +#include #include #include +#include #include "guildlistguilditem.hpp" #include "discord/usersettings.hpp" diff --git a/src/components/channellist/classic/guildlistguilditem.cpp b/src/components/channellist/classic/guildlistguilditem.cpp index 5cec281..c608dd9 100644 --- a/src/components/channellist/classic/guildlistguilditem.cpp +++ b/src/components/channellist/classic/guildlistguilditem.cpp @@ -1,5 +1,7 @@ #include "guildlistguilditem.hpp" +#include "abaddon.hpp" + GuildListGuildItem::GuildListGuildItem(const GuildData &guild) : ID(guild.ID) { m_image.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(48); diff --git a/src/components/channellist/classic/guildlistguilditem.hpp b/src/components/channellist/classic/guildlistguilditem.hpp index 3114a05..6bc0037 100644 --- a/src/components/channellist/classic/guildlistguilditem.hpp +++ b/src/components/channellist/classic/guildlistguilditem.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include "discord/guild.hpp" -- cgit v1.2.3 From dbfdd01b13af7394c0b6117e878728d0eac097c2 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Thu, 1 Feb 2024 21:08:17 -0500 Subject: add missing guild.HasIcon checks --- src/components/channellist/classic/guildlistfolderitem.cpp | 2 +- src/components/channellist/classic/guildlistguilditem.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index fea735c..2c8bc3b 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -24,7 +24,7 @@ void GuildListFolderButton::SetGuilds(const std::vector &guild_ids) { if (i < guild_ids.size()) { widget.show(); - if (const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(guild_ids[i]); guild.has_value()) { + if (const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(guild_ids[i]); guild.has_value() && guild->HasIcon()) { const auto cb = [&widget](const Glib::RefPtr &pb) { widget.property_pixbuf() = pb->scale_simple(FolderGridImageSize, FolderGridImageSize, Gdk::INTERP_BILINEAR); }; diff --git a/src/components/channellist/classic/guildlistguilditem.cpp b/src/components/channellist/classic/guildlistguilditem.cpp index c608dd9..2b26e73 100644 --- a/src/components/channellist/classic/guildlistguilditem.cpp +++ b/src/components/channellist/classic/guildlistguilditem.cpp @@ -15,7 +15,7 @@ GuildListGuildItem::GuildListGuildItem(const GuildData &guild) void GuildListGuildItem::UpdateIcon() { const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(ID); - if (!guild.has_value()) return; + if (!guild.has_value() || !guild->HasIcon()) return; Abaddon::Get().GetImageManager().LoadFromURL(guild->GetIconURL("png", "64"), sigc::mem_fun(*this, &GuildListGuildItem::OnIconFetched)); } -- cgit v1.2.3 From 473ff6f777ae3a8d1b3fa08a3ea15e2905340e03 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 19 Feb 2024 02:24:57 -0500 Subject: widget tweaking for styling --- src/components/channellist/classic/guildlist.cpp | 2 +- src/components/channellist/classic/guildlistfolderitem.cpp | 2 +- src/components/channellist/classic/guildlistguilditem.cpp | 6 +++++- src/components/channellist/classic/guildlistguilditem.hpp | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlist.cpp b/src/components/channellist/classic/guildlist.cpp index 9c634f7..d756c6f 100644 --- a/src/components/channellist/classic/guildlist.cpp +++ b/src/components/channellist/classic/guildlist.cpp @@ -23,7 +23,7 @@ GuildList::GuildList() , 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"); + get_style_context()->add_class("classic-guild-list"); set_selection_mode(Gtk::SELECTION_NONE); show_all_children(); diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index 2c8bc3b..30e1adb 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -36,7 +36,7 @@ void GuildListFolderButton::SetGuilds(const std::vector &guild_ids) { } GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &folder) { - get_style_context()->add_class("classic-guild-folder"); + get_style_context()->add_class("classic-guild-list-folder"); if (folder.Name.has_value()) { set_tooltip_text(*folder.Name); diff --git a/src/components/channellist/classic/guildlistguilditem.cpp b/src/components/channellist/classic/guildlistguilditem.cpp index 2b26e73..ee6b35a 100644 --- a/src/components/channellist/classic/guildlistguilditem.cpp +++ b/src/components/channellist/classic/guildlistguilditem.cpp @@ -4,8 +4,12 @@ GuildListGuildItem::GuildListGuildItem(const GuildData &guild) : ID(guild.ID) { + get_style_context()->add_class("classic-guild-list-guild"); + m_image.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(48); - add(m_image); + + add(m_box); + m_box.pack_start(m_image); show_all_children(); set_tooltip_text(guild.Name); diff --git a/src/components/channellist/classic/guildlistguilditem.hpp b/src/components/channellist/classic/guildlistguilditem.hpp index 6bc0037..e5504f6 100644 --- a/src/components/channellist/classic/guildlistguilditem.hpp +++ b/src/components/channellist/classic/guildlistguilditem.hpp @@ -14,5 +14,6 @@ private: void UpdateIcon(); void OnIconFetched(const Glib::RefPtr &pb); + Gtk::Box m_box; Gtk::Image m_image; }; -- cgit v1.2.3 From bab713baf557de427a1f93cc377d2fe79561731d Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 6 Mar 2024 01:19:55 -0500 Subject: folder unread indicators --- .../channellist/classic/guildlistfolderitem.cpp | 36 ++++++++++++++++++++++ .../channellist/classic/guildlistfolderitem.hpp | 6 ++++ 2 files changed, 42 insertions(+) (limited to 'src/components/channellist/classic/guildlistfolderitem.cpp') diff --git a/src/components/channellist/classic/guildlistfolderitem.cpp b/src/components/channellist/classic/guildlistfolderitem.cpp index 30e1adb..e062d42 100644 --- a/src/components/channellist/classic/guildlistfolderitem.cpp +++ b/src/components/channellist/classic/guildlistfolderitem.cpp @@ -36,6 +36,8 @@ void GuildListFolderButton::SetGuilds(const std::vector &guild_ids) { } GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &folder) { + m_guild_ids = folder.GuildIDs; + get_style_context()->add_class("classic-guild-list-folder"); if (folder.Name.has_value()) { @@ -86,8 +88,42 @@ GuildListFolderItem::GuildListFolderItem(const UserSettingsGuildFoldersEntry &fo m_box.show(); m_image.show(); show(); + + Abaddon::Get().GetDiscordClient().signal_message_create().connect(sigc::mem_fun(*this, &GuildListFolderItem::OnMessageCreate)); + Abaddon::Get().GetDiscordClient().signal_message_ack().connect(sigc::mem_fun(*this, &GuildListFolderItem::OnMessageAck)); + + CheckUnreadStatus(); } void GuildListFolderItem::AddGuildWidget(GuildListGuildItem *widget) { m_box.add(*widget); } + +void GuildListFolderItem::OnMessageCreate(const Message &msg) { + if (msg.GuildID.has_value() && std::find(m_guild_ids.begin(), m_guild_ids.end(), *msg.GuildID) != m_guild_ids.end()) CheckUnreadStatus(); +} + +void GuildListFolderItem::OnMessageAck(const MessageAckData &data) { + CheckUnreadStatus(); +} + +void GuildListFolderItem::CheckUnreadStatus() { + auto &discord = Abaddon::Get().GetDiscordClient(); + if (!Abaddon::Get().GetSettings().Unreads) return; + + bool has_any_unreads = false; + + for (auto guild_id : m_guild_ids) { + int mentions; + if (!discord.IsGuildMuted(guild_id) && discord.GetUnreadStateForGuild(guild_id, mentions)) { + has_any_unreads = true; + break; + } + } + + if (has_any_unreads) { + get_style_context()->add_class("has-unread"); + } else { + get_style_context()->remove_class("has-unread"); + } +} diff --git a/src/components/channellist/classic/guildlistfolderitem.hpp b/src/components/channellist/classic/guildlistfolderitem.hpp index 82a5a14..e5772c0 100644 --- a/src/components/channellist/classic/guildlistfolderitem.hpp +++ b/src/components/channellist/classic/guildlistfolderitem.hpp @@ -27,6 +27,12 @@ public: void AddGuildWidget(GuildListGuildItem *widget); private: + void OnMessageCreate(const Message &msg); + void OnMessageAck(const MessageAckData &data); + void CheckUnreadStatus(); + + std::vector m_guild_ids; + Gtk::Stack m_stack; GuildListFolderButton m_grid; Gtk::Image m_icon; -- cgit v1.2.3