20#include "moc_qgsdataitem.cpp"
34#include <QApplication>
35#include <QtConcurrentMap>
36#include <QtConcurrentRun>
38#include <QElapsedTimer>
44#include <QTreeWidgetItem>
49#include <QRegularExpression>
52#define CPL_SUPRESS_CPLUSPLUS
54#include "cpl_string.h"
63 , mProviderKey( providerKey )
80 if ( mFutureWatcher && !mFutureWatcher->isFinished() )
83 QgsDebugError( QStringLiteral(
"mFutureWatcher not finished (should not happen) -> waitForFinished()" ) );
84 mDeferredDelete =
true;
85 mFutureWatcher->waitForFinished();
88 delete mFutureWatcher;
93 const thread_local QRegularExpression rx(
"[\\\\/]" );
94 return QString(
string ).replace( rx, QStringLiteral(
"|" ) );
116 child->deleteLater();
120 if ( mFutureWatcher && !mFutureWatcher->isFinished() )
122 QgsDebugMsgLevel( QStringLiteral(
"mFutureWatcher not finished -> schedule to delete later" ), 2 );
123 mDeferredDelete =
true;
127 QObject::deleteLater();
133 const auto constItems = items;
152 child->QObject::setParent(
nullptr );
153 child->moveToThread( targetThread );
155 QObject::moveToThread( targetThread );
166 return sPopulatingIcon->
icon();
168 if ( !
mIcon.isNull() )
187 return QVector<QgsDataItem *>();
205 if ( !mFutureWatcher )
207 mFutureWatcher =
new QFutureWatcher< QVector <QgsDataItem *> >( this );
211 mFutureWatcher->setFuture( QtConcurrent::run( runCreateChildren,
this ) );
216QVector<QgsDataItem *> QgsDataItem::runCreateChildren(
QgsDataItem *item )
222 QgsDebugMsgLevel( QStringLiteral(
"%1 children created in %2 ms" ).arg(
children.size() ).arg( time.elapsed() ), 3 );
230 child->moveToThread( qApp->thread() );
238 QgsDebugMsgLevel( QStringLiteral(
"path = %1 children.size() = %2" ).arg(
path() ).arg( mFutureWatcher->result().size() ), 3 );
242 QgsDebugMsgLevel( QStringLiteral(
"Item was scheduled to be deleted later" ), 2 );
243 QObject::deleteLater();
249 populate( mFutureWatcher->result() );
253 refresh( mFutureWatcher->result() );
306 if ( !mFutureWatcher )
308 mFutureWatcher =
new QFutureWatcher< QVector <QgsDataItem *> >( this );
311 mFutureWatcher->setFuture( QtConcurrent::run( runCreateChildren,
this ) );
335 QVector<QgsDataItem *> remove;
343 remove.append( child );
345 const auto constRemove = remove;
365 mChildren.value( index )->refresh( child->children() );
373 child->deleteLater();
409 disconnect(
this,
nullptr,
mParent,
nullptr );
426 QgsDebugMsgLevel( QStringLiteral(
"path = %1 add child #%2 - %3 - %4" ).arg(
mPath ).arg(
mChildren.size() ).arg( child->
mName ).arg( qgsEnumValueToKey< Qgis::BrowserItemType >( child->
mType ) ), 3 );
444 if (
mChildren.at( i )->mName.localeAwareCompare( child->
mName ) >= 0 )
462 const int i =
mChildren.indexOf( child );
473 const int i =
mChildren.indexOf( child );
489 for (
int i = 0; i < items.size(); i++ )
491 Q_ASSERT_X( items[i],
"findItem", QStringLiteral(
"item %1 is nullptr" ).arg( i ).toLatin1() );
493 if ( items[i]->
equal( item ) )
501 return ( metaObject()->className() == other->metaObject()->className() &&
508 return QList<QAction *>();
557 QgsDebugMsgLevel( QStringLiteral(
"item %1 set state %2 -> %3" ).arg(
path() ).arg( qgsEnumValueToKey< Qgis::BrowserItemState >( this->
state() ) ).arg( qgsEnumValueToKey< Qgis::BrowserItemState >(
state ) ), 3 );
565 if ( !sPopulatingIcon )
589 return QList<QMenu *>();
595 mIconName = QStringLiteral(
"/mIconDelete.svg" );
The Qgis class provides global constants for use throughout the application.
BrowserItemState
Browser item states.
@ NotPopulated
Children not yet created.
@ Populating
Creating children in separate thread (populating or refreshing)
@ Populated
Children created.
@ Fertile
Can create children. Even items without this capability may have children, but cannot create them,...
@ RefreshChildrenWhenItemIsRefreshed
When the item is refreshed, all its populated children will also be refreshed in turn.
@ ItemRepresentsFile
Item's path() directly represents a file on disk.
@ Fast
CreateChildren() is fast enough to be run in main thread when refreshing items, most root items (wms,...
BrowserItemType
Browser item types.
@ Directory
Represents a file directory.
QFlags< BrowserItemCapability > BrowserItemCapabilities
Browser item capabilities.
The QgsAbstractDatabaseProviderConnection class provides common functionality for DB based connection...
Animated icon is keeping an animation running if there are listeners connected to frameChanged.
bool disconnectFrameChanged(const typename QtPrivate::FunctionPointer< Func1 >::Object *receiver, Func1 slot)
Convenience function to disconnect the same style that the frame change connection was established.
bool connectFrameChanged(const typename QtPrivate::FunctionPointer< Func1 >::Object *receiver, Func1 slot)
Connect a slot that will be notified repeatedly whenever a frame changes and which should request the...
QIcon icon() const
Gets the icons representation in the current frame.
static QgsApplication * instance()
Returns the singleton instance of the QgsApplication.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
This class represents a coordinate reference system (CRS).
Base class for all items in the model.
void stateChanged(QgsDataItem *item, Qgis::BrowserItemState oldState)
Emitted when an item's state is changed.
void setSortKey(const QVariant &key)
Sets a custom sorting key for the item.
static int findItem(QVector< QgsDataItem * > items, QgsDataItem *item)
Qgis::BrowserItemType mType
virtual QList< QMenu * > menus(QWidget *parent)
Returns the list of menus available for this item.
virtual void deleteChildItem(QgsDataItem *child)
Removes and deletes a child item, emitting relevant signals to the model.
QVector< QgsDataItem * > mChildren
virtual QVariant sortKey() const
Returns the sorting key for the item.
Qgis::BrowserItemState mState
virtual bool handleDoubleClick()
Called when a user double clicks on the item.
void dataChanged(QgsDataItem *item)
Emitted when data changes for an item.
bool deferredDelete()
The item is scheduled to be deleted.
void setParent(QgsDataItem *parent)
Set item parent and connect / disconnect parent to / from item signals.
static void deleteLater(QVector< QgsDataItem * > &items)
void endRemoveItems()
Emitted after child items have been removed from this data item.
virtual bool layerCollection() const
Returns true if the data item is a collection of layers The default implementation returns false,...
QVector< QgsDataItem * > children() const
void beginRemoveItems(QgsDataItem *parent, int first, int last)
Emitted before child items are removed from this data item.
virtual void deleteLater()
Safely delete the item:
virtual QgsAbstractDatabaseProviderConnection * databaseConnection() const
For data items that represent a DB connection or one of its children, this method returns a connectio...
Qgis::BrowserItemType type() const
QgsDataItem(Qgis::BrowserItemType type, QgsDataItem *parent, const QString &name, const QString &path, const QString &providerKey=QString())
Constructor for QgsDataItem, with the specified parent item.
virtual QVector< QgsDataItem * > createChildren()
Create children.
QMap< QString, QIcon > mIconMap
Qgis::BrowserItemState state() const
virtual void childrenCreated()
virtual QgsDataItem * removeChildItem(QgsDataItem *child)
Removes a child item and returns it without deleting it.
static QString pathComponent(const QString &component)
Create path component replacing path separators.
virtual QList< QAction * > actions(QWidget *parent)
Returns the list of actions available for this item.
QVariant mSortKey
Custom sort key. If invalid, name() will be used for sorting instead.
void updateIcon()
Will request a repaint of this icon.
virtual Q_DECL_DEPRECATED bool rename(const QString &name)
Sets a new name for the item, and returns true if the item was successfully renamed.
void connectionsChanged(const QString &providerKey=QString())
Emitted when the connections of the provider with the specified providerKey have changed.
virtual Q_DECL_DEPRECATED QgsMimeDataUtils::Uri mimeUri() const
Returns mime URI for the data item.
QString name() const
Returns the name of the item (the displayed text for the item).
virtual void setState(Qgis::BrowserItemState state)
Set item state.
void beginInsertItems(QgsDataItem *parent, int first, int last)
Emitted before child items are added to this data item.
virtual void refreshConnections(const QString &providerKey=QString())
Causes a data item provider to refresh all registered connections.
virtual void setCapabilities(Qgis::BrowserItemCapabilities capabilities)
Sets the capabilities for the data item.
virtual void addChildItem(QgsDataItem *child, bool refresh=false)
Inserts a new child item.
void setName(const QString &name)
Sets the name of the item (the displayed text for the item).
QgsDataItem * parent() const
Gets item parent.
void moveToThread(QThread *targetThread)
Move object and all its descendants to thread.
virtual QgsMimeDataUtils::UriList mimeUris() const
Returns mime URIs for the data item, most data providers will only return a single URI but some data ...
QString providerKey() const
Returns the provider key that created this item (e.g.
void endInsertItems()
Emitted after child items have been added to this data item.
virtual Q_DECL_DEPRECATED bool setCrs(const QgsCoordinateReferenceSystem &crs)
Writes the selected crs into data source.
virtual Qgis::BrowserItemCapabilities capabilities2() const
Returns the capabilities for the data item.
void setProviderKey(const QString &value)
Sets the provider key that created this item (e.g.
virtual void populate(const QVector< QgsDataItem * > &children)
virtual bool equal(const QgsDataItem *other)
Returns true if this item is equal to another item (by testing item type and path).
virtual void depopulate()
Remove children recursively and set as not populated. This is used when refreshing collapsed items.
QgsErrorItem(QgsDataItem *parent, const QString &error, const QString &path)
QList< QgsMimeDataUtils::Uri > UriList
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
const QgsCoordinateReferenceSystem & crs
QString filePath
Path to file, if uri is associated with a file.
QString uri
Identifier of the data source recognized by its providerKey.