Skip to content
Snippets Groups Projects
Commit d64d88ee authored by Nicolas Jager's avatar Nicolas Jager Committed by Sébastien Blin
Browse files

add visual notification for unread messages


Change-Id: If9a5f9953711bef705bbe0951b6a6c3a2e59879b
Reviewed-by: default avatarSébastien Blin <sebastien.blin@savoirfairelinux.com>
parent 8dcd2542
No related branches found
No related tags found
No related merge requests found
...@@ -87,14 +87,14 @@ render_contact_photo(G_GNUC_UNUSED GtkTreeViewColumn *tree_column, ...@@ -87,14 +87,14 @@ render_contact_photo(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
{ {
// Draw first contact. // Draw first contact.
// NOTE: We just draw the first contact, must change this for conferences when they will have their own object // NOTE: We just draw the first contact, must change this for conferences when they will have their own object
auto conversation = priv->accountContainer_->info.conversationModel->filteredConversation(row); auto conversationInfo = priv->accountContainer_->info.conversationModel->filteredConversation(row);
auto contact = priv->accountContainer_->info.contactModel->getContact(conversation.participants.front()); auto contactInfo = priv->accountContainer_->info.contactModel->getContact(conversationInfo.participants.front());
std::shared_ptr<GdkPixbuf> image; std::shared_ptr<GdkPixbuf> image;
auto var_photo = GlobalInstances::pixmapManipulator().conversationPhoto( auto var_photo = GlobalInstances::pixmapManipulator().conversationPhoto(
conversation, conversationInfo,
priv->accountContainer_->info, priv->accountContainer_->info,
QSize(50, 50), QSize(50, 50),
contact.isPresent contactInfo.isPresent
); );
image = var_photo.value<std::shared_ptr<GdkPixbuf>>(); image = var_photo.value<std::shared_ptr<GdkPixbuf>>();
......
...@@ -122,7 +122,11 @@ PixbufManipulator::generateAvatar(const std::string& alias, const std::string& u ...@@ -122,7 +122,11 @@ PixbufManipulator::generateAvatar(const std::string& alias, const std::string& u
} }
std::shared_ptr<GdkPixbuf> std::shared_ptr<GdkPixbuf>
PixbufManipulator::scaleAndFrame(const GdkPixbuf *photo, const QSize& size, bool display_presence, bool is_present) PixbufManipulator::scaleAndFrame(const GdkPixbuf *photo,
const QSize& size,
bool display_presence,
bool is_present,
uint unreadMessages)
{ {
/** /**
* for now, respect the height requested * for now, respect the height requested
...@@ -158,6 +162,10 @@ PixbufManipulator::scaleAndFrame(const GdkPixbuf *photo, const QSize& size, bool ...@@ -158,6 +162,10 @@ PixbufManipulator::scaleAndFrame(const GdkPixbuf *photo, const QSize& size, bool
if (display_presence) if (display_presence)
result.reset(ring_draw_presence(result.get(), is_present), g_object_unref); result.reset(ring_draw_presence(result.get(), is_present), g_object_unref);
/* draw visual notification for unread messages */
if (unreadMessages)
result.reset(ring_draw_unread_messages(result.get(), unreadMessages), g_object_unref);
return result; return result;
} }
...@@ -255,12 +263,12 @@ QVariant PixbufManipulator::personPhoto(const QByteArray& data, const QString& t ...@@ -255,12 +263,12 @@ QVariant PixbufManipulator::personPhoto(const QByteArray& data, const QString& t
} }
QVariant QVariant
PixbufManipulator::conversationPhoto(const lrc::api::conversation::Info& conversation, PixbufManipulator::conversationPhoto(const lrc::api::conversation::Info& conversationInfo,
const lrc::api::account::Info& accountInfo, const lrc::api::account::Info& accountInfo,
const QSize& size, const QSize& size,
bool displayPresence) bool displayPresence)
{ {
auto contacts = conversation.participants; auto contacts = conversationInfo.participants;
if (!contacts.empty()) if (!contacts.empty())
{ {
// Get first contact photo // Get first contact photo
...@@ -268,16 +276,17 @@ PixbufManipulator::conversationPhoto(const lrc::api::conversation::Info& convers ...@@ -268,16 +276,17 @@ PixbufManipulator::conversationPhoto(const lrc::api::conversation::Info& convers
auto contactInfo = accountInfo.contactModel->getContact(contactUri); auto contactInfo = accountInfo.contactModel->getContact(contactUri);
auto contactPhoto = contactInfo.profileInfo.avatar; auto contactPhoto = contactInfo.profileInfo.avatar;
auto bestName = contactInfo.profileInfo.alias.empty()? contactInfo.registeredName : contactInfo.profileInfo.alias; auto bestName = contactInfo.profileInfo.alias.empty()? contactInfo.registeredName : contactInfo.profileInfo.alias;
auto unreadMessages = conversationInfo.unreadMessages;
if (contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY && contactInfo.profileInfo.uri.empty()) { if (contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY && contactInfo.profileInfo.uri.empty()) {
return QVariant::fromValue(scaleAndFrame(temporaryItemAvatar().get(), size, false, false)); return QVariant::fromValue(scaleAndFrame(temporaryItemAvatar().get(), size, false, false, unreadMessages));
} else if (contactInfo.profileInfo.type == lrc::api::profile::Type::SIP) { } else if (contactInfo.profileInfo.type == lrc::api::profile::Type::SIP) {
return QVariant::fromValue(scaleAndFrame(generateAvatar(bestName, "").get(), size, displayPresence, contactInfo.isPresent)); return QVariant::fromValue(scaleAndFrame(generateAvatar(bestName, "").get(), size, displayPresence, contactInfo.isPresent));
} else if (!contactPhoto.empty()) { } else if (!contactPhoto.empty()) {
QByteArray byteArray(contactPhoto.c_str(), contactPhoto.length()); QByteArray byteArray(contactPhoto.c_str(), contactPhoto.length());
QVariant photo = personPhoto(byteArray); QVariant photo = personPhoto(byteArray);
return QVariant::fromValue(scaleAndFrame(photo.value<std::shared_ptr<GdkPixbuf>>().get(), size, displayPresence, contactInfo.isPresent)); return QVariant::fromValue(scaleAndFrame(photo.value<std::shared_ptr<GdkPixbuf>>().get(), size, displayPresence, contactInfo.isPresent, unreadMessages));
} else { } else {
return QVariant::fromValue(scaleAndFrame(generateAvatar(bestName, contactInfo.profileInfo.uri).get(), size, displayPresence, contactInfo.isPresent)); return QVariant::fromValue(scaleAndFrame(generateAvatar(bestName, contactInfo.profileInfo.uri).get(), size, displayPresence, contactInfo.isPresent, unreadMessages));
} }
} }
// should not // should not
......
...@@ -68,7 +68,7 @@ private: ...@@ -68,7 +68,7 @@ private:
std::shared_ptr<GdkPixbuf> generateAvatar(const ContactMethod* cm) const; std::shared_ptr<GdkPixbuf> generateAvatar(const ContactMethod* cm) const;
std::shared_ptr<GdkPixbuf> generateAvatar(const std::string& alias, const std::string& uri) const; std::shared_ptr<GdkPixbuf> generateAvatar(const std::string& alias, const std::string& uri) const;
std::shared_ptr<GdkPixbuf> scaleAndFrame(const GdkPixbuf *photo, const QSize& size, bool display_presence = false, bool is_present = false); std::shared_ptr<GdkPixbuf> scaleAndFrame(const GdkPixbuf *photo, const QSize& size, bool display_presence = false, bool is_present = false, uint unreadMessages = 0);
std::shared_ptr<GdkPixbuf> conferenceAvatar_; std::shared_ptr<GdkPixbuf> conferenceAvatar_;
}; };
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
static constexpr const char* MSG_COUNT_FONT = "Sans"; static constexpr const char* MSG_COUNT_FONT = "Sans";
static constexpr int MSG_COUNT_FONT_SIZE = 12; static constexpr int MSG_COUNT_FONT_SIZE = 12;
static constexpr GdkRGBA MSG_COUNT_FONT_COLOUR = {1.0, 1.0, 1.0, 1.0}; // white static constexpr GdkRGBA MSG_COUNT_FONT_COLOUR = {1.0, 1.0, 1.0, 1.0}; // white
static constexpr GdkRGBA MSG_COUNT_BACKGROUND = {0.984, 0.282, 0.278, 0.9}; // red 251, 72, 71, 0.9 static constexpr GdkRGBA MSG_COUNT_BACKGROUND = {0.984, 0.282, 0.278, 1.0}; // red 251, 72, 71, 1.0
static constexpr GdkRGBA PRESENCE_PRESENT_BACKGROUND = {0, 0.4156827, 0.8, 1.0}; // green 112, 217, 6, 0.9 static constexpr GdkRGBA PRESENCE_PRESENT_BACKGROUND = {0, 0.4156827, 0.8, 1.0}; // green 112, 217, 6, 0.9
static constexpr GdkRGBA PRESENCE_ABSENT_BACKGROUND = {0.984, 0.282, 0.278, 1.0}; // red 251, 72, 71, 0.9 static constexpr GdkRGBA PRESENCE_ABSENT_BACKGROUND = {0.984, 0.282, 0.278, 1.0}; // red 251, 72, 71, 0.9
// This is the color palette for default avatars // This is the color palette for default avatars
...@@ -263,7 +263,7 @@ ring_draw_unread_messages(const GdkPixbuf *avatar, int unread_count) { ...@@ -263,7 +263,7 @@ ring_draw_unread_messages(const GdkPixbuf *avatar, int unread_count) {
cairo_paint(cr); cairo_paint(cr);
/* make text */ /* make text */
char *text = g_strdup_printf("%d", unread_count); char *text = g_strdup_printf("%s", unread_count > 9 ? "9+" : std::to_string(unread_count).c_str());
cairo_text_extents_t extents; cairo_text_extents_t extents;
cairo_select_font_face (cr, MSG_COUNT_FONT, cairo_select_font_face (cr, MSG_COUNT_FONT,
...@@ -277,16 +277,18 @@ ring_draw_unread_messages(const GdkPixbuf *avatar, int unread_count) { ...@@ -277,16 +277,18 @@ ring_draw_unread_messages(const GdkPixbuf *avatar, int unread_count) {
* ie: 6 pixels higher, 6 pixels wider */ * ie: 6 pixels higher, 6 pixels wider */
int border_width = 3; int border_width = 3;
double rec_x = w - extents.width - border_width * 2; double rec_x = w - extents.width - border_width * 2;
double rec_y = h - extents.height - border_width * 2; double rec_y = 0;
double rec_w = extents.width + border_width * 2; double rec_w = extents.width + border_width * 2;
double rec_h = extents.height + border_width * 2; double rec_h = extents.height + border_width * 2;
double corner_radius = rec_h/2.5; double corner_radius = rec_h/2.5;
create_rounded_rectangle_path(cr, corner_radius, rec_x, rec_y, rec_w, rec_h); create_rounded_rectangle_path(cr, corner_radius, rec_x, rec_y, rec_w, rec_h);
cairo_set_source_rgba(cr, MSG_COUNT_BACKGROUND.red, MSG_COUNT_BACKGROUND.blue, MSG_COUNT_BACKGROUND.green, MSG_COUNT_BACKGROUND.alpha); cairo_set_source_rgba(cr,
MSG_COUNT_BACKGROUND.red,
MSG_COUNT_BACKGROUND.blue, MSG_COUNT_BACKGROUND.green, MSG_COUNT_BACKGROUND.alpha);
cairo_fill(cr); cairo_fill(cr);
/* draw text */ /* draw text */
cairo_move_to (cr, w-extents.width-border_width, h-border_width); cairo_move_to (cr, w - extents.width-border_width, extents.height + border_width );
cairo_set_source_rgb(cr, MSG_COUNT_FONT_COLOUR.red, MSG_COUNT_FONT_COLOUR.blue, MSG_COUNT_FONT_COLOUR.green); cairo_set_source_rgb(cr, MSG_COUNT_FONT_COLOUR.red, MSG_COUNT_FONT_COLOUR.blue, MSG_COUNT_FONT_COLOUR.green);
cairo_show_text (cr, text); cairo_show_text (cr, text);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment