Attention une mise à jour du service Gitlab va être effectuée le mardi 30 novembre entre 17h30 et 18h00. Cette mise à jour va générer une interruption du service dont nous ne maîtrisons pas complètement la durée mais qui ne devrait pas excéder quelques minutes. Cette mise à jour intermédiaire en version 14.0.12 nous permettra de rapidement pouvoir mettre à votre disposition une version plus récente.

dtkCorePluginFactory.tpp 3.34 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
// Version: $Id$
//
//

// Commentary:
//
//

// Change Log:
//
//

// Code:
14 15 16

#pragma once

17
#include <dtkLog>
18
#include <dtkMeta>
19

20
#include "dtkCorePluginFactory_p.h"
KLOCZKO Thibaud's avatar
KLOCZKO Thibaud committed
21
#include "dtkCorePluginBase.h"
22

23 24 25 26
// ///////////////////////////////////////////////////////////////////
// dtkCorePluginFactory implementation
// ///////////////////////////////////////////////////////////////////

27
template <typename T> inline dtkCorePluginFactory<T>::dtkCorePluginFactory(void) : m_d(new dtkCorePluginFactoryPrivate)
28
{
29

30 31
}

32
template <typename T> inline dtkCorePluginFactory<T>::~dtkCorePluginFactory(void)
33
{
34
    delete m_d;
35 36
}

37 38 39
// /////////////////////////////////////////////////////////////////
// Type creator registration
// /////////////////////////////////////////////////////////////////
40

41
template <typename T> inline void dtkCorePluginFactory<T>::record(const QString& key, creator func)
42
{
43
    if (this->creators.contains(key)) {
44
        dtkTrace() << Q_FUNC_INFO << "Factory already contains key" << key << ". Nothing is done";
45
        return;
46 47
    }

48 49
    this->creators.insert(key, func);
}
50

51
template <typename T> inline void dtkCorePluginFactory<T>::recordPlugin(const QString& key, dtkCorePluginBase *plugin)
52 53 54 55 56 57 58 59 60
{
    if (this->creators_plugins.contains(key)) {
        qDebug() << Q_FUNC_INFO << "Factory already contains key" << key << ". Nothing is done";
        return;
    }

    this->creators_plugins.insert(key, plugin);
}

61
template <typename T> inline void dtkCorePluginFactory<T>::recordTuner(const QString& key, tunerCreator func)
62 63 64 65 66 67 68 69 70
{
    if (this->tuner_creators.contains(key)) {
        qDebug() << Q_FUNC_INFO << "Factory already contains key" << key << ". Nothing is done";
        return;
    }

    this->tuner_creators.insert(key, func);
}

71 72 73
// /////////////////////////////////////////////////////////////////
// Type creator invokation
// /////////////////////////////////////////////////////////////////
74

75
template <typename T> inline T *dtkCorePluginFactory<T>::create(const QString& key) const
76
{
77 78 79
    T *obj = nullptr;
    if (this->creators.contains(key)) {
        obj = this->creators.value(key)();
80 81 82 83 84 85
    } else if (this->creators_plugins.contains(key)) {
        void *o = this->creators_plugins.value(key)->create();
        obj  = static_cast<T*>(o);
    }

    if (obj) {
86
        m_d->touch(dtkMetaType::variantFromValue(obj));
87
    }
88 89

    return obj;
90 91
}

92
template <typename T> inline dtkCorePluginTuner<T> *dtkCorePluginFactory<T>::createTuner(const QString& key) const
93
{
94
    if (!this->tuner_creators.contains(key))
95 96 97 98 99
        return NULL;

    return this->tuner_creators.value(key)();
}

100

101 102 103
// /////////////////////////////////////////////////////////////////
// Type creator inspection
// /////////////////////////////////////////////////////////////////
104

105
template <typename T> inline QStringList dtkCorePluginFactory<T>::keys(void) const
106
{
107 108 109
    QStringList lkeys = this->creators.keys() ;
    lkeys <<  this->creators_plugins.keys();
    return  lkeys;
110
}
Julien Wintz's avatar
Julien Wintz committed
111

112 113 114 115
// ///////////////////////////////////////////////////////////////////
//
// ///////////////////////////////////////////////////////////////////

116
template <typename T> inline void dtkCorePluginFactory<T>::connect(dtkObjectManager *manager) const
117 118 119 120
{
    m_d->connect(manager);
}

121 122 123 124 125
template <typename T> inline void dtkCorePluginFactory<T>::disconnect(dtkObjectManager *manager) const
{
    m_d->disconnect(manager);
}

126 127
//
// dtkCorePluginFactory_t.h ends here