Skip to content

Commit cdb44a3

Browse files
committedMar 4, 2015
Browser: Abstract creation of custom data items into QgsDataItemProvider
1 parent 427adf7 commit cdb44a3

12 files changed

+267
-78
lines changed
 

‎python/core/core.sip

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
%Include qgscrscache.sip
2727
%Include qgsdatadefined.sip
2828
%Include qgsdataitem.sip
29+
%Include qgsdataitemprovider.sip
30+
%Include qgsdataitemproviderregistry.sip
2931
%Include qgsdataprovider.sip
3032
%Include qgsdatasourceuri.sip
3133
%Include qgsdatumtransformstore.sip

‎python/core/qgsdataitemprovider.sip

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
class QgsDataItemProvider
3+
{
4+
%TypeHeaderCode
5+
#include <qgsdataitemprovider.h>
6+
%End
7+
public:
8+
virtual ~QgsDataItemProvider();
9+
10+
//! Human-readable name of the provider name
11+
virtual QString name() = 0;
12+
13+
//! Return combination of flags from QgsDataProvider::DataCapabilities
14+
virtual int capabilities() = 0;
15+
16+
//! Create a new instance of QgsDataItem (or null) for given path and parent item.
17+
//! Caller takes responsibility of deleting created items.
18+
virtual QgsDataItem* createDataItem( const QString& path, QgsDataItem* parentItem ) = 0 /Factory/;
19+
20+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
class QgsDataItemProviderRegistry
3+
{
4+
%TypeHeaderCode
5+
#include <qgsdataitemproviderregistry.h>
6+
%End
7+
public:
8+
//! Returns the instance pointer, creating the object on the first call
9+
static QgsDataItemProviderRegistry * instance();
10+
11+
~QgsDataItemProviderRegistry();
12+
13+
//! Get list of available providers
14+
QList<QgsDataItemProvider*> providers() const;
15+
16+
private:
17+
QgsDataItemProviderRegistry();
18+
19+
};

‎src/core/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ SET(QGIS_CORE_SRCS
7777
qgsdatadefined.cpp
7878
qgsdatasourceuri.cpp
7979
qgsdataitem.cpp
80+
qgsdataitemprovider.cpp
81+
qgsdataitemproviderregistry.cpp
8082
qgsdatumtransformstore.cpp
8183
qgsdbfilterproxymodel.cpp
8284
qgsdiagramrendererv2.cpp
@@ -475,6 +477,9 @@ SET(QGIS_CORE_HDRS
475477
qgscsexception.h
476478
qgsdartmeasurement.h
477479
qgsdatadefined.h
480+
qgsdataitem.h
481+
qgsdataitemprovider.h
482+
qgsdataitemproviderregistry.h
478483
qgsdatasourceuri.h
479484
qgsdatumtransformstore.h
480485
qgsdbfilterproxymodel.h

‎src/core/qgsapplication.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "qgsapplication.h"
1717
#include "qgscrscache.h"
18+
#include "qgsdataitemproviderregistry.h"
1819
#include "qgsexception.h"
1920
#include "qgsgeometry.h"
2021
#include "qgslogger.h"
@@ -626,6 +627,7 @@ void QgsApplication::exitQgis()
626627
QgsMapLayerRegistry::cleanup();
627628
QgsNetworkAccessManager::cleanup();
628629
QgsCoordinateTransformCache::cleanup();
630+
QgsDataItemProviderRegistry::cleanup();
629631

630632
// Cleanup providers
631633
delete QgsProviderRegistry::instance();

‎src/core/qgsbrowsermodel.cpp

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
#include "qgis.h"
2121
#include "qgsapplication.h"
22+
#include "qgsdataitemprovider.h"
23+
#include "qgsdataitemproviderregistry.h"
2224
#include "qgsdataprovider.h"
2325
#include "qgsmimedatautils.h"
2426
#include "qgslogger.h"
@@ -123,40 +125,19 @@ void QgsBrowserModel::addRootItems()
123125
mRootItems << vols;
124126
#endif
125127

126-
// Add non file top level items
127-
QStringList providersList = QgsProviderRegistry::instance()->providerList();
128-
129128
// container for displaying providers as sorted groups (by QgsDataProvider::DataCapability enum)
130129
QMap<int, QgsDataItem *> providerMap;
131130

132-
foreach ( QString key, providersList )
131+
foreach ( QgsDataItemProvider* pr, QgsDataItemProviderRegistry::instance()->providers() )
133132
{
134-
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( key );
135-
if ( !library )
136-
continue;
137-
138-
dataCapabilities_t * dataCapabilities = ( dataCapabilities_t * ) cast_to_fptr( library->resolve( "dataCapabilities" ) );
139-
if ( !dataCapabilities )
140-
{
141-
QgsDebugMsg( library->fileName() + " does not have dataCapabilities" );
142-
continue;
143-
}
144-
145-
int capabilities = dataCapabilities();
133+
int capabilities = pr->capabilities();
146134
if ( capabilities == QgsDataProvider::NoDataCapabilities )
147135
{
148-
QgsDebugMsg( library->fileName() + " does not have any dataCapabilities" );
149-
continue;
150-
}
151-
152-
dataItem_t *dataItem = ( dataItem_t * ) cast_to_fptr( library->resolve( "dataItem" ) );
153-
if ( !dataItem )
154-
{
155-
QgsDebugMsg( library->fileName() + " does not have dataItem" );
136+
QgsDebugMsg( pr->name() + " does not have any dataCapabilities" );
156137
continue;
157138
}
158139

159-
QgsDataItem *item = dataItem( "", NULL ); // empty path -> top level
140+
QgsDataItem *item = pr->createDataItem( "", NULL ); // empty path -> top level
160141
if ( item )
161142
{
162143
QgsDebugMsg( "Add new top level item : " + item->name() );

‎src/core/qgsdataitem.cpp

Lines changed: 7 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
#include "qgis.h"
3333
#include "qgsdataitem.h"
3434

35+
#include "qgsdataitemprovider.h"
36+
#include "qgsdataitemproviderregistry.h"
3537
#include "qgsdataprovider.h"
3638
#include "qgslogger.h"
3739
#include "qgsproviderregistry.h"
@@ -715,39 +717,6 @@ QgsDirectoryItem::QgsDirectoryItem( QgsDataItem* parent, QString name, QString d
715717

716718
void QgsDirectoryItem::init()
717719
{
718-
if ( mLibraries.size() > 0 )
719-
return;
720-
721-
QStringList keys = QgsProviderRegistry::instance()->providerList();
722-
QStringList::const_iterator i;
723-
for ( i = keys.begin(); i != keys.end(); ++i )
724-
{
725-
QString k( *i );
726-
// some providers hangs with empty uri (Postgis) etc...
727-
// -> using libraries directly
728-
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( k );
729-
if ( library )
730-
{
731-
dataCapabilities_t * dataCapabilities = ( dataCapabilities_t * ) cast_to_fptr( library->resolve( "dataCapabilities" ) );
732-
if ( !dataCapabilities )
733-
{
734-
QgsDebugMsg( library->fileName() + " does not have dataCapabilities" );
735-
continue;
736-
}
737-
if ( dataCapabilities() == QgsDataProvider::NoDataCapabilities )
738-
{
739-
QgsDebugMsg( library->fileName() + " has NoDataCapabilities" );
740-
continue;
741-
}
742-
743-
QgsDebugMsg( QString( "%1 dataCapabilities : %2" ).arg( library->fileName() ).arg( dataCapabilities() ) );
744-
mLibraries.append( library );
745-
}
746-
else
747-
{
748-
//QgsDebugMsg ( "Cannot get provider " + k );
749-
}
750-
}
751720
}
752721

753722
QgsDirectoryItem::~QgsDirectoryItem()
@@ -761,6 +730,7 @@ QIcon QgsDirectoryItem::icon()
761730
return iconDir();
762731
}
763732

733+
764734
QVector<QgsDataItem*> QgsDirectoryItem::createChildren()
765735
{
766736
QVector<QgsDataItem*> children;
@@ -808,38 +778,23 @@ QVector<QgsDataItem*> QgsDirectoryItem::createChildren()
808778
}
809779
}
810780

811-
foreach ( QLibrary *library, mLibraries )
781+
foreach ( QgsDataItemProvider* provider, QgsDataItemProviderRegistry::instance()->providers() )
812782
{
813-
// we could/should create separate list of providers for each purpose
814-
815-
// TODO: use existing fileVectorFilters(),directoryDrivers() ?
816-
dataCapabilities_t * dataCapabilities = ( dataCapabilities_t * ) cast_to_fptr( library->resolve( "dataCapabilities" ) );
817-
if ( !dataCapabilities )
818-
{
819-
continue;
820-
}
821-
822-
int capabilities = dataCapabilities();
783+
int capabilities = provider->capabilities();
823784

824785
if ( !(( fileInfo.isFile() && ( capabilities & QgsDataProvider::File ) ) ||
825786
( fileInfo.isDir() && ( capabilities & QgsDataProvider::Dir ) ) ) )
826787
{
827788
continue;
828789
}
829790

830-
dataItem_t * dataItem = ( dataItem_t * ) cast_to_fptr( library->resolve( "dataItem" ) );
831-
if ( ! dataItem )
832-
{
833-
QgsDebugMsg( library->fileName() + " does not have dataItem" );
834-
continue;
835-
}
836-
837-
QgsDataItem * item = dataItem( path, this );
791+
QgsDataItem * item = provider->createDataItem( path, this );
838792
if ( item )
839793
{
840794
children.append( item );
841795
}
842796
}
797+
843798
}
844799

845800
return children;

‎src/core/qgsdataitem.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,8 @@ class CORE_EXPORT QgsDirectoryItem : public QgsDataCollectionItem
362362

363363
/* static QVector<QgsDataProvider*> mProviders; */
364364
//! @note not available via python bindings
365-
static QVector<QLibrary*> mLibraries;
365+
//! @note deprecated since 2.10 - use QgsDataItemProviderRegistry
366+
Q_DECL_DEPRECATED static QVector<QLibrary*> mLibraries;
366367

367368
public slots:
368369
virtual void childrenCreated() override;

‎src/core/qgsdataitemprovider.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/***************************************************************************
2+
qgsdataitemprovider.cpp
3+
--------------------------------------
4+
Date : March 2015
5+
Copyright : (C) 2015 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsdataitemprovider.h"
17+
18+
// no implementation currently

‎src/core/qgsdataitemprovider.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/***************************************************************************
2+
qgsdataitemprovider.h
3+
--------------------------------------
4+
Date : March 2015
5+
Copyright : (C) 2015 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSDATAITEMPROVIDER_H
17+
#define QGSDATAITEMPROVIDER_H
18+
19+
class QgsDataItem;
20+
21+
class QString;
22+
23+
/**
24+
* This is the interface for those who want to add custom data items to the browser tree.
25+
*
26+
* The method createDataItem() is ever called only if capabilities() return non-zero value.
27+
* There are two occasions when createDataItem() is called:
28+
* 1. to create root items (passed path is empty, parent item is null).
29+
* 2. to create items in directory structure. For this capabilities have to return at least
30+
* of the following: QgsDataProider::Dir or QgsDataProvider::File. Passed path is the file
31+
* or directory being inspected, parent item is a valid QgsDirectoryItem
32+
*
33+
* @note added in 2.10
34+
*/
35+
class CORE_EXPORT QgsDataItemProvider
36+
{
37+
public:
38+
virtual ~QgsDataItemProvider() {}
39+
40+
//! Human-readable name of the provider name
41+
virtual QString name() = 0;
42+
43+
//! Return combination of flags from QgsDataProvider::DataCapabilities
44+
virtual int capabilities() = 0;
45+
46+
//! Create a new instance of QgsDataItem (or null) for given path and parent item.
47+
//! Caller takes responsibility of deleting created items.
48+
virtual QgsDataItem* createDataItem( const QString& path, QgsDataItem* parentItem ) = 0;
49+
50+
};
51+
52+
#endif // QGSDATAITEMPROVIDER_H

0 commit comments

Comments
 (0)