Skip to content

Commit c3b5476

Browse files
author
rblazek
committed
fixed crash on non grass layer
git-svn-id: http://svn.osgeo.org/qgis/trunk@5096 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent c185ace commit c3b5476

File tree

4 files changed

+55
-19
lines changed

4 files changed

+55
-19
lines changed

src/plugins/grass/qgsgrassedit.cpp

+21-18
Original file line numberDiff line numberDiff line change
@@ -135,18 +135,27 @@ QgsGrassEdit::QgsGrassEdit ( QgisApp *qgisApp, QgisIface *iface,
135135
// At moment QgisIface::activeLayer() does not work
136136
QgsMapLayer *layer = (QgsMapLayer *) mIface->activeLayer();
137137

138-
if ( !layer ) {
139-
std::cerr << "No layer is selected." << std::endl;
140-
QMessageBox::warning( 0, "Warning", "No layer is selected." );
141-
return;
142-
}
138+
if ( !isEditable(layer) ) return;
139+
140+
//TODO dynamic_cast ?
141+
QgsVectorLayer *vector = (QgsVectorLayer*)layer;
142+
143+
//TODO dynamic_cast ?
144+
mProvider = (QgsGrassProvider *) vector->getDataProvider();
145+
146+
init();
147+
148+
}
149+
150+
bool QgsGrassEdit::isEditable ( QgsMapLayer *layer )
151+
{
152+
if ( !layer ) return false;
143153

144154
std::cerr << "layer name: " << layer->name().toLocal8Bit().data() << std::endl;
145155

146156
if ( layer->type() != QgsMapLayer::VECTOR ) {
147157
std::cerr << "The selected layer is not vector." << std::endl;
148-
QMessageBox::warning( 0, "Warning", "The selected layer is not vector." );
149-
return;
158+
return false;
150159
}
151160

152161
//TODO dynamic_cast ?
@@ -155,17 +164,11 @@ QgsGrassEdit::QgsGrassEdit ( QgisApp *qgisApp, QgisIface *iface,
155164
std::cerr << "Vector layer type: " << vector->providerType().toLocal8Bit().data() << std::endl;
156165

157166
if ( vector->providerType() != "grass" ) {
158-
QMessageBox::warning( 0, "Warning", "The selected vector is not in GRASS format." );
159-
return;
167+
std::cerr << "The selected layer is not GRASS." << std::endl;
168+
return false;
160169
}
161-
162-
std::cerr << "Vector layer type: " << vector->providerType().toLocal8Bit().data() << std::endl;
163-
164-
//TODO dynamic_cast ?
165-
mProvider = (QgsGrassProvider *) vector->getDataProvider();
166-
167-
init();
168170

171+
return true;
169172
}
170173

171174
QgsGrassEdit::QgsGrassEdit ( QgisApp *qgisApp, QgisIface *iface,
@@ -897,7 +900,7 @@ QgsGrassEdit::~QgsGrassEdit()
897900
std::cerr << "QgsGrassEdit::~QgsGrassEdit()" << std::endl;
898901
#endif
899902

900-
if (mCanvasEdit) {
903+
if ( mValid && mCanvasEdit) {
901904
eraseDynamic();
902905
mRubberBandLine->hide();
903906
mRubberBandIcon->hide();
@@ -965,7 +968,7 @@ void QgsGrassEdit::closeEdit(void)
965968
QgsGrass::getDefaultLocation(),
966969
mapset, map );
967970
}
968-
971+
emit finished();
969972
delete this;
970973
}
971974

src/plugins/grass/qgsgrassedit.h

+5
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,11 @@ public slots:
202202
// ! Close event
203203
void closeEvent(QCloseEvent *e);
204204

205+
static bool isEditable ( QgsMapLayer *layer );
206+
207+
signals:
208+
void finished();
209+
205210
private:
206211
//! Editing is already running
207212
static bool mRunning;

src/plugins/grass/qgsgrassplugin.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,9 @@ void QgsGrassPlugin::initGui()
222222
// Connect display region
223223
connect( mCanvas, SIGNAL(renderComplete(QPainter *)), this, SLOT(postRender(QPainter *)));
224224

225+
226+
connect ( mCanvas, SIGNAL(layersChanged()), this, SLOT(setEditAction()) );
227+
225228
// Init Region symbology
226229
mRegionPen.setColor( QColor ( settings.readEntry ("/GRASS/region/color", "#ff0000" ) ) );
227230
mRegionPen.setWidth( settings.readNumEntry ("/GRASS/region/width", 0 ) );
@@ -436,16 +439,40 @@ void QgsGrassPlugin::edit()
436439
return;
437440
}
438441

442+
mEditAction->setEnabled(false);
439443
QgsGrassEdit *ed = new QgsGrassEdit( mQgis, qGisInterface, mQgis, Qt::WType_Dialog );
440444

441445
if ( ed->isValid() ) {
442446
ed->show();
443447
mCanvas->refresh();
448+
connect(ed, SIGNAL(finished()), this, SLOT(setEditAction()));
444449
} else {
445450
delete ed;
451+
mEditAction->setEnabled(true);
446452
}
447453
}
448454

455+
void QgsGrassPlugin::setEditAction()
456+
{
457+
#ifdef QGISDEBUG
458+
std::cout << "QgsGrassPlugin::setEditAction()" << std::endl;
459+
#endif
460+
461+
QgsMapLayer *layer = (QgsMapLayer *) qGisInterface->activeLayer();
462+
463+
if ( QgsGrassEdit::isEditable(layer) )
464+
{
465+
mEditAction->setEnabled(true);
466+
}
467+
else
468+
{
469+
mEditAction->setEnabled(false);
470+
}
471+
472+
// TODO connect to currentItemChanged()? and disable this:
473+
mEditAction->setEnabled(true);
474+
}
475+
449476
void QgsGrassPlugin::newVector()
450477
{
451478
#ifdef QGISDEBUG

src/plugins/grass/qgsgrassplugin.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ public slots:
110110
void newProject();
111111
//! Save mapset to project
112112
void saveMapset();
113-
113+
//! Set edit action
114+
void setEditAction();
114115
private:
115116
//! Name of the plugin
116117
QString pluginNameQString;

0 commit comments

Comments
 (0)