1
/*******************************************************************
5
copyright : (C) 2006 by Radim Blazek
6
email : radim.blazek@gmail.com
7
********************************************************************/
8
/********************************************************************
9
This program is free software; you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11
the Free Software Foundation; either version 2 of the License, or
12
(at your option) any later version.
13
*******************************************************************/
17
#include <QApplication>
21
#include <qsettings.h>
22
#include <qstringlist.h>
23
#include <qmessagebox.h>
26
#include <qnamespace.h>
31
#include <QHeaderView>
32
#include <QMainWindow>
33
#include <QActionGroup>
36
#include <QTextBrowser>
42
#include "qgsapplication.h"
43
#include "qgsrasterlayer.h"
46
#include <grass/gis.h>
47
#include <grass/Vect.h>
50
#include "../../src/providers/grass/qgsgrass.h"
51
#include "qgsgrassmodel.h"
52
#include "qgsgrassbrowser.h"
53
#include "qgsgrassselect.h"
54
#include "qgsgrassutils.h"
56
QgsGrassBrowser::QgsGrassBrowser ( QgisIface *iface,
57
QWidget * parent, Qt::WFlags f )
58
:mIface(iface), QMainWindow(parent, Qt::WType_Dialog)
61
std::cerr << "QgsGrassBrowser()" << std::endl;
64
QActionGroup *ag = new QActionGroup ( this );
65
QToolBar *tb = addToolBar(tr("Tools"));
67
QString myIconPath = QgsApplication::themePath() + "/grass/";
68
mActionAddMap = new QAction(
69
QIcon(myIconPath+"grass_add_map.png"),
70
tr("Add selected map to canvas"), this);
71
mActionAddMap->setEnabled(false);
72
ag->addAction ( mActionAddMap );
73
tb->addAction ( mActionAddMap );
74
connect ( mActionAddMap, SIGNAL(triggered()), this, SLOT(addMap()) );
76
mActionCopyMap = new QAction(
77
QIcon(myIconPath+"grass_copy_map.png"),
78
tr("Copy selected map"), this);
79
mActionCopyMap->setEnabled(false);
80
ag->addAction ( mActionCopyMap );
81
tb->addAction ( mActionCopyMap );
82
connect ( mActionCopyMap, SIGNAL(triggered()), this, SLOT(copyMap()) );
84
mActionRenameMap = new QAction(
85
QIcon(myIconPath+"grass_rename_map.png"),
86
tr("Rename selected map"), this);
87
mActionRenameMap->setEnabled(false);
88
ag->addAction ( mActionRenameMap );
89
tb->addAction ( mActionRenameMap );
90
connect ( mActionRenameMap, SIGNAL(triggered()), this, SLOT(renameMap()) );
92
mActionDeleteMap = new QAction(
93
QIcon(myIconPath+"grass_delete_map.png"),
94
tr("Delete selected map"), this);
95
mActionDeleteMap->setEnabled(false);
96
ag->addAction ( mActionDeleteMap );
97
tb->addAction ( mActionDeleteMap );
98
connect ( mActionDeleteMap, SIGNAL(triggered()), this, SLOT(deleteMap()) );
100
mActionSetRegion = new QAction(
101
QIcon(myIconPath+"grass_set_region.png"),
102
tr("Set current region to selected map"), this);
103
mActionSetRegion->setEnabled(false);
104
ag->addAction ( mActionSetRegion );
105
tb->addAction ( mActionSetRegion );
106
connect ( mActionSetRegion, SIGNAL(triggered()), this, SLOT(setRegion()) );
108
mActionRefresh = new QAction(
109
QIcon(myIconPath+"grass_refresh.png"),
110
tr("Refresh"), this);
111
ag->addAction ( mActionRefresh );
112
tb->addAction ( mActionRefresh );
113
connect ( mActionRefresh, SIGNAL(triggered()), this, SLOT(refresh()) );
116
mModel = new QgsGrassModel ( this );
118
mTree = new QTreeView(0);
119
mTree->header()->hide();
120
mTree->setModel(mModel);
122
mTextBrowser = new QTextBrowser(0);
123
mTextBrowser->setTextFormat(Qt::RichText);
124
mTextBrowser->setReadOnly(TRUE);
126
mSplitter = new QSplitter(0);
127
mSplitter->addWidget(mTree);
128
mSplitter->addWidget(mTextBrowser);
130
this->setCentralWidget(mSplitter);
132
connect ( mTree->selectionModel(),
133
SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
134
this, SLOT(selectionChanged(QItemSelection,QItemSelection)) );
136
connect ( mTree->selectionModel(),
137
SIGNAL(currentChanged(QModelIndex,QModelIndex)),
138
this, SLOT(currentChanged(QModelIndex,QModelIndex)) );
140
connect ( mTree, SIGNAL(doubleClicked(QModelIndex)),
141
this, SLOT(doubleClicked(QModelIndex)) );
144
QgsGrassBrowser::~QgsGrassBrowser() { }
146
void QgsGrassBrowser::refresh()
149
std::cerr << "QgsGrassBrowser::refresh()" << std::endl;
156
void QgsGrassBrowser::addMap()
159
std::cerr << "QgsGrassBrowser::addMap()" << std::endl;
162
QModelIndexList indexes = mTree->selectionModel()->selectedIndexes();
163
bool mapSelected = false;
165
QList<QModelIndex>::const_iterator it = indexes.begin();
166
for (; it != indexes.end(); ++it)
168
int type = mModel->itemType(*it);
169
QString uri = mModel->uri(*it);
170
QString mapset = mModel->itemMapset(*it);
171
QString map = mModel->itemMap(*it);
172
if ( type == QgsGrassModel::Raster )
174
std::cerr << "add raster: " << uri.ascii() << std::endl;
175
QgsRasterLayer *layer = new QgsRasterLayer( uri, map );
176
mIface->addRasterLayer(layer);
179
else if ( type == QgsGrassModel::Vector )
181
QgsGrassUtils::addVectorLayers ( mIface,
182
QgsGrass::getDefaultGisdbase(),
183
QgsGrass::getDefaultLocation(),
186
else if ( type == QgsGrassModel::VectorLayer )
189
QStringList list = QgsGrassSelect::vectorLayers(
190
QgsGrass::getDefaultGisdbase(),
191
QgsGrass::getDefaultLocation(),
192
mModel->itemMapset(*it), map );
194
// TODO: common method for vector names
195
QStringList split = QStringList::split ( '/', uri );
196
QString layer = split.last();
198
QString name = QgsGrassUtils::vectorLayerName (
199
map, layer, list.size() );
201
mIface->addVectorLayer( uri, name, "grass");
204
else if ( type == QgsGrassModel::Region )
206
struct Cell_head window;
207
if ( !getItemRegion (*it, &window) ) continue;
208
writeRegion ( &window );
213
void QgsGrassBrowser::doubleClicked(const QModelIndex & index)
216
std::cerr << "QgsGrassBrowser::doubleClicked()" << std::endl;
222
QString QgsGrassBrowser::formatMessage( QString msg )
224
return msg.replace("<","<").replace(">",">").replace("\n","<br>");
227
void QgsGrassBrowser::copyMap()
230
std::cerr << "QgsGrassBrowser::copyMap()" << std::endl;
233
QModelIndexList indexes = mTree->selectionModel()->selectedIndexes();
235
QList<QModelIndex>::const_iterator it = indexes.begin();
236
for (; it != indexes.end(); ++it)
238
int type = mModel->itemType(*it);
239
QString mapset = mModel->itemMapset(*it);
240
QString map = mModel->itemMap(*it);
244
if ( type == QgsGrassModel::Raster )
249
else if ( type == QgsGrassModel::Vector )
254
else if ( type == QgsGrassModel::Region )
260
QgsGrassElementDialog ed;
264
if ( mapset == QgsGrass::getDefaultMapset() )
272
QString newName = ed.getItem ( element, "New name",
273
"New name", suggest, source, &ok );
277
QString module = "g.copy";
279
module.append(".exe");
281
QProcess process(this);
282
QStringList args(typeName + "=" + map + "@" + mapset + "," + newName );
283
process.start(module, args );
284
if ( !process.waitForFinished() || process.exitCode() != 0 )
286
QString output ( process.readAllStandardOutput () );
287
QString error ( process.readAllStandardError () );
288
QMessageBox::warning( 0, tr("Warning"), tr("Cannot copy map ")
290
+ tr("<br>command: ") + module + " " + args.join(" ")
291
+ "<br>" + formatMessage(output)
292
+ "<br>" + formatMessage(error) );
301
void QgsGrassBrowser::renameMap()
304
std::cerr << "QgsGrassBrowser::renameMap()" << std::endl;
307
QModelIndexList indexes = mTree->selectionModel()->selectedIndexes();
309
QList<QModelIndex>::const_iterator it = indexes.begin();
310
for (; it != indexes.end(); ++it)
312
int type = mModel->itemType(*it);
313
QString mapset = mModel->itemMapset(*it);
314
QString map = mModel->itemMap(*it);
316
if ( mapset != QgsGrass::getDefaultMapset() ) continue; // should not happen
320
if ( type == QgsGrassModel::Raster )
325
else if ( type == QgsGrassModel::Vector )
330
else if ( type == QgsGrassModel::Region )
336
QgsGrassElementDialog ed;
338
QString newName = ed.getItem ( element, "New name",
339
"New name", "", map, &ok );
343
QString module = "g.rename";
345
module.append(".exe");
347
QProcess process(this);
348
QStringList args(typeName + "=" + map + "," + newName );
349
process.start(module, QStringList( typeName + "=" + map + "," + newName ) );
350
if ( !process.waitForFinished() || process.exitCode() != 0 )
352
QString output ( process.readAllStandardOutput () );
353
QString error ( process.readAllStandardError () );
354
QMessageBox::warning( 0, tr("Warning"), tr("Cannot rename map ")
356
+ tr("<br>command: ") + module + " " + args.join(" ")
357
+ "<br>" + formatMessage(output)
358
+ "<br>" + formatMessage(error) );
367
void QgsGrassBrowser::deleteMap()
370
std::cerr << "QgsGrassBrowser::deleteMap()" << std::endl;
373
QModelIndexList indexes = mTree->selectionModel()->selectedIndexes();
375
QList<QModelIndex>::const_iterator it = indexes.begin();
376
for (; it != indexes.end(); ++it)
378
int type = mModel->itemType(*it);
379
QString mapset = mModel->itemMapset(*it);
380
QString map = mModel->itemMap(*it);
383
if ( type == QgsGrassModel::Raster ) typeName = "rast";
384
else if ( type == QgsGrassModel::Vector ) typeName = "vect";
385
else if ( type == QgsGrassModel::Region ) typeName = "region";
387
if ( mapset != QgsGrass::getDefaultMapset() )
389
continue; // should not happen
392
int ret = QMessageBox::question ( 0, tr("Warning"),
393
tr("Delete map <b>") + map + "</b>",
394
QMessageBox::Yes, QMessageBox::No );
396
if ( ret == QMessageBox::No ) continue;
398
QString module = "g.remove";
400
module.append(".exe");
402
QProcess process(this);
403
QStringList args(typeName + "=" + map );
404
process.start(module, QStringList( typeName + "=" + map ) );
405
if ( !process.waitForFinished() || process.exitCode() != 0 )
407
QString output ( process.readAllStandardOutput () );
408
QString error ( process.readAllStandardError () );
409
QMessageBox::warning( 0, tr("Warning"), tr("Cannot delete map ")
411
+ tr("<br>command: ") + module + " " + args.join(" ")
412
+ "<br>" + formatMessage(output)
413
+ "<br>" + formatMessage(error) );
422
void QgsGrassBrowser::setRegion()
425
std::cerr << "QgsGrassBrowser::setRegion()" << std::endl;
428
struct Cell_head window;
430
QModelIndexList indexes = mTree->selectionModel()->selectedIndexes();
432
// TODO multiple selection - extent region to all maps
433
QList<QModelIndex>::const_iterator it = indexes.begin();
434
for (; it != indexes.end(); ++it)
436
if ( !getItemRegion (*it, &window) ) return;
438
writeRegion ( &window );
441
void QgsGrassBrowser::writeRegion(struct Cell_head *window )
444
std::cerr << "QgsGrassBrowser::writeRegion()" << std::endl;
447
QgsGrass::setMapset( QgsGrass::getDefaultGisdbase(),
448
QgsGrass::getDefaultLocation(),
449
QgsGrass::getDefaultMapset() );
451
if ( G_put_window ( window ) == -1 )
453
QMessageBox::warning( 0, tr("Warning"),
454
tr("Cannot write new region") );
457
emit regionChanged();
460
bool QgsGrassBrowser::getItemRegion( QModelIndex index, struct Cell_head *window )
463
std::cerr << "QgsGrassBrowser::setRegion()" << std::endl;
466
int type = mModel->itemType(index);
467
QString mapset = mModel->itemMapset(index);
468
QString map = mModel->itemMap(index);
472
case QgsGrassModel::Raster :
473
mapType = QgsGrass::Raster;
475
case QgsGrassModel::Vector :
476
mapType = QgsGrass::Vector;
478
case QgsGrassModel::Region :
479
mapType = QgsGrass::Region;
485
return QgsGrass::mapRegion ( mapType, QgsGrass::getDefaultGisdbase(),
486
QgsGrass::getDefaultLocation(), mapset, map, window );
489
void QgsGrassBrowser::selectionChanged(const QItemSelection & selected, const QItemSelection & deselected)
492
std::cerr << "QgsGrassBrowser::selectionChanged()" << std::endl;
495
mActionAddMap->setEnabled(false);
496
mActionCopyMap->setEnabled(false);
497
mActionRenameMap->setEnabled(false);
498
mActionDeleteMap->setEnabled(false);
499
mActionSetRegion->setEnabled(false);
501
QModelIndexList indexes = mTree->selectionModel()->selectedIndexes();
503
mTextBrowser->clear();
505
QList<QModelIndex>::const_iterator it = indexes.begin();
506
for (; it != indexes.end(); ++it)
508
mTextBrowser->append ( mModel->itemInfo(*it) );
509
mTextBrowser->verticalScrollBar()->setValue(0);
511
int type = mModel->itemType(*it);
512
if ( type == QgsGrassModel::Raster ||
513
type == QgsGrassModel::Vector ||
514
type == QgsGrassModel::VectorLayer )
516
mActionAddMap->setEnabled(true);
518
if ( type == QgsGrassModel::Raster || type == QgsGrassModel::Vector || type == QgsGrassModel::Region )
520
mActionSetRegion->setEnabled(true);
521
mActionCopyMap->setEnabled(true);
523
QString mapset = mModel->itemMapset(*it);
524
if ( mapset == QgsGrass::getDefaultMapset() )
526
mActionDeleteMap->setEnabled(true);
527
mActionRenameMap->setEnabled(true);
533
void QgsGrassBrowser::currentChanged(const QModelIndex & current, const QModelIndex & previous)
536
std::cerr << "QgsGrassBrowser::currentChanged()" << std::endl;
540
void QgsGrassBrowser::setLocation( const QString &gisbase, const QString &location )
542
mModel->setLocation(gisbase, location);