From 708f9c9a73109da8677e84000db910328dc532ef Mon Sep 17 00:00:00 2001
From: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>
Date: Thu, 12 Mar 2015 11:56:20 -0400
Subject: [PATCH] collections: Make them more usable form the CollectionModel

Refs #68352
---
 src/collectioninterface.cpp                  |  5 ++
 src/collectioninterface.h                    |  2 +-
 src/collectionmodel.cpp                      |  4 +-
 src/delegates/pixmapmanipulationdelegate.cpp |  8 +++
 src/delegates/pixmapmanipulationdelegate.h   | 21 ++++++--
 src/fallbackpersoncollection.cpp             | 52 ++++++++++++++------
 src/fallbackpersoncollection.h               |  2 +-
 src/securityvalidationmodel.cpp              |  1 -
 src/transitionalpersonbackend.cpp            |  6 ++-
 9 files changed, 76 insertions(+), 25 deletions(-)

diff --git a/src/collectioninterface.cpp b/src/collectioninterface.cpp
index 477c3c3e..f4092bb0 100644
--- a/src/collectioninterface.cpp
+++ b/src/collectioninterface.cpp
@@ -26,6 +26,7 @@
 #include "contactmethod.h"
 #include "collectioneditor.h"
 #include "itembase.h"
+#include "delegates/pixmapmanipulationdelegate.h"
 
 //Libstdc++
 #include <functional>
@@ -53,6 +54,10 @@ QVector<CollectionInterface*> CollectionInterface::children() const
    return d_ptr->m_lChildren;
 }
 
