Skip to content

Commit 0daf6dd

Browse files
committedSep 16, 2015
[GRASS] browser file watcher
1 parent c54ea43 commit 0daf6dd

File tree

2 files changed

+125
-15
lines changed

2 files changed

+125
-15
lines changed
 

‎src/providers/grass/qgsgrassprovidermodule.cpp

Lines changed: 117 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ QList<QgsGrassImport*> QgsGrassMapsetItem::mImports;
101101
QgsGrassMapsetItem::QgsGrassMapsetItem( QgsDataItem* parent, QString dirPath, QString path )
102102
: QgsDirectoryItem( parent, "", dirPath, path )
103103
, mMapsetFileSystemWatcher( 0 )
104+
, mRefreshLater( false )
104105
{
105106
QDir dir( mDirPath );
106107
mName = dir.dirName();
@@ -115,17 +116,16 @@ QgsGrassMapsetItem::QgsGrassMapsetItem( QgsDataItem* parent, QString dirPath, QS
115116
void QgsGrassMapsetItem::setState( State state )
116117
{
117118
QgsDebugMsg( "Entered" );
118-
QgsDirectoryItem::setState( state );
119-
// TODO: verify and re-enable, it seems to be causing strange icon switching during import, sometimes
120-
#if 0
119+
120+
// TODO: it seems to be causing strange icon switching during import, sometimes
121121
if ( state == Populated )
122122
{
123123
if ( !mMapsetFileSystemWatcher )
124124
{
125125
mMapsetFileSystemWatcher = new QFileSystemWatcher( this );
126126
mMapsetFileSystemWatcher->addPath( mDirPath + "/vector" );
127127
mMapsetFileSystemWatcher->addPath( mDirPath + "/cellhd" );
128-
connect( mMapsetFileSystemWatcher, SIGNAL( directoryChanged( const QString & ) ), SLOT( directoryChanged() ) );
128+
connect( mMapsetFileSystemWatcher, SIGNAL( directoryChanged( const QString & ) ), SLOT( onDirectoryChanged() ) );
129129
}
130130
}
131131
else if ( state == NotPopulated )
@@ -136,7 +136,8 @@ void QgsGrassMapsetItem::setState( State state )
136136
mMapsetFileSystemWatcher = 0;
137137
}
138138
}
139-
#endif
139+
140+
QgsDirectoryItem::setState( state );
140141
}
141142

142143
bool QgsGrassMapsetItem::objectInImports( QgsGrassObject grassObject )
@@ -168,8 +169,14 @@ QVector<QgsDataItem*> QgsGrassMapsetItem::createChildren()
168169
QVector<QgsDataItem*> items;
169170

