diff --git a/src/app/qgsrasterlayerproperties.cpp b/src/app/qgsrasterlayerproperties.cpp index ff66a6ba2003..8606c276d29c 100644 --- a/src/app/qgsrasterlayerproperties.cpp +++ b/src/app/qgsrasterlayerproperties.cpp @@ -92,6 +92,8 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv connect( leBlueMax, SIGNAL( textEdited( QString ) ), this, SLOT( userDefinedMinMax_textEdited( QString ) ) ); connect( mColormapTreeWidget, SIGNAL( itemDoubleClicked( QTreeWidgetItem*, int ) ), this, SLOT( handleColormapTreeWidgetDoubleClick( QTreeWidgetItem*, int ) ) ); + connect( mRasterLayer, SIGNAL( dataChanged( int ) ), this, SLOT( dataChanged( int ) ) ); + // set up the scale based layer visibility stuff.... chkUseScaleDependentRendering->setChecked( lyr->hasScaleBasedVisibility() ); leMinimumScale->setText( QString::number( lyr->minimumScale(), 'f' ) ); @@ -3033,3 +3035,8 @@ void QgsRasterLayerProperties::on_btnResetNull_clicked( ) leNoDataValue->clear(); } } + +void QgsRasterLayerProperties::dataChanged( int change ) +{ + QgsDebugMsg( "entered." ); +} \ No newline at end of file diff --git a/src/app/qgsrasterlayerproperties.h b/src/app/qgsrasterlayerproperties.h index 514b39149129..639c7299fcd3 100644 --- a/src/app/qgsrasterlayerproperties.h +++ b/src/app/qgsrasterlayerproperties.h @@ -99,6 +99,9 @@ class QgsRasterLayerProperties : public QDialog, private Ui::QgsRasterLayerPrope /** \brief this slot sets StdDev switch box to 0.00 when user enters min max values */ void userDefinedMinMax_textEdited( QString ); + /** \brief data changed reciever */ + void dataChanged( int change ); + private slots: /** This slow handles necessary interface modifications (i.e. loading min max values) */ void on_cboBlue_currentIndexChanged( const QString& ); diff --git a/src/core/qgsdataprovider.h b/src/core/qgsdataprovider.h index da520c9e6e4d..8c503a8af4e6 100644 --- a/src/core/qgsdataprovider.h +++ b/src/core/qgsdataprovider.h @@ -17,7 +17,7 @@ #ifndef QQGSDATAPROVIDER_H #define QQGSDATAPROVIDER_H - +#include #include #include #include @@ -271,6 +271,15 @@ class CORE_EXPORT QgsDataProvider : public QObject synchronize with changes in the data source*/ virtual void reloadData() {} + /** Time stamp of data source in the moment when data/metadata were loaded by provider */ + virtual QDateTime timestamp() const { return mTimestamp; } + + /** Current time stamp of data source */ + virtual QDateTime dataTimestamp() const { return QDateTime(); } + + /** test if at least one of specified data/metadata changed since provider was loaded */ + virtual bool changed( int change ) { return false; } + signals: /** @@ -287,6 +296,13 @@ class CORE_EXPORT QgsDataProvider : public QObject */ void dataChanged(); + /** + * This is emitted whenever data or metadata (e.g. color table, extent) has changed + * @param changed binary combination of changes + * @note added in 1.7 + */ + void dataChanged( int change ); + private: /** @@ -295,6 +311,10 @@ class CORE_EXPORT QgsDataProvider : public QObject */ QString mDataSourceURI; + /** + * Timestamp of data in the moment when the data were loaded by provider. + */ + QDateTime mTimestamp; }; diff --git a/src/core/qgsrasterdataprovider.h b/src/core/qgsrasterdataprovider.h index 5078156e43f0..37a215aba5bb 100644 --- a/src/core/qgsrasterdataprovider.h +++ b/src/core/qgsrasterdataprovider.h @@ -21,6 +21,8 @@ #ifndef QGSRASTERDATAPROVIDER_H #define QGSRASTERDATAPROVIDER_H +#include + #include "qgslogger.h" #include "qgsrectangle.h" #include "qgsdataprovider.h" @@ -114,6 +116,17 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider ProgressPyramids = 1 }; + enum Change + { + NoChange = 0, + ValuesChange = 1, + ExtentChange = 1 << 1, + CrsChange = 1 << 2, + DataTypeChange = 1 << 3, + ColorTableChange = 1 << 4, + SizeChange = 1 << 5 + }; + QgsRasterDataProvider(); QgsRasterDataProvider( QString const & uri ); @@ -467,11 +480,24 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider /** \brief Set null value in char */ QByteArray noValueBytes( int theBandNo ); + /** Current time stamp of data source */ + virtual QDateTime dataTimestamp() const { return QDateTime(); } + + /** Give list of changed data/metadata since provider was loaded */ + virtual int changed( ) { return NoChange; } + signals: /** Emit a signal to notify of the progress event. * Emited theProgress is in percents (0.0-100.0) */ void progress( int theType, double theProgress, QString theMessage ); + /** + * This is emitted whenever data or metadata (e.g. color table, extent) has changed + * @param changed binary combination of changes + * @note added in 1.7 + */ + void dataChanged( int change ); + protected: /**Dots per intch. Extended WMS (e.g. QGIS mapserver) support DPI dependent output and therefore are suited for printing. A value of -1 means it has not been set diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp index 4f3a7a4f13e0..4f6754c042f4 100644 --- a/src/core/raster/qgsrasterlayer.cpp +++ b/src/core/raster/qgsrasterlayer.cpp @@ -2479,7 +2479,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider, // read standard deviations if ( mContrastEnhancementAlgorithm == QgsContrastEnhancement::StretchToMinimumMaximum ) { - setStandardDeviations( myQSettings.value( "/Raster/defaultStandardDeviation", 1.0 ).toInt() ); + setStandardDeviations( myQSettings.value( "/Raster/defaultStandardDeviation", 1.0 ).toInt() ); } } // Debug @@ -4414,18 +4414,41 @@ double QgsRasterLayer::readValue( void *data, int type, int index ) bool QgsRasterLayer::update() { QgsDebugMsg( "entered." ); - - if ( mLastModified < QgsRasterLayer::lastModified( source() ) ) + // Check if data changed + //if ( mLastModified < QgsRasterLayer::lastModified( source() ) ) + //{ + // TODO: lastModified to provider -> outdated + // TODO: check what has to be cleard, rebuild + int change = mDataProvider->changed(); + if ( change != QgsRasterDataProvider::NoChange ) { - // TODO: lastModified to provider -> outdated - // TODO: check what has to be cleard, rebuild - mHasPyramids = false; - mPyramidList.clear(); + QgsDebugMsg( "reload data" ); + //mHasPyramids = false; + //mPyramidList.clear(); - mRasterStatsList.clear(); + //mRasterStatsList.clear(); mValid = mDataProvider->reload(); + + for ( int i = 1; i <= mBandCount; i++ ) + { + // TODO : refresh all data, move to separate method from constructor + // Reload color table + if ( i - 1 < mRasterStatsList.size() ) + { + QList ct; + ct = mDataProvider->colorTable( i ); + + mRasterStatsList[i-1].colorTable = ct; + if ( mRasterType == Palette ) + { + QgsColorRampShader* myColorRampShader = ( QgsColorRampShader* ) mRasterShader->rasterShaderFunction(); + myColorRampShader->setColorRampItemList( *colorTable( 1 ) ); + } + } + } + emit dataChanged( change ); } - return true; + return mValid; } bool QgsRasterLayer::usesProvider() diff --git a/src/core/raster/qgsrasterlayer.h b/src/core/raster/qgsrasterlayer.h index fa34d243585f..b605367eb53c 100644 --- a/src/core/raster/qgsrasterlayer.h +++ b/src/core/raster/qgsrasterlayer.h @@ -681,6 +681,13 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer /** \brief Signal for notifying listeners of long running processes */ void progressUpdate( int theValue ); + /** + * This is emitted whenever data or metadata (e.g. color table, extent) has changed + * @param changed binary combination of changes, defined in QgsRasterDataProvider + * @note added in 1.7 + */ + void dataChanged( int change ); + protected: /** \brief Read the symbology for the current layer from the Dom node supplied */ diff --git a/src/providers/grass/qgsgrassrasterprovider.cpp b/src/providers/grass/qgsgrassrasterprovider.cpp index b45a3b7a9e0c..cdb14d93e95c 100644 --- a/src/providers/grass/qgsgrassrasterprovider.cpp +++ b/src/providers/grass/qgsgrassrasterprovider.cpp @@ -275,6 +275,7 @@ double QgsGrassRasterProvider::maximumValue( int bandNo ) const QList QgsGrassRasterProvider::colorTable( int bandNo )const { + QgsDebugMsg( "Entered" ); QList ct; // TODO: check if color can be realy discontinuous in GRASS, @@ -484,6 +485,18 @@ QString QgsGrassRasterProvider::description() const return PROVIDER_DESCRIPTION; } +int QgsGrassRasterProvider::changed() +{ + QgsDebugMsg( "Entered" ); + // TODO + return ValuesChange | ExtentChange | CrsChange | DataTypeChange | ColorTableChange | SizeChange; +} + +bool QgsGrassRasterProvider::reload() +{ + QgsDebugMsg( "Entered" ); + return true; +} //void QgsGrassRasterProvider::buildSupportedRasterFileFilter( QString & theFileFiltersString ) //{ //} diff --git a/src/providers/grass/qgsgrassrasterprovider.h b/src/providers/grass/qgsgrassrasterprovider.h index 1de74e8ec927..c991c390a729 100644 --- a/src/providers/grass/qgsgrassrasterprovider.h +++ b/src/providers/grass/qgsgrassrasterprovider.h @@ -244,7 +244,8 @@ class QgsGrassRasterProvider : public QgsRasterDataProvider bool theThoroughBandScanFlag = false ); - + int changed( ); + bool reload( ); private: /**