diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2024-05-21 02:06:20 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2024-05-21 02:06:20 -0400 |
commit | 057dd2a1f8de65e4885f48211e324e1b966f4e2f (patch) | |
tree | 3c6d44061589b636ac9624a988baae969a1c6b80 /src/components/channellist/classic/mentionoverlay.cpp | |
parent | a4856a5378507bc5d32c86d638a7175c29bf4301 (diff) | |
download | abaddon-portaudio-057dd2a1f8de65e4885f48211e324e1b966f4e2f.tar.gz abaddon-portaudio-057dd2a1f8de65e4885f48211e324e1b966f4e2f.zip |
add ugly little mention indicator to classic guild listing
Diffstat (limited to 'src/components/channellist/classic/mentionoverlay.cpp')
-rw-r--r-- | src/components/channellist/classic/mentionoverlay.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/components/channellist/classic/mentionoverlay.cpp b/src/components/channellist/classic/mentionoverlay.cpp new file mode 100644 index 0000000..c734ced --- /dev/null +++ b/src/components/channellist/classic/mentionoverlay.cpp @@ -0,0 +1,62 @@ +#include "mentionoverlay.hpp" + +#include "misc/cairo.hpp" + +#include "abaddon.hpp" + +MentionOverlay::MentionOverlay(Snowflake guild_id) + : m_guild_id(guild_id) { + m_font.set_family("sans 14"); + m_layout = create_pango_layout("12"); + m_layout->set_font_description(m_font); + m_layout->set_alignment(Pango::ALIGN_RIGHT); + + get_style_context()->add_class("classic-mention-overlay"); // fuck you + + set_hexpand(false); + set_vexpand(false); + + signal_draw().connect(sigc::mem_fun(*this, &MentionOverlay::OnDraw)); + + Abaddon::Get().GetDiscordClient().signal_message_ack().connect([this](const MessageAckData &data) { + // fetching and checking guild id is probably more expensive than just forcing a redraw anyways + queue_draw(); + }); + + Abaddon::Get().GetDiscordClient().signal_message_create().connect([this](const Message &msg) { + if (msg.GuildID.has_value() && *msg.GuildID != m_guild_id) return; + if (!msg.DoesMentionEveryone && msg.Mentions.empty() && msg.MentionRoles.empty()) return; + queue_draw(); + }); +} + +bool MentionOverlay::OnDraw(const Cairo::RefPtr<Cairo::Context> &cr) { + int mentions; + Abaddon::Get().GetDiscordClient().GetUnreadStateForGuild(m_guild_id, mentions); + if (mentions == 0) return true; + m_layout->set_text(std::to_string(mentions)); + + const int width = get_allocated_width(); + const int height = get_allocated_height(); + + int lw, lh; + m_layout->get_pixel_size(lw, lh); + { + static const auto badge_setting = Gdk::RGBA(Abaddon::Get().GetSettings().MentionBadgeColor); + static const auto text_setting = Gdk::RGBA(Abaddon::Get().GetSettings().MentionBadgeTextColor); + + auto bg = badge_setting.get_alpha_u() > 0 ? badge_setting : get_style_context()->get_background_color(Gtk::STATE_FLAG_SELECTED); + auto text = text_setting.get_alpha_u() > 0 ? text_setting : get_style_context()->get_color(Gtk::STATE_FLAG_SELECTED); + + const auto x = width - lw - 5; + const auto y = height - lh - 1; + CairoUtil::PathRoundedRect(cr, x - 4, y + 2, lw + 8, lh, 5); + cr->set_source_rgb(bg.get_red(), bg.get_green(), bg.get_blue()); + cr->fill(); + cr->set_source_rgb(text.get_red(), text.get_green(), text.get_blue()); + cr->move_to(x, y); + m_layout->show_in_cairo_context(cr); + } + + return true; +} |