profile: add account decoration role

Put to use the other decoration roles in the ui for Persons, Call
and Accounts

Tuleap: #530
Change-Id: I04f75d346c9ba9f9b92a5038faa4aa97a70eb45c
diff --git a/src/ConversationVC.mm b/src/ConversationVC.mm
index 64c68e2..cce9ddd 100644
--- a/src/ConversationVC.mm
+++ b/src/ConversationVC.mm
@@ -231,11 +231,7 @@
     result.msgView.layer.cornerRadius = 5.0f;
 
     [result updateWidthConstraint:finalWidth];
-
-    Person* p = qvariant_cast<Person*>(qIdx.data((int)Person::Role::Object));
-    QVariant photo = GlobalInstances::pixmapManipulator().contactPhoto(p, QSize(50,50));
-    [result.photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(photo))];
-
+    [result.photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(qIdx.data(Qt::DecorationRole)))];
     return result;
 }
 
diff --git a/src/HistoryVC.mm b/src/HistoryVC.mm
index 40aa290..5fae480 100644
--- a/src/HistoryVC.mm
+++ b/src/HistoryVC.mm
@@ -176,8 +176,7 @@
         auto call = qvariant_cast<Call*>(qIdx.data((int)Call::Role::Object));
 
         NSImageView* photoView = [result viewWithTag:PHOTO_TAG];
-        QVariant photo = GlobalInstances::pixmapManipulator().callPhoto(call, QSize(50,50));
-        [photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(photo))];
+        [photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(qIdx.data(Qt::DecorationRole)))];
 
         NSTextField* details = [result viewWithTag:DETAILS_TAG];
         [details setStringValue:qIdx.data((int)Call::Role::FormattedDate).toString().toNSString()];
diff --git a/src/PersonsVC.mm b/src/PersonsVC.mm
index db5aa2c..07bc3f0 100644
--- a/src/PersonsVC.mm
+++ b/src/PersonsVC.mm
@@ -176,8 +176,8 @@
         NSImageView* photoView = [result viewWithTag:IMAGE_TAG];
         Person* p = qvariant_cast<Person*>(qIdx.data((int)Person::Role::Object));
 
-        QVariant photo = GlobalInstances::pixmapManipulator().contactPhoto(p, QSize(40,40));
-        [photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(photo))];
+        [photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(qIdx.data(Qt::DecorationRole)))];
+
         [((ContextualTableCellView*) result) setContextualsControls:[NSMutableArray arrayWithObject:[result viewWithTag:CALL_BUTTON_TAG]]];
 
         NSTextField* details = [result viewWithTag:DETAILS_TAG];
diff --git a/src/SmartViewVC.mm b/src/SmartViewVC.mm
index f445f52..10c8db5 100644
--- a/src/SmartViewVC.mm
+++ b/src/SmartViewVC.mm
@@ -241,9 +241,8 @@
     NSTextField* displayName = [result viewWithTag:DISPLAYNAME_TAG];
     [displayName setStringValue:qIdx.data((int)Ring::Role::Name).toString().toNSString()];
     NSImageView* photoView = [result viewWithTag:IMAGE_TAG];
-    Person* p = qvariant_cast<Person*>(qIdx.data((int)Person::Role::Object));
-    QVariant photo = GlobalInstances::pixmapManipulator().contactPhoto(p, QSize(50,50));
-    [photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(photo))];
+
+    [photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(qIdx.data(Qt::DecorationRole)))];
     return result;
 }
 
diff --git a/src/delegates/ImageManipulationDelegate.h b/src/delegates/ImageManipulationDelegate.h
index 776df95..43e7446 100644
--- a/src/delegates/ImageManipulationDelegate.h
+++ b/src/delegates/ImageManipulationDelegate.h
@@ -19,6 +19,10 @@
 
 #import <QuartzCore/QuartzCore.h>
 
