Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgspluginlayerregistry.cpp - class for 3 : : registering plugin layer creators 4 : : ------------------- 5 : : begin : Mon Nov 30 2009 6 : : copyright : (C) 2009 by Mathias Walker, Sourcepole 7 : : email : mwa at sourcepole.ch 8 : : ***************************************************************************/ 9 : : 10 : : /*************************************************************************** 11 : : * * 12 : : * This program is free software; you can redistribute it and/or modify * 13 : : * it under the terms of the GNU General Public License as published by * 14 : : * the Free Software Foundation; either version 2 of the License, or * 15 : : * (at your option) any later version. * 16 : : * * 17 : : ***************************************************************************/ 18 : : 19 : : #include "qgspluginlayerregistry.h" 20 : : #include "qgslogger.h" 21 : : #include "qgspluginlayer.h" 22 : : #include "qgsproject.h" 23 : : 24 : 0 : QgsPluginLayerType::QgsPluginLayerType( const QString &name ) 25 : 0 : : mName( name ) 26 : 0 : { 27 : 0 : } 28 : : 29 : 0 : QString QgsPluginLayerType::name() 30 : : { 31 : 0 : return mName; 32 : : } 33 : : 34 : 0 : QgsPluginLayer *QgsPluginLayerType::createLayer() 35 : : { 36 : 0 : return nullptr; 37 : : } 38 : : 39 : 0 : QgsPluginLayer *QgsPluginLayerType::createLayer( const QString &uri ) 40 : : { 41 : 0 : Q_UNUSED( uri ) 42 : 0 : return nullptr; 43 : : } 44 : : 45 : 0 : bool QgsPluginLayerType::showLayerProperties( QgsPluginLayer *layer ) 46 : : { 47 : : Q_UNUSED( layer ) 48 : 0 : return false; 49 : : } 50 : : 51 : : // 52 : : // QgsPluginLayerRegistry 53 : : // 54 : : 55 : 5 : QgsPluginLayerRegistry::~QgsPluginLayerRegistry() 56 : : { 57 : 5 : if ( !mPluginLayerTypes.isEmpty() ) 58 : : { 59 : 0 : QgsDebugMsg( QStringLiteral( "QgsPluginLayerRegistry::~QgsPluginLayerRegistry(): creator list not empty" ) ); 60 : 0 : const QStringList keys = mPluginLayerTypes.keys(); 61 : 0 : for ( const QString &key : keys ) 62 : : { 63 : 0 : removePluginLayerType( key ); 64 : : } 65 : 0 : } 66 : 5 : } 67 : : 68 : 0 : QStringList QgsPluginLayerRegistry::pluginLayerTypes() 69 : : { 70 : 0 : return mPluginLayerTypes.keys(); 71 : : } 72 : : 73 : 0 : bool QgsPluginLayerRegistry::addPluginLayerType( QgsPluginLayerType *type ) 74 : : { 75 : 0 : if ( !type ) 76 : 0 : return false; 77 : : 78 : 0 : if ( mPluginLayerTypes.contains( type->name() ) ) 79 : 0 : return false; 80 : : 81 : 0 : mPluginLayerTypes[type->name()] = type; 82 : 0 : return true; 83 : 0 : } 84 : : 85 : : 86 : 0 : bool QgsPluginLayerRegistry::removePluginLayerType( const QString &typeName ) 87 : : { 88 : 0 : if ( !mPluginLayerTypes.contains( typeName ) ) 89 : 0 : return false; 90 : : 91 : : // remove all remaining layers of this type - to avoid invalid behavior 92 : 0 : QList<QgsMapLayer *> layers = QgsProject::instance()->mapLayers().values(); 93 : 0 : const auto constLayers = layers; 94 : 0 : for ( QgsMapLayer *layer : constLayers ) 95 : : { 96 : 0 : if ( layer->type() == QgsMapLayerType::PluginLayer ) 97 : : { 98 : 0 : QgsPluginLayer *pl = qobject_cast<QgsPluginLayer *>( layer ); 99 : 0 : if ( pl->pluginLayerType() == typeName ) 100 : : { 101 : 0 : QgsProject::instance()->removeMapLayers( 102 : 0 : QStringList() << layer->id() ); 103 : 0 : } 104 : 0 : } 105 : : } 106 : : 107 : 0 : delete mPluginLayerTypes.take( typeName ); 108 : 0 : return true; 109 : 0 : } 110 : : 111 : 0 : QgsPluginLayerType *QgsPluginLayerRegistry::pluginLayerType( const QString &typeName ) 112 : : { 113 : 0 : return mPluginLayerTypes.value( typeName, nullptr ); 114 : : } 115 : : 116 : : 117 : 0 : QgsPluginLayer *QgsPluginLayerRegistry::createLayer( const QString &typeName, const QString &uri ) 118 : : { 119 : 0 : QgsPluginLayerType *type = pluginLayerType( typeName ); 120 : 0 : if ( !type ) 121 : : { 122 : 0 : QgsDebugMsg( "Unknown plugin layer type: " + typeName ); 123 : 0 : return nullptr; 124 : : } 125 : : 126 : 0 : if ( !uri.isEmpty() ) 127 : 0 : return type->createLayer( uri ); 128 : : else 129 : 0 : return type->createLayer(); 130 : 0 : }