170171
QStringList vectorNames = QgsGrass::vectors( mDirPath );
171-
foreach ( QString name, vectorNames )
172+
Q_FOREACH ( QString name, vectorNames )
172173
{
174+
if ( mRefreshLater )
175+
{
176+
deleteLater( items );
177+
return items;
178+
}
179+
173180
QgsGrassObject vectorObject( mGisdbase, mLocation, mName, name, QgsGrassObject::Vector );
174181

175182
// Skip temporary import maps. If Vect_open_old during refresh fails due to missing topo, hist file remains open
@@ -293,6 +300,11 @@ QVector<QgsDataItem*> QgsGrassMapsetItem::createChildren()
293300

294301
foreach ( QString name, rasterNames )
295302
{
303+
if ( mRefreshLater )
304+
{
305+
deleteLater( items );
306+
return items;
307+
}
296308
QString path = mPath + "/" + "raster" + "/" + name;
297309
QString uri = mDirPath + "/" + "cellhd" + "/" + name;
298310
QgsDebugMsg( "uri = " + uri );
@@ -311,6 +323,11 @@ QVector<QgsDataItem*> QgsGrassMapsetItem::createChildren()
311323
QStringList groupNames = QgsGrass::groups( mDirPath );
312324
foreach ( QString name, groupNames )
313325
{
326+
if ( mRefreshLater )
327+
{
328+
deleteLater( items );
329+
return items;
330+
}
314331
QString path = mPath + "/" + "group" + "/" + name;
315332
QString uri = mDirPath + "/" + "group" + "/" + name;
316333
QgsDebugMsg( "uri = " + uri );
@@ -322,6 +339,11 @@ QVector<QgsDataItem*> QgsGrassMapsetItem::createChildren()
322339

323340
foreach ( QgsGrassImport* import, mImports )
324341
{
342+
if ( mRefreshLater )
343+
{
344+
deleteLater( items );
345+
return items;
346+
}
325347
if ( !import )
326348
{
327349
continue;
@@ -631,6 +653,37 @@ void QgsGrassMapsetItem::openMapset()
631653
QgsGrass::saveMapset();
632654
}
633655

656+
void QgsGrassMapsetItem::onDirectoryChanged()
657+
{
658+
QgsDebugMsg( "entered" );
659+
if ( state() == Populating )
660+
{
661+
// schedule to refresh later, because refres() simply returns if Populating
662+
mRefreshLater = true;
663+
}
664+
else
665+
{
666+
refresh();
667+
}
668+
}
669+
670+
void QgsGrassMapsetItem::childrenCreated()
671+
{
672+
QgsDebugMsg( QString( "mRefreshLater = %1" ).arg( mRefreshLater ) );
673+
674+
if ( mRefreshLater )
675+
{
676+
QgsDebugMsg( "directory changed during createChidren() -> refresh() again" );
677+
mRefreshLater = false;
678+
setState( Populated );
679+
refresh();
680+
}
681+
else
682+
{
683+
QgsDirectoryItem::childrenCreated();
684+
}
685+
}
686+
634687
//----------------------- QgsGrassObjectItemBase ------------------------------
635688

636689
QgsGrassObjectItemBase::QgsGrassObjectItemBase( QgsGrassObject grassObject ) :
@@ -702,6 +755,9 @@ void QgsGrassObjectItemBase::deleteGrassObject( QgsDataItem* parent )
702755
}
703756
}
704757

758+
759+
//------------------------ QgsGrassObjectItem ----------------------------------
760+
705761
QgsGrassObjectItem::QgsGrassObjectItem( QgsDataItem* parent, QgsGrassObject grassObject,
706762
QString name, QString path, QString uri,
707763
LayerType layerType, QString providerKey,
@@ -732,13 +788,6 @@ QList<QAction*> QgsGrassObjectItem::actions()
732788
return lst;
733789
}
734790

735-
bool QgsGrassObjectItem::equal( const QgsDataItem *other )
736-
{
737-
const QgsGrassObjectItem * item = qobject_cast<const QgsGrassObjectItem *>( other );
738-
return QgsLayerItem::equal( other ) && item && mGrassObject == item->mGrassObject
739-
&& mShowObjectActions == item->mShowObjectActions;
740-
}
741-
742791
void QgsGrassObjectItem::renameGrassObject()
743792
{
744793
QgsGrassObjectItemBase::renameGrassObject( parent() );
@@ -749,20 +798,49 @@ void QgsGrassObjectItem::deleteGrassObject()
749798
QgsGrassObjectItemBase::deleteGrassObject( parent() );
750799
}
751800

801+
bool QgsGrassObjectItem::equal( const QgsDataItem *other )
802+
{
803+
const QgsGrassObjectItem * item = qobject_cast<const QgsGrassObjectItem *>( other );
804+
return QgsLayerItem::equal( other ) && item && mGrassObject == item->mGrassObject
805+
&& mShowObjectActions == item->mShowObjectActions;
806+
}
807+
752808
//----------------------- QgsGrassVectorItem ------------------------------
753809

754810
QgsGrassVectorItem::QgsGrassVectorItem( QgsDataItem* parent, QgsGrassObject grassObject, QString path, QString labelName, bool valid ) :
755811
QgsDataCollectionItem( parent, labelName.isEmpty() ? grassObject.name() : labelName, path )
756812
, QgsGrassObjectItemBase( grassObject )
757813
, mValid( valid )
814+
, mWatcher( 0 )
758815
{
759816
QgsDebugMsg( "name = " + grassObject.name() + " path = " + path );
817+
mCapabilities = NoCapabilities; // disable Fertile from QgsDataCollectionItem
760818
setCapabilities( QgsDataItem::NoCapabilities ); // disable fertility
761819
if ( !mValid )
762820
{
763821
setState( Populated );
764822
setIconName( "/mIconDelete.png" );
765823
}
824+
QString watchPath = mGrassObject.mapsetPath() + "/vector/" + mGrassObject.name();
825+
QgsDebugMsg( "add watcher on " + watchPath );
826+
// The watcher does not seem to work without parent
827+
mWatcher = new QFileSystemWatcher( this );
828+
mWatcher->addPath( watchPath );
829+
connect( mWatcher, SIGNAL( directoryChanged( const QString & ) ), SLOT( onDirectoryChanged() ) );
830+
}
831+
832+
QgsGrassVectorItem::~QgsGrassVectorItem()
833+
{
834+
delete mWatcher;
835+
}
836+
837+
void QgsGrassVectorItem::onDirectoryChanged()
838+
{
839+
QgsDebugMsg( "entered" );
840+
if ( parent() )
841+
{
842+
parent()->refresh();
843+
}
766844
}
767845

768846
QList<QAction*> QgsGrassVectorItem::actions()
@@ -790,6 +868,32 @@ void QgsGrassVectorItem::deleteGrassObject()
790868
QgsGrassObjectItemBase::deleteGrassObject( parent() );
791869
}
792870

871+
bool QgsGrassVectorItem::equal( const QgsDataItem *other )
872+
{
873+
if ( QgsDataCollectionItem::equal( other ) )
874+
{
875+
const QgsGrassVectorItem * item = qobject_cast<const QgsGrassVectorItem *>( other );
876+
if ( item && mGrassObject == item->mGrassObject && mValid == item->mValid )
877+
{
878+
if ( mChildren.size() == item->mChildren.size() )
879+
{
880+
// check children
881+
for ( int i = 0; i < mChildren.size(); i++ )
882+
{
883+
QgsDataItem *child = mChildren.value( i );
884+
QgsDataItem *otherChild = item->mChildren.value( i );
885+
if ( !child || !otherChild || !child->equal( otherChild ) )
886+
{
887+
return false;
888+
}
889+
}
890+
return true;
891+
}
892+
}
893+
}
894+
return false;
895+
}
896+
793897
//----------------------- QgsGrassVectorLayerItem ------------------------------
794898

795899
QgsGrassVectorLayerItem::QgsGrassVectorLayerItem( QgsDataItem* parent, QgsGrassObject grassObject, QString layerName,

‎src/providers/grass/qgsgrassprovidermodule.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,16 @@ class QgsGrassMapsetItem : public QgsDirectoryItem
6666
public slots:
6767
void onImportFinished( QgsGrassImport* import );
6868
void openMapset();
69+
void onDirectoryChanged();
70+
virtual void childrenCreated() override;
6971

7072
private:
7173
bool objectInImports( QgsGrassObject grassObject );
7274
//void showImportError(const QString& error);
7375
QString mLocation;
7476
QString mGisdbase;
7577
QFileSystemWatcher *mMapsetFileSystemWatcher;
78+
bool mRefreshLater;
7679
// running imports
7780
static QList<QgsGrassImport*> mImports;
7881
};
@@ -100,7 +103,7 @@ class QgsGrassObjectItem : public QgsLayerItem, public QgsGrassObjectItemBase
100103
bool showObjectActions = true );
101104

