2929#include < QFileInfo>
3030#include < QDir>
3131#include < QLabel>
32+ #include < QObject>
3233
3334// ----------------------- QgsGrassLocationItem ------------------------------
3435
@@ -212,11 +213,8 @@ bool QgsGrassMapsetItem::handleDrop( const QMimeData * data, Qt::DropAction )
212213
213214 QStringList errors;
214215 QgsMimeDataUtils::UriList lst = QgsMimeDataUtils::decodeUriList ( data );
215- #ifdef WIN32
216- Qt::CaseSensitivity caseSensitivity = Qt::CaseInsensitive;
217- #else
218- Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive;
219- #endif
216+ Qt::CaseSensitivity caseSensitivity = QgsGrass::caseSensitivity ();
217+
220218 foreach ( const QgsMimeDataUtils::Uri& u, lst )
221219 {
222220 if ( u.layerType != " raster" && u.layerType != " vector" )
@@ -229,17 +227,20 @@ bool QgsGrassMapsetItem::handleDrop( const QMimeData * data, Qt::DropAction )
229227 QgsDataProvider* provider = 0 ;
230228 QStringList extensions;
231229 QStringList existingNames;
230+ QRegExp regExp;
232231 if ( u.layerType == " raster" )
233232 {
234233 rasterProvider = qobject_cast<QgsRasterDataProvider*>( QgsProviderRegistry::instance ()->provider ( u.providerKey , u.uri ) );
235234 provider = rasterProvider;
236235 existingNames = existingRasters;
236+ regExp = QgsGrassObject::newNameRegExp ( QgsGrassObject::Raster );
237237 }
238238 else if ( u.layerType == " vector" )
239239 {
240240 vectorProvider = qobject_cast<QgsVectorDataProvider*>( QgsProviderRegistry::instance ()->provider ( u.providerKey , u.uri ) );
241241 provider = vectorProvider;
242242 existingNames = existingVectors;
243+ regExp = QgsGrassObject::newNameRegExp ( QgsGrassObject::Vector );
243244 }
244245 QgsDebugMsg ( " existingNames = " + existingNames.join ( " ," ) );
245246
@@ -263,7 +264,7 @@ bool QgsGrassMapsetItem::handleDrop( const QMimeData * data, Qt::DropAction )
263264 QString newName = u.name ;
264265 if ( QgsNewNameDialog::exists ( u.name , extensions, existingNames, caseSensitivity ) )
265266 {
266- QgsNewNameDialog dialog ( u.name , u.name , extensions, existingNames, QRegExp () , caseSensitivity );
267+ QgsNewNameDialog dialog ( u.name , u.name , extensions, existingNames, regExp , caseSensitivity );
267268 if ( dialog.exec () != QDialog::Accepted )
268269 {
269270 delete provider;
@@ -374,10 +375,9 @@ bool QgsGrassMapsetItem::handleDrop( const QMimeData * data, Qt::DropAction )
374375
375376 if ( !errors.isEmpty () )
376377 {
377- QgsMessageOutput *output = QgsMessageOutput::createMessageOutput ();
378- output->setTitle ( tr ( " Import to GRASS mapset" ) );
379- output->setMessage ( tr ( " Failed to import some layers!\n\n " ) + errors.join ( " \n " ), QgsMessageOutput::MessageText );
380- output->showMessage ();
378+ QgsMessageOutput::showMessage ( tr ( " Import to GRASS mapset" ),
379+ tr ( " Failed to import some layers!\n\n " ) + errors.join ( " \n " ),
380+ QgsMessageOutput::MessageText );
381381 }
382382
383383 return true ;
@@ -407,6 +407,54 @@ QgsGrassObjectItemBase::QgsGrassObjectItemBase( QgsGrassObject grassObject ) :
407407{
408408}
409409
410+ void QgsGrassObjectItemBase::renameGrassObject ( QgsDataItem* parent )
411+ {
412+ QgsDebugMsg ( " Entered" );
413+
414+ QStringList existingNames = QgsGrass::grassObjects ( mGrassObject .mapsetPath (), mGrassObject .type () );
415+ // remove current name to avoid warning that exists
416+ existingNames.removeOne ( mGrassObject .name () );
417+ QgsDebugMsg ( " existingNames = " + existingNames.join ( " ," ) );
418+ QRegExp regExp = QgsGrassObject::newNameRegExp ( mGrassObject .type () );
419+ Qt::CaseSensitivity caseSensitivity = QgsGrass::caseSensitivity ();
420+ QgsNewNameDialog dialog ( mGrassObject .name (), mGrassObject .name (), QStringList (), existingNames, regExp, caseSensitivity );
421+
422+ if ( dialog.exec () != QDialog::Accepted || dialog.name () == mGrassObject .name () )
423+ {
424+ return ;
425+ }
426+
427+ QgsDebugMsg ( " rename " + mGrassObject .name () + " -> " + dialog.name () );
428+
429+ QgsGrassObject obj ( mGrassObject );
430+ obj.setName ( dialog.name () );
431+ QString errorTitle = QObject::tr ( " Rename GRASS %1" ).arg ( mGrassObject .elementName () );
432+ if ( QgsGrass::objectExists ( obj ) )
433+ {
434+ QgsDebugMsg ( obj.name () + " exists -> delete" );
435+ if ( !QgsGrass::deleteObject ( obj ) )
436+ {
437+ QgsMessageOutput::showMessage ( errorTitle, QObject::tr ( " Cannot delete %1" ).arg ( obj.name () ), QgsMessageOutput::MessageText );
438+ return ;
439+ }
440+ }
441+
442+ try
443+ {
444+ QgsGrass::renameObject ( mGrassObject , obj.name () );
445+ if ( parent )
446+ {
447+ parent->refresh ();
448+ }
449+ }
450+ catch ( QgsGrass::Exception &e )
451+ {
452+ QgsMessageOutput::showMessage ( errorTitle,
453+ QObject::tr ( " Cannot rename %1 to %2" ).arg ( mGrassObject .name () ).arg ( obj.name () ) + " \n " + e.what (),
454+ QgsMessageOutput::MessageText );
455+ }
456+ }
457+
410458void QgsGrassObjectItemBase::deleteGrassObject ( QgsDataItem* parent )
411459{
412460 QgsDebugMsg ( " Entered" );
@@ -426,10 +474,10 @@ void QgsGrassObjectItemBase::deleteGrassObject( QgsDataItem* parent )
426474QgsGrassObjectItem::QgsGrassObjectItem ( QgsDataItem* parent, QgsGrassObject grassObject,
427475 QString name, QString path, QString uri,
428476 LayerType layerType, QString providerKey,
429- bool deleteAction )
477+ bool showObjectActions )
430478 : QgsLayerItem( parent, name, path, uri, layerType, providerKey )
431479 , QgsGrassObjectItemBase( grassObject )
432- , mDeleteAction( deleteAction )
480+ , mShowObjectActions( showObjectActions )
433481{
434482 setState ( Populated ); // no children, to show non expandable in browser
435483}
@@ -438,8 +486,12 @@ QList<QAction*> QgsGrassObjectItem::actions()
438486{
439487 QList<QAction*> lst;
440488
441- if ( mDeleteAction )
489+ if ( mShowObjectActions )
442490 {
491+ QAction* actionRename = new QAction ( tr ( " Rename" ), this );
492+ connect ( actionRename, SIGNAL ( triggered () ), this , SLOT ( renameGrassObject () ) );
493+ lst.append ( actionRename );
494+
443495 QAction* actionDelete = new QAction ( tr ( " Delete" ), this );
444496 connect ( actionDelete, SIGNAL ( triggered () ), this , SLOT ( deleteGrassObject () ) );
445497 lst.append ( actionDelete );
@@ -448,6 +500,11 @@ QList<QAction*> QgsGrassObjectItem::actions()
448500 return lst;
449501}
450502
503+ void QgsGrassObjectItem::renameGrassObject ()
504+ {
505+ QgsGrassObjectItemBase::renameGrassObject ( parent () );
506+ }
507+
451508void QgsGrassObjectItem::deleteGrassObject ()
452509{
453510 QgsGrassObjectItemBase::deleteGrassObject ( parent () );
@@ -467,13 +524,22 @@ QList<QAction*> QgsGrassVectorItem::actions()
467524{
468525 QList<QAction*> lst;
469526
527+ QAction* actionRename = new QAction ( tr ( " Rename" ), this );
528+ connect ( actionRename, SIGNAL ( triggered () ), this , SLOT ( renameGrassObject () ) );
529+ lst.append ( actionRename );
530+
470531 QAction* actionDelete = new QAction ( tr ( " Delete" ), this );
471532 connect ( actionDelete, SIGNAL ( triggered () ), this , SLOT ( deleteGrassObject () ) );
472533 lst.append ( actionDelete );
473534
474535 return lst;
475536}
476537
538+ void QgsGrassVectorItem::renameGrassObject ()
539+ {
540+ QgsGrassObjectItemBase::renameGrassObject ( parent () );
541+ }
542+
477543void QgsGrassVectorItem::deleteGrassObject ()
478544{
479545 QgsGrassObjectItemBase::deleteGrassObject ( parent () );
@@ -484,7 +550,7 @@ void QgsGrassVectorItem::deleteGrassObject()
484550QgsGrassVectorLayerItem::QgsGrassVectorLayerItem ( QgsDataItem* parent, QgsGrassObject grassObject, QString layerName,
485551 QString path, QString uri,
486552 LayerType layerType, bool singleLayer )
487- : QgsGrassObjectItem( parent, grassObject, layerName, path, uri, layerType, " grass" )
553+ : QgsGrassObjectItem( parent, grassObject, layerName, path, uri, layerType, " grass" , mSingleLayer )
488554 , mSingleLayer( singleLayer )
489555{
490556}
0 commit comments