+//Qt
+#import <QSize>
+
+//Ring
 #import <interfaces/pixmapmanipulatori.h>
 #import <call.h>
 
@@ -50,16 +54,19 @@
         QVariant   decorationRole(const Call* c) override;
         QVariant   decorationRole(const ContactMethod* cm) override;
         QVariant   decorationRole(const Person* p) override;
+        QVariant   decorationRole(const Account* acc) override;
 
     private:
         //Helper
-        QPixmap drawDefaultUserPixmap(const QSize& size, bool displayPresence, bool isPresent);
+        QPixmap drawDefaultUserPixmap(const QSize& size, bool displayPresence = false, bool isPresent = false);
         CGImageRef resizeCGImage(CGImageRef image, const QSize& size);
 
         /**
          * Return a version of size destSize centered of the bigger photo
          */
         QPixmap crop(QPixmap& photo, const QSize& destSize);
+
+        const QSize decorationSize = {80,80};
     };
 
 } // namespace Interfaces
diff --git a/src/delegates/ImageManipulationDelegate.mm b/src/delegates/ImageManipulationDelegate.mm
index 0862f20..c21f8e4 100644
--- a/src/delegates/ImageManipulationDelegate.mm
+++ b/src/delegates/ImageManipulationDelegate.mm
@@ -34,6 +34,8 @@
 
 //Ring
 #import <person.h>
+#import <profilemodel.h>
+#import <profile.h>
 #import <contactmethod.h>
 
 namespace Interfaces {
@@ -84,7 +86,7 @@
             painter.drawRoundedRect(0,0,pxm.height(),pxm.height(),radius,radius);
         }
         else {
-            pxm = drawDefaultUserPixmap(size, false, false);
+            pxm = drawDefaultUserPixmap(size);
         }
 
         return pxm;
@@ -130,7 +132,7 @@
         if (n->contact()) {
             return contactPhoto(n->contact(), size, displayPresence);
         } else {
-            return drawDefaultUserPixmap(size, false, false);
+            return drawDefaultUserPixmap(size);
         }
     }
 
@@ -139,8 +141,10 @@
         QImage image;
         //For now, ENCODING is only base64 and image type PNG or JPG
         const bool ret = image.loadFromData(QByteArray::fromBase64(data),type.toLatin1());
-        if (!ret)
+        if (!ret) {
             qDebug() << "vCard image loading failed";
+            return drawDefaultUserPixmap(decorationSize);
+        }
 
         return QPixmap::fromImage(image);
     }
@@ -248,20 +252,33 @@
 
     QVariant ImageManipulationDelegate::decorationRole(const Call* c)
     {
-        Q_UNUSED(c)
-        return QVariant();
+        if (c && c->peerContactMethod()
+            && c->peerContactMethod()->contact()) {
+               return contactPhoto(c->peerContactMethod()->contact(), decorationSize);
+        } else
+            return drawDefaultUserPixmap(decorationSize);
     }
 
     QVariant ImageManipulationDelegate::decorationRole(const ContactMethod* cm)
     {
-        Q_UNUSED(cm)
-        return QVariant();
+        QImage photo;
+        if (cm && cm->contact() && cm->contact()->photo().isValid())
+            return contactPhoto(cm->contact(), decorationSize);
+        else
+            return drawDefaultUserPixmap(decorationSize);
     }
 
     QVariant ImageManipulationDelegate::decorationRole(const Person* p)
     {
-        Q_UNUSED(p)
-        return QVariant();
+        return contactPhoto(const_cast<Person*>(p), decorationSize);
+    }
+
+    QVariant ImageManipulationDelegate::decorationRole(const Account* acc)
+    {
+        Q_UNUSED(acc)
+        if (auto pro = ProfileModel::instance().selectedProfile())
+            return contactPhoto(pro->person(), decorationSize);
+        return drawDefaultUserPixmap(decorationSize);
     }
 
 } // namespace Interfaces