1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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;
}
|