summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-12-10 00:15:39 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-12-10 00:15:39 -0500
commit0b0135268ec4684dfcdc0a5ae5c8da947bb17e12 (patch)
tree0128352b9c5fa8e0838531ffa87c64e68cc3f487 /src
parent511fb445d15e379d4dd3b7fd137a249c960cf84d (diff)
downloadabaddon-portaudio-0b0135268ec4684dfcdc0a5ae5c8da947bb17e12.tar.gz
abaddon-portaudio-0b0135268ec4684dfcdc0a5ae5c8da947bb17e12.zip
basic channel mentions count indicator
Diffstat (limited to 'src')
-rw-r--r--src/components/channels.cpp8
-rw-r--r--src/components/channels.hpp4
-rw-r--r--src/components/channelscellrenderer.cpp4
-rw-r--r--src/components/unreadrenderer.cpp43
-rw-r--r--src/components/unreadrenderer.hpp5
-rw-r--r--src/discord/discord.cpp7
-rw-r--r--src/discord/message.cpp6
-rw-r--r--src/discord/message.hpp2
-rw-r--r--src/windows/mainwindow.cpp1
9 files changed, 63 insertions, 17 deletions
diff --git a/src/components/channels.cpp b/src/components/channels.cpp
index d8fbde9..c83b5f8 100644
--- a/src/components/channels.cpp
+++ b/src/components/channels.cpp
@@ -176,6 +176,14 @@ ChannelList::ChannelList()
discord.signal_message_ack().connect(sigc::mem_fun(*this, &ChannelList::OnMessageAck));
}
+void ChannelList::UsePanedHack(Gtk::Paned& paned) {
+ paned.property_position().signal_changed().connect(sigc::mem_fun(*this, &ChannelList::OnPanedPositionChanged));
+}
+
+void ChannelList::OnPanedPositionChanged() {
+ m_view.queue_draw();
+}
+
void ChannelList::UpdateListing() {
m_updating_listing = true;
diff --git a/src/components/channels.hpp b/src/components/channels.hpp
index d279907..2f4d045 100644
--- a/src/components/channels.hpp
+++ b/src/components/channels.hpp
@@ -25,7 +25,11 @@ public:
void UseExpansionState(const ExpansionStateRoot &state);
ExpansionStateRoot GetExpansionState() const;
+ void UsePanedHack(Gtk::Paned &paned);
+
protected:
+ void OnPanedPositionChanged();
+
void UpdateNewGuild(const GuildData &guild);
void UpdateRemoveGuild(Snowflake id);
void UpdateRemoveChannel(Snowflake id);
diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp
index a96668c..f507802 100644
--- a/src/components/channelscellrenderer.cpp
+++ b/src/components/channelscellrenderer.cpp
@@ -240,7 +240,7 @@ void CellRendererChannels::render_vfunc_guild(const Cairo::RefPtr<Cairo::Context
cr->fill();
}
- UnreadRenderer::RenderUnreadOnGuild(m_property_id.get_value(), cr, background_area, cell_area);
+ UnreadRenderer::RenderUnreadOnGuild(m_property_id.get_value(), widget, cr, background_area, cell_area);
}
// category
@@ -337,7 +337,7 @@ void CellRendererChannels::render_vfunc_channel(const Cairo::RefPtr<Cairo::Conte
// so unset it
m_renderer_text.property_foreground_set() = false;
- UnreadRenderer::RenderUnreadOnChannel(m_property_id.get_value(), cr, background_area, cell_area);
+ UnreadRenderer::RenderUnreadOnChannel(m_property_id.get_value(), widget, cr, background_area, cell_area);
}
// thread
diff --git a/src/components/unreadrenderer.cpp b/src/components/unreadrenderer.cpp
index b53af2d..af0363e 100644
--- a/src/components/unreadrenderer.cpp
+++ b/src/components/unreadrenderer.cpp
@@ -1,7 +1,7 @@
#include "unreadrenderer.hpp"
#include "abaddon.hpp"
-void UnreadRenderer::RenderUnreadOnGuild(Snowflake id, const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area) {
+void UnreadRenderer::RenderUnreadOnGuild(Snowflake id, Gtk::Widget &widget, const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area) {
// maybe have DiscordClient track this?
auto &discord = Abaddon::Get().GetDiscordClient();
const auto channels = discord.GetChannelsInGuild(id);
@@ -23,15 +23,38 @@ void UnreadRenderer::RenderUnreadOnGuild(Snowflake id, const Cairo::RefPtr<Cairo
cr->fill();
}
-void UnreadRenderer::RenderUnreadOnChannel(Snowflake id, const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area) {
+void UnreadRenderer::RenderUnreadOnChannel(Snowflake id, Gtk::Widget &widget, const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area) {
const auto state = Abaddon::Get().GetDiscordClient().GetUnreadStateForChannel(id);
- if (state >= 0) {
- cr->set_source_rgb(1.0, 1.0, 1.0);
- const auto x = background_area.get_x();
- const auto y = background_area.get_y();
- const auto w = background_area.get_width();
- const auto h = background_area.get_height();
- cr->rectangle(x, y, 3, h);
- cr->fill();
+ if (state < 0) return;
+ cr->set_source_rgb(1.0, 1.0, 1.0);
+ const auto x = background_area.get_x();
+ const auto y = background_area.get_y();
+ const auto w = background_area.get_width();
+ const auto h = background_area.get_height();
+ cr->rectangle(x, y, 3, h);
+ cr->fill();
+
+ if (state < 1) return;
+ auto *paned = static_cast<Gtk::Paned *>(widget.get_ancestor(Gtk::Paned::get_type()));
+ const auto edge = paned->get_position();
+
+ // surely this shouldnt be run every draw?
+ // https://developer-old.gnome.org/gtkmm-tutorial/3.22/sec-drawing-text.html.en
+
+ Pango::FontDescription font;
+ font.set_family("sans 14");
+ font.set_weight(Pango::WEIGHT_BOLD);
+
+ auto layout = widget.create_pango_layout(std::to_string(state));
+ layout->set_font_description(font);
+ layout->set_alignment(Pango::ALIGN_RIGHT);
+
+ int width, height;
+ layout->get_pixel_size(width, height);
+ {
+ const auto x = cell_area.get_x() + std::min(edge, cell_area.get_width()) - 14 - 2;
+ const auto y = cell_area.get_y() + cell_area.get_height() / 2.0 - height / 2.0;
+ cr->move_to(x, y);
+ layout->show_in_cairo_context(cr);
}
}
diff --git a/src/components/unreadrenderer.hpp b/src/components/unreadrenderer.hpp
index 30446fa..1b4ddc2 100644
--- a/src/components/unreadrenderer.hpp
+++ b/src/components/unreadrenderer.hpp
@@ -1,10 +1,11 @@
#pragma once
#include <cairomm/context.h>
#include <gdkmm/rectangle.h>
+#include <gtkmm/widget.h>
#include "discord/snowflake.hpp"
class UnreadRenderer {
public:
- static void RenderUnreadOnGuild(Snowflake id, const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area);
- static void RenderUnreadOnChannel(Snowflake id, const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area);
+ static void RenderUnreadOnGuild(Snowflake id, Gtk::Widget &widget, const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area);
+ static void RenderUnreadOnChannel(Snowflake id, Gtk::Widget &widget, const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area);
};
diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp
index a8ceb5b..f21946f 100644
--- a/src/discord/discord.cpp
+++ b/src/discord/discord.cpp
@@ -1467,9 +1467,10 @@ void DiscordClient::HandleGatewayMessageCreate(const GatewayMessage &msg) {
if (data.GuildID.has_value())
AddUserToGuild(data.Author.ID, *data.GuildID);
m_last_message_id[data.ChannelID] = data.ID;
- const auto iter = m_unread.find(data.ChannelID);
- if (iter == m_unread.end())
- m_unread[data.ChannelID] = 0;
+ m_unread[data.ChannelID];
+ if (data.DoesMention(GetUserData().ID)) {
+ m_unread[data.ChannelID]++;
+ }
m_signal_message_create.emit(data);
}
diff --git a/src/discord/message.cpp b/src/discord/message.cpp
index 70c557d..93d57c2 100644
--- a/src/discord/message.cpp
+++ b/src/discord/message.cpp
@@ -263,3 +263,9 @@ bool Message::IsDeleted() const {
bool Message::IsEdited() const {
return m_edited;
}
+
+bool Message::DoesMention(Snowflake id) const noexcept {
+ return std::any_of(Mentions.begin(), Mentions.end(), [id](const UserData &user) {
+ return user.ID == id;
+ });
+}
diff --git a/src/discord/message.hpp b/src/discord/message.hpp
index 56f4c0f..244b572 100644
--- a/src/discord/message.hpp
+++ b/src/discord/message.hpp
@@ -212,6 +212,8 @@ struct Message {
bool IsDeleted() const;
bool IsEdited() const;
+ bool DoesMention(Snowflake id) const noexcept;
+
private:
bool m_deleted = false;
bool m_edited = false;
diff --git a/src/windows/mainwindow.cpp b/src/windows/mainwindow.cpp
index 3fc0b0d..d171a03 100644
--- a/src/windows/mainwindow.cpp
+++ b/src/windows/mainwindow.cpp
@@ -153,6 +153,7 @@ MainWindow::MainWindow()
m_chan_content_paned.set_position(200);
m_chan_content_paned.show();
m_content_box.add(m_chan_content_paned);
+ m_channel_list.UsePanedHack(m_chan_content_paned);
m_content_members_paned.pack1(m_content_stack);
m_content_members_paned.pack2(*member_list);