From 47ab47c2a2300845785cf208e1fb75d789469731 Mon Sep 17 00:00:00 2001 From: Emmanuel Lepage Vallee <elv1313@gmail.com> Date: Sat, 5 Dec 2015 06:27:56 -0500 Subject: [PATCH] model: Handle Qt::DecorationRole in roledata() When clients require simple widgets that filter "raw" model data, such as selecting a contact when receiving a call from an unknown contact method, it is overkill for them to have to implement a view delegate to display the picture. This commit add DecorationRole to all models based on Ring::Role. The pixmap manipulation interface need to implement the new functions to make use of this. The interface is responsible to support resolution independance. Tuleap: #170 Change-Id: Ibad44805485b71195805eaca82f08a4a56864f50 --- src/call.cpp | 3 ++- src/contactmethod.cpp | 5 +++++ src/interfaces/pixmapmanipulatori.h | 4 ++++ src/person.cpp | 2 ++ src/phonedirectorymodel.cpp | 10 +--------- src/pixmapmanipulatordefault.cpp | 25 +++++++++++++++++++++++++ src/pixmapmanipulatordefault.h | 5 ++++- 7 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/call.cpp b/src/call.cpp index a72b100f..cd1f559b 100644 --- a/src/call.cpp +++ b/src/call.cpp @@ -65,7 +65,6 @@ #include "media/text.h" #include "media/file.h" -//TODO remove #include "securityevaluationmodel.h" #include "globalinstances.h" #include "interfaces/pixmapmanipulatori.h" @@ -2123,6 +2122,8 @@ QVariant Call::roleData(int role) const case static_cast<int>(Ring::Role::Number): case static_cast<int>(Call::Role::Number): return peerContactMethod()->uri(); + case Qt::DecorationRole: + return GlobalInstances::pixmapManipulator().decorationRole(this); case static_cast<int>(Call::Role::Direction): return QVariant::fromValue(d_ptr->m_Direction); case static_cast<int>(Call::Role::Date): diff --git a/src/contactmethod.cpp b/src/contactmethod.cpp index 9adc6db2..6111e0f6 100644 --- a/src/contactmethod.cpp +++ b/src/contactmethod.cpp @@ -41,6 +41,9 @@ #include "accountmodel.h" #include "certificatemodel.h" #include "media/textrecording.h" +#include "mime.h" +#include "globalinstances.h" +#include "interfaces/pixmapmanipulatori.h" //Private #include "private/phonedirectorymodel_p.h" @@ -480,6 +483,8 @@ QVariant ContactMethod::roleData(int role) const case static_cast<int>(Call::Role::Number): cat = uri(); break; + case Qt::DecorationRole: + return GlobalInstances::pixmapManipulator().decorationRole(this); case static_cast<int>(Call::Role::Direction): cat = cat = !lastCall ? QVariant() : QVariant::fromValue(lastCall->direction()); break; diff --git a/src/interfaces/pixmapmanipulatori.h b/src/interfaces/pixmapmanipulatori.h index 0a2275a5..3d57ca23 100644 --- a/src/interfaces/pixmapmanipulatori.h +++ b/src/interfaces/pixmapmanipulatori.h @@ -75,6 +75,10 @@ public: virtual QVariant securityLevelIcon(const SecurityEvaluationModel::SecurityLevel level) const = 0; virtual QVariant historySortingCategoryIcon(const CategorizedHistoryModel::SortedProxy::Categories cat) const = 0; virtual QVariant contactSortingCategoryIcon(const CategorizedContactModel::SortedProxy::Categories cat) const = 0; + virtual QVariant decorationRole(const QModelIndex& index) = 0; + virtual QVariant decorationRole(const Call* c ) = 0; + virtual QVariant decorationRole(const ContactMethod* cm ) = 0; + virtual QVariant decorationRole(const Person* p ) = 0; /** * Return the icons associated with the action and its state diff --git a/src/person.cpp b/src/person.cpp index b79a7dc7..477a5108 100644 --- a/src/person.cpp +++ b/src/person.cpp @@ -575,6 +575,8 @@ QVariant Person::roleData(int role) const case Qt::EditRole: case static_cast<int>(Ring::Role::Name): return QVariant(formattedName()); + case Qt::DecorationRole: + return GlobalInstances::pixmapManipulator().decorationRole(this); case static_cast<int>(Person::Role::Organization): return QVariant(organization()); case static_cast<int>(Person::Role::Group): diff --git a/src/phonedirectorymodel.cpp b/src/phonedirectorymodel.cpp index 3641f7d3..766d2cdf 100644 --- a/src/phonedirectorymodel.cpp +++ b/src/phonedirectorymodel.cpp @@ -104,15 +104,7 @@ QVariant PhoneDirectoryModel::data(const QModelIndex& index, int role ) const const ContactMethod* number = d_ptr->m_lNumbers[index.row()]; switch (static_cast<PhoneDirectoryModelPrivate::Columns>(index.column())) { case PhoneDirectoryModelPrivate::Columns::URI: - switch (role) { - case Qt::DisplayRole: - return number->uri(); - case Qt::DecorationRole : - return GlobalInstances::pixmapManipulator().callPhoto(number,QSize(16,16)); - case (int) Role::Object: - return QVariant::fromValue(const_cast<ContactMethod*>(number)); - } - break; + return number->roleData(role); case PhoneDirectoryModelPrivate::Columns::TYPE: switch (role) { case Qt::DisplayRole: diff --git a/src/pixmapmanipulatordefault.cpp b/src/pixmapmanipulatordefault.cpp index 99929ddf..24eeb935 100644 --- a/src/pixmapmanipulatordefault.cpp +++ b/src/pixmapmanipulatordefault.cpp @@ -110,4 +110,29 @@ QVariant PixmapManipulatorDefault::contactSortingCategoryIcon(const CategorizedC return QVariant(); } +QVariant PixmapManipulatorDefault::decorationRole(const QModelIndex& index) +{ + Q_UNUSED(index) + return QVariant(); +} + +QVariant PixmapManipulatorDefault::decorationRole(const Call* c) +{ + Q_UNUSED(c) + return QVariant(); +} + +QVariant PixmapManipulatorDefault::decorationRole(const ContactMethod* cm) +{ + Q_UNUSED(cm) + return QVariant(); +} + +QVariant PixmapManipulatorDefault::decorationRole(const Person* p) +{ + Q_UNUSED(p) + return QVariant(); +} + + } // namespace Interfaces diff --git a/src/pixmapmanipulatordefault.h b/src/pixmapmanipulatordefault.h index eb8d5d90..0ec58ff7 100644 --- a/src/pixmapmanipulatordefault.h +++ b/src/pixmapmanipulatordefault.h @@ -35,7 +35,10 @@ public: QVariant securityLevelIcon(const SecurityEvaluationModel::SecurityLevel level) const override; QVariant historySortingCategoryIcon(const CategorizedHistoryModel::SortedProxy::Categories cat) const override; QVariant contactSortingCategoryIcon(const CategorizedContactModel::SortedProxy::Categories cat) const override; - + QVariant decorationRole(const QModelIndex& index) override; + QVariant decorationRole(const Call* c ) override; + QVariant decorationRole(const ContactMethod* cm ) override; + QVariant decorationRole(const Person* p ) override; /** * Return the icons associated with the action and its state */ -- GitLab