diff --git a/src/plugins/grass/qgsgrassedit.cpp b/src/plugins/grass/qgsgrassedit.cpp index 3ce815d904a8..b11888a04cbf 100644 --- a/src/plugins/grass/qgsgrassedit.cpp +++ b/src/plugins/grass/qgsgrassedit.cpp @@ -135,18 +135,27 @@ QgsGrassEdit::QgsGrassEdit ( QgisApp *qgisApp, QgisIface *iface, // At moment QgisIface::activeLayer() does not work QgsMapLayer *layer = (QgsMapLayer *) mIface->activeLayer(); - if ( !layer ) { - std::cerr << "No layer is selected." << std::endl; - QMessageBox::warning( 0, "Warning", "No layer is selected." ); - return; - } + if ( !isEditable(layer) ) return; + + //TODO dynamic_cast ? + QgsVectorLayer *vector = (QgsVectorLayer*)layer; + + //TODO dynamic_cast ? + mProvider = (QgsGrassProvider *) vector->getDataProvider(); + + init(); + +} + +bool QgsGrassEdit::isEditable ( QgsMapLayer *layer ) +{ + if ( !layer ) return false; std::cerr << "layer name: " << layer->name().toLocal8Bit().data() << std::endl; if ( layer->type() != QgsMapLayer::VECTOR ) { std::cerr << "The selected layer is not vector." << std::endl; - QMessageBox::warning( 0, "Warning", "The selected layer is not vector." ); - return; + return false; } //TODO dynamic_cast ? @@ -155,17 +164,11 @@ QgsGrassEdit::QgsGrassEdit ( QgisApp *qgisApp, QgisIface *iface, std::cerr << "Vector layer type: " << vector->providerType().toLocal8Bit().data() << std::endl; if ( vector->providerType() != "grass" ) { - QMessageBox::warning( 0, "Warning", "The selected vector is not in GRASS format." ); - return; + std::cerr << "The selected layer is not GRASS." << std::endl; + return false; } - - std::cerr << "Vector layer type: " << vector->providerType().toLocal8Bit().data() << std::endl; - - //TODO dynamic_cast ? - mProvider = (QgsGrassProvider *) vector->getDataProvider(); - - init(); + return true; } QgsGrassEdit::QgsGrassEdit ( QgisApp *qgisApp, QgisIface *iface, @@ -897,7 +900,7 @@ QgsGrassEdit::~QgsGrassEdit() std::cerr << "QgsGrassEdit::~QgsGrassEdit()" << std::endl; #endif - if (mCanvasEdit) { + if ( mValid && mCanvasEdit) { eraseDynamic(); mRubberBandLine->hide(); mRubberBandIcon->hide(); @@ -965,7 +968,7 @@ void QgsGrassEdit::closeEdit(void) QgsGrass::getDefaultLocation(), mapset, map ); } - + emit finished(); delete this; } diff --git a/src/plugins/grass/qgsgrassedit.h b/src/plugins/grass/qgsgrassedit.h index dc39940c230c..15bfd1b6de78 100644 --- a/src/plugins/grass/qgsgrassedit.h +++ b/src/plugins/grass/qgsgrassedit.h @@ -202,6 +202,11 @@ public slots: // ! Close event void closeEvent(QCloseEvent *e); + static bool isEditable ( QgsMapLayer *layer ); + +signals: + void finished(); + private: //! Editing is already running static bool mRunning; diff --git a/src/plugins/grass/qgsgrassplugin.cpp b/src/plugins/grass/qgsgrassplugin.cpp index b94fbc05140c..f13df7025071 100644 --- a/src/plugins/grass/qgsgrassplugin.cpp +++ b/src/plugins/grass/qgsgrassplugin.cpp @@ -222,6 +222,9 @@ void QgsGrassPlugin::initGui() // Connect display region connect( mCanvas, SIGNAL(renderComplete(QPainter *)), this, SLOT(postRender(QPainter *))); + + connect ( mCanvas, SIGNAL(layersChanged()), this, SLOT(setEditAction()) ); + // Init Region symbology mRegionPen.setColor( QColor ( settings.readEntry ("/GRASS/region/color", "#ff0000" ) ) ); mRegionPen.setWidth( settings.readNumEntry ("/GRASS/region/width", 0 ) ); @@ -436,16 +439,40 @@ void QgsGrassPlugin::edit() return; } + mEditAction->setEnabled(false); QgsGrassEdit *ed = new QgsGrassEdit( mQgis, qGisInterface, mQgis, Qt::WType_Dialog ); if ( ed->isValid() ) { ed->show(); mCanvas->refresh(); + connect(ed, SIGNAL(finished()), this, SLOT(setEditAction())); } else { delete ed; + mEditAction->setEnabled(true); } } +void QgsGrassPlugin::setEditAction() +{ +#ifdef QGISDEBUG + std::cout << "QgsGrassPlugin::setEditAction()" << std::endl; +#endif + + QgsMapLayer *layer = (QgsMapLayer *) qGisInterface->activeLayer(); + + if ( QgsGrassEdit::isEditable(layer) ) + { + mEditAction->setEnabled(true); + } + else + { + mEditAction->setEnabled(false); + } + + // TODO connect to currentItemChanged()? and disable this: + mEditAction->setEnabled(true); +} + void QgsGrassPlugin::newVector() { #ifdef QGISDEBUG diff --git a/src/plugins/grass/qgsgrassplugin.h b/src/plugins/grass/qgsgrassplugin.h index 0b70d76e561a..671d459fcf05 100644 --- a/src/plugins/grass/qgsgrassplugin.h +++ b/src/plugins/grass/qgsgrassplugin.h @@ -110,7 +110,8 @@ public slots: void newProject(); //! Save mapset to project void saveMapset(); - + //! Set edit action + void setEditAction(); private: //! Name of the plugin QString pluginNameQString;