+QVariant CollectionInterface::icon() const
+{
+   return PixmapManipulationDelegate::instance()->collectionIcon(this);
+}
 
 bool CollectionInterface::clear()
 {
diff --git a/src/collectioninterface.h b/src/collectioninterface.h
index 1e87d8bc..ab99c52f 100644
--- a/src/collectioninterface.h
+++ b/src/collectioninterface.h
@@ -98,7 +98,7 @@ public:
     * This method must return an optinal icon to be used in the
     * backend manager is SupportedFeatures::MANAGEABLE is set.
     */
-   virtual QVariant   icon     () const = 0;
+   virtual QVariant   icon     () const   ;
 
    /**
     * Return if the backend is currently enabled. An enabled backend
diff --git a/src/collectionmodel.cpp b/src/collectionmodel.cpp
index 65f90a43..a9508cfe 100644
--- a/src/collectionmodel.cpp
+++ b/src/collectionmodel.cpp
@@ -343,6 +343,7 @@ void CollectionModelPrivate::registerNew(CollectionInterface* col)
       cat->collection  = nullptr;
 
       m_hCategories[cat->m_AltName] = cat;
+      m_hBackendsNodes[col] = cat;
 
       q_ptr->beginInsertRows(QModelIndex(),m_lTopLevelBackends.size(),m_lTopLevelBackends.size());
       m_lTopLevelBackends << cat;
@@ -350,7 +351,8 @@ void CollectionModelPrivate::registerNew(CollectionInterface* col)
    }
 
    ProxyItem* item = new ProxyItem();
-   ProxyItem* par = col->parent()?m_hBackendsNodes[col->parent()] : cat;
+   const bool hasParent = col->parent();
+   ProxyItem* par = hasParent?m_hBackendsNodes[col->parent()] : cat;
 
    item->parent = par;
    item->row    = par->m_Children.size();
diff --git a/src/delegates/pixmapmanipulationdelegate.cpp b/src/delegates/pixmapmanipulationdelegate.cpp
index 1578825f..d6a2d71a 100644
--- a/src/delegates/pixmapmanipulationdelegate.cpp
+++ b/src/delegates/pixmapmanipulationdelegate.cpp
@@ -89,3 +89,11 @@ QVariant PixmapManipulationDelegate::userActionIcon(const UserActionElement& sta
    Q_UNUSED(state)
    return QVariant();
 }
+
+QVariant PixmapManipulationDelegate::collectionIcon(const CollectionInterface* interface, PixmapManipulationDelegate::CollectionIconHint hint) const
+{
+   Q_UNUSED(interface)
+   Q_UNUSED(hint)
+   return QVariant();
+}
+
diff --git a/src/delegates/pixmapmanipulationdelegate.h b/src/delegates/pixmapmanipulationdelegate.h
index cc2b353c..71c029e8 100644
--- a/src/delegates/pixmapmanipulationdelegate.h
+++ b/src/delegates/pixmapmanipulationdelegate.h
@@ -24,9 +24,10 @@
 #include <QtCore/QModelIndex>
 
 //Ring
-class  Person           ;
-class  ContactMethod    ;
-class  Call             ;
+class  Person             ;
+class  ContactMethod      ;
+class  Call               ;
+class  CollectionInterface;
 struct UserActionElement;
 
 /**
@@ -41,6 +42,19 @@ struct UserActionElement;
  */
 class LIB_EXPORT PixmapManipulationDelegate {
 public:
+   //Implementation can use random values to extend this
+   enum CollectionIconHint {
+      NONE,
+      HISTORY,
+      CONTACT,
+      BOOKMARK,
+      PHONE_NUMBER,
+      RINGTONE,
+      PROFILE,
+      CERTIFICATE,
+      ACCOUNT,
+   };
+
    PixmapManipulationDelegate();
    virtual ~PixmapManipulationDelegate() {}
    virtual QVariant   contactPhoto(Person* c, const QSize& size, bool displayPresence = true);
@@ -50,6 +64,7 @@ public:
    virtual QVariant   serurityIssueIcon(const QModelIndex& index);
    virtual QByteArray toByteArray(const QVariant& pxm);
    virtual QVariant   profilePhoto(const QByteArray& data, const QString& type = "PNG");
+   virtual QVariant   collectionIcon(const CollectionInterface* interface, PixmapManipulationDelegate::CollectionIconHint hint = PixmapManipulationDelegate::CollectionIconHint::NONE) const;
 
    /**
     * Return the icons associated with the action and its state
diff --git a/src/fallbackpersoncollection.cpp b/src/fallbackpersoncollection.cpp
index 4d37a045..a6dd9f62 100644
--- a/src/fallbackpersoncollection.cpp
+++ b/src/fallbackpersoncollection.cpp
@@ -22,21 +22,24 @@
 #include <QtCore/QFile>
 #include <QtCore/QDir>
 #include <QtCore/QHash>
+#include <QtCore/QTimer>
 #include <QtCore/QUrl>
 #include <QtWidgets/QApplication>
 #include <QtCore/QStandardPaths>
 
 //Ring
 #include "person.h"
+#include "personmodel.h"
 #include "vcardutils.h"
 #include "contactmethod.h"
 #include "collectioneditor.h"
+#include "delegates/pixmapmanipulationdelegate.h"
 
 
 class FallbackPersonBackendEditor : public CollectionEditor<Person>
 {
 public:
-   FallbackPersonBackendEditor(CollectionMediator<Person>* m) : CollectionEditor<Person>(m) {}
+   FallbackPersonBackendEditor(CollectionMediator<Person>* m, const QString& path) : CollectionEditor<Person>(m),m_Path(path) {}
    virtual bool save       ( const Person* item ) override;
    virtual bool remove     ( const Person* item ) override;
    virtual bool edit       ( Person*       item ) override;
@@ -44,6 +47,7 @@ public:
    virtual bool addExisting( const Person* item ) override;
 
    QVector<Person*> m_lItems;
+   QString          m_Path  ;
 
 private:
    virtual QVector<Person*> items() const override;
@@ -52,17 +56,23 @@ private:
 class FallbackPersonCollectionPrivate
 {
 public:
-   FallbackPersonCollectionPrivate(CollectionMediator<Person>* mediator);
+   FallbackPersonCollectionPrivate(CollectionMediator<Person>* mediator, const QString& path);
    CollectionMediator<Person>*  m_pMediator;
+   QString                      m_Path     ;
+   QString                      m_Name     ;
 };
 
-FallbackPersonCollectionPrivate::FallbackPersonCollectionPrivate(CollectionMediator<Person>* mediator) : m_pMediator(mediator)
+FallbackPersonCollectionPrivate::FallbackPersonCollectionPrivate(CollectionMediator<Person>* mediator, const QString& path) : m_pMediator(mediator), m_Path(path)
 {
-
+   m_Name = path.split('/').last();
+   if (m_Name.size())
+      m_Name[0] = m_Name[0].toUpper();
+   else
+      m_Name = "vCard";
 }
 
-FallbackPersonCollection::FallbackPersonCollection(CollectionMediator<Person>* mediator) :
-CollectionInterface(new FallbackPersonBackendEditor(mediator)),d_ptr(new FallbackPersonCollectionPrivate(mediator))
+FallbackPersonCollection::FallbackPersonCollection(CollectionMediator<Person>* mediator, const QString& path, FallbackPersonCollection* parent) :
+CollectionInterface(new FallbackPersonBackendEditor(mediator,path),parent),d_ptr(new FallbackPersonCollectionPrivate(mediator,path))
 {
 }
 
@@ -73,7 +83,7 @@ FallbackPersonCollection::~FallbackPersonCollection()
 
 bool FallbackPersonBackendEditor::save(const Person* item)
 {
-   QFile file("/tmp/vcard/"+item->uid()+".vcf");
+   QFile file(m_Path+'/'+item->uid()+".vcf");
    file.open(QIODevice::WriteOnly);
    file.write(item->toVCard({}));
    file.close();
@@ -112,7 +122,7 @@ QVector<Person*> FallbackPersonBackendEditor::items() const
 
 QString FallbackPersonCollection::name () const
 {
-   return QObject::tr("vCard backend");
+   return d_ptr->m_Name;
 }
 
 QString FallbackPersonCollection::category () const
@@ -122,7 +132,7 @@ QString FallbackPersonCollection::category () const
 
 QVariant FallbackPersonCollection::icon() const
 {
-   return QVariant();
+   return PixmapManipulationDelegate::instance()->collectionIcon(this,PixmapManipulationDelegate::CollectionIconHint::CONTACT);
 }
 
 bool FallbackPersonCollection::isEnabled() const
@@ -133,10 +143,19 @@ bool FallbackPersonCollection::isEnabled() const
 bool FallbackPersonCollection::load()
 {
    bool ok;
-   QList< Person* > ret =  VCardUtils::loadDir(QUrl("/tmp/vcard"),ok);
+   QList< Person* > ret =  VCardUtils::loadDir(QUrl(d_ptr->m_Path),ok);
    for(Person* p : ret) {
       editor<Person>()->addExisting(p);
    }
+
+   //Add all sub directories as new backends
+   QTimer::singleShot(0,[this]() {
+      QDir d(d_ptr->m_Path);
+      for (const QString& dir : d.entryList(QDir::AllDirs)) {
+         PersonModel::instance()->addCollection<FallbackPersonCollection,QString,FallbackPersonCollection*>(d_ptr->m_Path+'/'+dir,this);
+      }
+   });
+
    return true;
 }
 
@@ -147,17 +166,18 @@ bool FallbackPersonCollection::reload()
 
 CollectionInterface::SupportedFeatures FallbackPersonCollection::supportedFeatures() const
 {
-   return (CollectionInterface::SupportedFeatures) (
-      CollectionInterface::SupportedFeatures::NONE  |
-      CollectionInterface::SupportedFeatures::LOAD  |
-      CollectionInterface::SupportedFeatures::CLEAR |
+   return (CollectionInterface::SupportedFeatures)       (
+      CollectionInterface::SupportedFeatures::NONE       |
+      CollectionInterface::SupportedFeatures::LOAD       |
+      CollectionInterface::SupportedFeatures::CLEAR      |
+      CollectionInterface::SupportedFeatures::MANAGEABLE |
 //       CollectionInterface::SupportedFeatures::REMOVE|
-      CollectionInterface::SupportedFeatures::ADD   );
+      CollectionInterface::SupportedFeatures::ADD        );
 }
 
 bool FallbackPersonCollection::clear()
 {
-   QDir dir("/tmp/vcard");
+   QDir dir(d_ptr->m_Path);
    for (const QString& file : dir.entryList({"*.vcf"},QDir::Files))
       dir.remove(file);
    return true;
diff --git a/src/fallbackpersoncollection.h b/src/fallbackpersoncollection.h
index 047370ef..278c11a5 100644
--- a/src/fallbackpersoncollection.h
+++ b/src/fallbackpersoncollection.h
@@ -37,7 +37,7 @@ template<typename T> class CollectionMediator;
 class LIB_EXPORT FallbackPersonCollection : public CollectionInterface
 {
 public:
-   explicit FallbackPersonCollection(CollectionMediator<Person>* mediator);
+   explicit FallbackPersonCollection(CollectionMediator<Person>* mediator, const QString& path = "/tmp/vcard", FallbackPersonCollection* parent = nullptr);
    virtual ~FallbackPersonCollection();
 
    virtual bool load  () override;
diff --git a/src/securityvalidationmodel.cpp b/src/securityvalidationmodel.cpp
index 3706af18..5a3e7148 100644
--- a/src/securityvalidationmodel.cpp
+++ b/src/securityvalidationmodel.cpp
@@ -169,7 +169,6 @@ void SecurityValidationModelPrivate::update()
 {
    if (!m_pAccount)
       return; //TODO use the local certificates
-   qDebug() << "\n\n\nUPDATING";
 
    m_lCurrentFlaws.clear();
 
diff --git a/src/transitionalpersonbackend.cpp b/src/transitionalpersonbackend.cpp
index 39fd2ae9..32dbd5d1 100644
--- a/src/transitionalpersonbackend.cpp
+++ b/src/transitionalpersonbackend.cpp
@@ -20,6 +20,8 @@
 
 #include <collectioneditor.h>
 
+#include "delegates/pixmapmanipulationdelegate.h"
+
 class TransitionalPersonBackendPrivate
 {
 
@@ -143,7 +145,7 @@ CollectionInterface::SupportedFeatures TransitionalPersonBackend::supportedFeatu
 
 QString TransitionalPersonBackend::name () const
 {
-   return QObject::tr("Transitional contact backend");
+   return QObject::tr("Contact placeholders");
 }
 
 QString TransitionalPersonBackend::category () const
@@ -153,7 +155,7 @@ QString TransitionalPersonBackend::category () const
 
 QVariant TransitionalPersonBackend::icon() const
 {
-   return QVariant();
+   return PixmapManipulationDelegate::instance()->collectionIcon(this,PixmapManipulationDelegate::CollectionIconHint::CONTACT);
 }
 
 QByteArray TransitionalPersonBackend::id() const
-- 
GitLab