18 #include <QApplication>
19 #include <QtConcurrentMap>
20 #include <QtConcurrentRun>
22 #include <QElapsedTimer>
26 #include <QMouseEvent>
27 #include <QTreeWidget>
28 #include <QTreeWidgetItem>
33 #include <QRegularExpression>
43 #include "qgsconfig.h"
44 #include "qgssettings.h"
51 #define CPL_SUPRESS_CPLUSPLUS
53 #include "cpl_string.h"
62 , mProviderKey( providerKey )
79 if ( mFutureWatcher && !mFutureWatcher->isFinished() )
82 QgsDebugMsg( QStringLiteral(
"mFutureWatcher not finished (should not happen) -> waitForFinished()" ) );
83 mDeferredDelete =
true;
84 mFutureWatcher->waitForFinished();
87 delete mFutureWatcher;
92 return QString(
string ).replace( QRegExp(
"[\\\\/]" ), QStringLiteral(
"|" ) );
114 child->deleteLater();
118 if ( mFutureWatcher && !mFutureWatcher->isFinished() )
120 QgsDebugMsg( QStringLiteral(
"mFutureWatcher not finished -> schedule to delete later" ) );
121 mDeferredDelete =
true;
125 QObject::deleteLater();
131 const auto constItems = items;
150 child->QObject::setParent(
nullptr );
151 child->moveToThread( targetThread );
153 QObject::moveToThread( targetThread );
164 return sPopulatingIcon->
icon();
166 if ( !
mIcon.isNull() )
185 return QVector<QgsDataItem *>();
203 if ( !mFutureWatcher )
205 mFutureWatcher =
new QFutureWatcher< QVector <QgsDataItem *> >( this );
209 mFutureWatcher->setFuture( QtConcurrent::run( runCreateChildren,
this ) );
214 QVector<QgsDataItem *> QgsDataItem::runCreateChildren(
QgsDataItem *item )
220 QgsDebugMsgLevel( QStringLiteral(
"%1 children created in %2 ms" ).arg(
children.size() ).arg( time.elapsed() ), 3 );
222 const auto constChildren =
children;
229 child->moveToThread( qApp->thread() );
237 QgsDebugMsgLevel( QStringLiteral(
"path = %1 children.size() = %2" ).arg(
path() ).arg( mFutureWatcher->result().size() ), 3 );
241 QgsDebugMsg( QStringLiteral(
"Item was scheduled to be deleted later" ) );
242 QObject::deleteLater();
248 populate( mFutureWatcher->result() );
252 refresh( mFutureWatcher->result() );
267 const auto constChildren =
children;
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;
353 const auto constChildren =
children;
366 mChildren.value( index )->refresh( child->children() );
369 child->deleteLater();
405 disconnect(
this,
nullptr,
mParent,
nullptr );
422 QgsDebugMsgLevel( QStringLiteral(
"path = %1 add child #%2 - %3 - %4" ).arg(
mPath ).arg(
mChildren.size() ).arg( child->
mName ).arg( qgsEnumValueToKey< Qgis::BrowserItemType >( child->
mType ) ), 3 );
440 if (
mChildren.at( i )->mName.localeAwareCompare( child->
mName ) >= 0 )
485 for (
int i = 0; i < items.size(); i++ )
487 Q_ASSERT_X( items[i],
"findItem", QStringLiteral(
"item %1 is nullptr" ).arg( i ).toLatin1() );
489 if ( items[i]->
equal( item ) )
497 return ( metaObject()->className() == other->metaObject()->className() &&
504 return QList<QAction *>();
530 setCapabilities(
static_cast< Qgis::BrowserItemCapabilities
>( capabilities ) );
540 QgsDebugMsgLevel( QStringLiteral(
"item %1 set state %2 -> %3" ).arg(
path() ).arg( qgsEnumValueToKey< Qgis::BrowserItemState >( this->
state() ) ).arg( qgsEnumValueToKey< Qgis::BrowserItemState >(
state ) ), 3 );
548 if ( !sPopulatingIcon )
572 return QList<QMenu *>();
578 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,...
@ 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.
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)
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)
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)
QgsDataItem * parent() const
Gets item parent.
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)
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).
void moveToThread(QThread *targetThread)
Move object and all its descendants to thread.
QString providerKey() const
Returns the provider key that created this item (e.g.
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 QgsMimeDataUtils::UriList mimeUris() const
Returns mime URIs for the data item, most data providers will only return a single URI but some data ...
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)
#define QgsDebugMsgLevel(str, level)
const QgsCoordinateReferenceSystem & crs