diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-12-25 03:02:40 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-12-25 03:02:40 -0500 |
commit | c861b9b7500ae96b3655bca207a5507405c76f16 (patch) | |
tree | fd3df565c3dd00f7c066823b27c67055fae57b29 /components | |
parent | dbd8564af7258dd41e7d3ba73d55fa7c7a1b822c (diff) | |
download | abaddon-portaudio-c861b9b7500ae96b3655bca207a5507405c76f16.tar.gz abaddon-portaudio-c861b9b7500ae96b3655bca207a5507405c76f16.zip |
make animated avatars work slightly better
Diffstat (limited to 'components')
-rw-r--r-- | components/chatmessage.cpp | 80 | ||||
-rw-r--r-- | components/chatmessage.hpp | 5 |
2 files changed, 32 insertions, 53 deletions
diff --git a/components/chatmessage.cpp b/components/chatmessage.cpp index a0556d0..8b50a48 100644 --- a/components/chatmessage.cpp +++ b/components/chatmessage.cpp @@ -884,14 +884,6 @@ ChatMessageItemContainer::type_signal_action_reaction_remove ChatMessageItemCont return m_signal_action_reaction_remove; } -ChatMessageItemContainer::type_signal_enter ChatMessageItemContainer::signal_enter() { - return m_signal_enter; -} - -ChatMessageItemContainer::type_signal_leave ChatMessageItemContainer::signal_leave() { - return m_signal_leave; -} - ChatMessageItemContainer::type_signal_image_load ChatMessageItemContainer::signal_image_load() { return m_signal_image_load; } @@ -906,18 +898,6 @@ void ChatMessageItemContainer::AttachEventHandlers(Gtk::Widget *widget) { return false; }; widget->signal_button_press_event().connect(on_button_press_event, false); - - widget->add_events(Gdk::ENTER_NOTIFY_MASK | Gdk::LEAVE_NOTIFY_MASK); - const auto on_notify_crossing = [this](GdkEventCrossing *event) -> bool { - if (event->type == GDK_ENTER_NOTIFY) - m_signal_enter.emit(); - else if (event->type == GDK_LEAVE_NOTIFY) - m_signal_leave.emit(); - - return false; - }; - widget->signal_enter_notify_event().connect(on_notify_crossing); - widget->signal_leave_notify_event().connect(on_notify_crossing); } ChatMessageHeader::ChatMessageHeader(const Message *data) { @@ -926,6 +906,7 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) { m_main_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); m_content_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + m_content_box_ev = Gtk::manage(new Gtk::EventBox); m_meta_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); m_meta_ev = Gtk::manage(new Gtk::EventBox); m_author = Gtk::manage(new Gtk::Label); @@ -935,22 +916,12 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) { const auto author = Abaddon::Get().GetDiscordClient().GetUser(UserID); auto &img = Abaddon::Get().GetImageManager(); - auto static_buf = img.GetFromURLIfCached(author->GetAvatarURL()); - auto anim_buf = img.GetAnimationFromURLIfCached(author->GetAvatarURL("gif"), AvatarSize, AvatarSize); - - if (anim_buf) - m_anim_avatar = anim_buf; + m_avatar = Gtk::manage(new Gtk::Image(img.GetPlaceholder(AvatarSize))); + if (author->HasAvatar()) + img.LoadFromURL(author->GetAvatarURL(), sigc::mem_fun(*this, &ChatMessageHeader::OnAvatarLoad)); - if (static_buf) { - m_static_avatar = static_buf; - m_avatar = Gtk::manage(new Gtk::Image(static_buf)); - } else { - m_avatar = Gtk::manage(new Gtk::Image(img.GetPlaceholder(AvatarSize))); - if (author.has_value()) { - img.LoadFromURL(author->GetAvatarURL(), sigc::mem_fun(*this, &ChatMessageHeader::OnAvatarLoad)); - img.LoadAnimationFromURL(author->GetAvatarURL("gif"), AvatarSize, AvatarSize, sigc::mem_fun(*this, &ChatMessageHeader::OnAnimatedAvatarLoad)); - } - } + if (author->HasAnimatedAvatar()) + img.LoadAnimationFromURL(author->GetAvatarURL("gif"), AvatarSize, AvatarSize, sigc::mem_fun(*this, &ChatMessageHeader::OnAnimatedAvatarLoad)); get_style_context()->add_class("message-container"); m_author->get_style_context()->add_class("message-container-author"); @@ -996,6 +967,29 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) { m_content_box->set_can_focus(false); + const auto on_enter_cb = [this](const GdkEventCrossing *event) -> bool { + if (m_anim_avatar) + m_avatar->property_pixbuf_animation() = m_anim_avatar; + return false; + }; + const auto on_leave_cb = [this](const GdkEventCrossing *event) -> bool { + if (m_anim_avatar) + m_avatar->property_pixbuf() = m_static_avatar; + return false; + }; + + m_content_box_ev->add_events(Gdk::ENTER_NOTIFY_MASK | Gdk::LEAVE_NOTIFY_MASK); + m_meta_ev->add_events(Gdk::ENTER_NOTIFY_MASK | Gdk::LEAVE_NOTIFY_MASK); + m_avatar_ev->add_events(Gdk::ENTER_NOTIFY_MASK | Gdk::LEAVE_NOTIFY_MASK); + if (Abaddon::Get().GetSettings().GetShowAnimations()) { + m_content_box_ev->signal_enter_notify_event().connect(on_enter_cb); + m_content_box_ev->signal_leave_notify_event().connect(on_leave_cb); + m_meta_ev->signal_enter_notify_event().connect(on_enter_cb); + m_meta_ev->signal_leave_notify_event().connect(on_leave_cb); + m_avatar_ev->signal_enter_notify_event().connect(on_enter_cb); + m_avatar_ev->signal_leave_notify_event().connect(on_leave_cb); + } + m_meta_box->add(*m_author); if (m_extra != nullptr) m_meta_box->add(*m_extra); @@ -1005,7 +999,8 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) { m_content_box->add(*m_meta_ev); m_avatar_ev->add(*m_avatar); m_main_box->add(*m_avatar_ev); - m_main_box->add(*m_content_box); + m_content_box_ev->add(*m_content_box); + m_main_box->add(*m_content_box_ev); add(*m_main_box); set_margin_bottom(8); @@ -1072,19 +1067,6 @@ ChatMessageHeader::type_signal_action_open_user_menu ChatMessageHeader::signal_a } void ChatMessageHeader::AddContent(Gtk::Widget *widget, bool prepend) { - if (Abaddon::Get().GetSettings().GetShowAnimations()) { - auto *container = dynamic_cast<ChatMessageItemContainer *>(widget); - if (container != nullptr) { - container->signal_enter().connect([this] { - if (m_anim_avatar) - m_avatar->property_pixbuf_animation() = m_anim_avatar; - }); - container->signal_leave().connect([this] { - if (m_anim_avatar) // if there is no anim avatar then it would have never switched off - m_avatar->property_pixbuf() = m_static_avatar; - }); - } - } m_content_box->add(*widget); if (prepend) m_content_box->reorder_child(*widget, 1); diff --git a/components/chatmessage.hpp b/components/chatmessage.hpp index 7ba85bc..209fd31 100644 --- a/components/chatmessage.hpp +++ b/components/chatmessage.hpp @@ -96,8 +96,6 @@ public: type_signal_channel_click signal_action_channel_click(); type_signal_action_reaction_add signal_action_reaction_add(); type_signal_action_reaction_remove signal_action_reaction_remove(); - type_signal_enter signal_enter(); - type_signal_leave signal_leave(); type_signal_image_load signal_image_load(); @@ -107,8 +105,6 @@ private: type_signal_channel_click m_signal_action_channel_click; type_signal_action_reaction_add m_signal_action_reaction_add; type_signal_action_reaction_remove m_signal_action_reaction_remove; - type_signal_enter m_signal_enter; - type_signal_leave m_signal_leave; type_signal_image_load m_signal_image_load; }; @@ -132,6 +128,7 @@ protected: Gtk::Box *m_main_box; Gtk::Box *m_content_box; + Gtk::EventBox *m_content_box_ev; Gtk::Box *m_meta_box; Gtk::EventBox *m_meta_ev; Gtk::Label *m_author; |