diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-12-10 00:15:39 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-12-10 00:15:39 -0500 |
commit | 0b0135268ec4684dfcdc0a5ae5c8da947bb17e12 (patch) | |
tree | 0128352b9c5fa8e0838531ffa87c64e68cc3f487 | |
parent | 511fb445d15e379d4dd3b7fd137a249c960cf84d (diff) | |
download | abaddon-portaudio-0b0135268ec4684dfcdc0a5ae5c8da947bb17e12.tar.gz abaddon-portaudio-0b0135268ec4684dfcdc0a5ae5c8da947bb17e12.zip |
basic channel mentions count indicator
-rw-r--r-- | src/components/channels.cpp | 8 | ||||
-rw-r--r-- | src/components/channels.hpp | 4 | ||||
-rw-r--r-- | src/components/channelscellrenderer.cpp | 4 | ||||
-rw-r--r-- | src/components/unreadrenderer.cpp | 43 | ||||
-rw-r--r-- | src/components/unreadrenderer.hpp | 5 | ||||
-rw-r--r-- | src/discord/discord.cpp | 7 | ||||
-rw-r--r-- | src/discord/message.cpp | 6 | ||||
-rw-r--r-- | src/discord/message.hpp | 2 | ||||
-rw-r--r-- | src/windows/mainwindow.cpp | 1 |
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); |