102105
virtual QList<QAction*> actions() override;
103-
virtual bool equal( const QgsDataItem *other ) override;
106+
virtual bool equal( const QgsDataItem *other );
104107

105108
public slots:
106109
void renameGrassObject();
@@ -120,17 +123,20 @@ class QgsGrassVectorItem : public QgsDataCollectionItem, public QgsGrassObjectIt
120123
public:
121124
// labelName - name to be displayed in tree if it should be different from grassObject.name() (e.g. invalid vector)
122125
QgsGrassVectorItem( QgsDataItem* parent, QgsGrassObject grassObject, QString path, QString labelName = QString::null, bool valid = true );
123-
~QgsGrassVectorItem() {}
126+
~QgsGrassVectorItem();
124127

125128
virtual QList<QAction*> actions() override;
129+
virtual bool equal( const QgsDataItem *other ) override;
126130

127131
public slots:
128132
void renameGrassObject();
129133
void deleteGrassObject();
134+
void onDirectoryChanged();
130135

131136
private:
132137
QgsGrassObject mVector;
133138
bool mValid;
139+
QFileSystemWatcher *mWatcher;
134140
};
135141

136142
class QgsGrassVectorLayerItem : public QgsGrassObjectItem

0 commit comments

Comments
 (0)
Please sign in to comment.