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