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