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