mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-26 00:02:08 -05:00
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@4234 c8812cc2-4d05-0410-92ff-de0c093fc19c
312 lines
8.9 KiB
C++
312 lines
8.9 KiB
C++
/***************************************************************************
|
|
qgsgrasstools.cpp
|
|
-------------------
|
|
begin : March, 2005
|
|
copyright : (C) 2005 by Radim Blazek
|
|
email : blazek@itc.it
|
|
***************************************************************************/
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
#include <iostream>
|
|
|
|
#include <qapplication.h>
|
|
#include <qdir.h>
|
|
#include <qfile.h>
|
|
#include <q3filedialog.h>
|
|
#include <qsettings.h>
|
|
#include <qpixmap.h>
|
|
#include <q3listbox.h>
|
|
#include <qstringlist.h>
|
|
#include <qlabel.h>
|
|
#include <q3combobox.h>
|
|
#include <qspinbox.h>
|
|
#include <qmessagebox.h>
|
|
#include <qinputdialog.h>
|
|
#include <qsettings.h>
|
|
#include <qpainter.h>
|
|
#include <qpixmap.h>
|
|
#include <qpen.h>
|
|
#include <q3pointarray.h>
|
|
#include <qcursor.h>
|
|
#include <qnamespace.h>
|
|
#include <q3listview.h>
|
|
#include <qcolordialog.h>
|
|
#include <q3table.h>
|
|
#include <qstatusbar.h>
|
|
#include <qevent.h>
|
|
#include <qpoint.h>
|
|
#include <qsize.h>
|
|
#include <qdom.h>
|
|
#include <qtabwidget.h>
|
|
#include <qlayout.h>
|
|
#include <qcheckbox.h>
|
|
#include <q3process.h>
|
|
#include <qicon.h>
|
|
//Added by qt3to4:
|
|
#include <QCloseEvent>
|
|
|
|
#include "../../src/qgis.h"
|
|
#include "../../src/qgsmapcanvas.h"
|
|
#include "../../src/qgsmaplayer.h"
|
|
#include "../../src/qgsvectorlayer.h"
|
|
#include "../../src/qgsdataprovider.h"
|
|
#include "../../src/qgsfield.h"
|
|
#include "../../src/qgsfeatureattribute.h"
|
|
|
|
extern "C" {
|
|
#include <gis.h>
|
|
#include <Vect.h>
|
|
}
|
|
|
|
#include "../../providers/grass/qgsgrass.h"
|
|
#include "../../providers/grass/qgsgrassprovider.h"
|
|
#include "qgsgrassattributes.h"
|
|
#include "qgsgrasstools.h"
|
|
#include "qgsgrassmodule.h"
|
|
#include "qgsgrassshell.h"
|
|
|
|
QgsGrassTools::QgsGrassTools ( QgisApp *qgisApp, QgisIface *iface,
|
|
QWidget * parent, const char * name, Qt::WFlags f )
|
|
:QgsGrassToolsBase ( parent, name, f )
|
|
{
|
|
#ifdef QGISDEBUG
|
|
std::cerr << "QgsGrassTools()" << std::endl;
|
|
#endif
|
|
|
|
mQgisApp = qgisApp;
|
|
mIface = iface;
|
|
mCanvas = mIface->getMapCanvas();
|
|
|
|
// Set list view
|
|
mModulesListView->setColumnText(0,"Modules");
|
|
mModulesListView->clear();
|
|
mModulesListView->setSorting(-1);
|
|
mModulesListView->setRootIsDecorated(true);
|
|
mModulesListView->setResizeMode(Q3ListView::AllColumns);
|
|
mModulesListView->header()->hide();
|
|
|
|
connect( mModulesListView, SIGNAL(clicked(Q3ListViewItem *)),
|
|
this, SLOT(moduleClicked( Q3ListViewItem *)) );
|
|
|
|
#if defined(WIN32) || defined(Q_OS_MACX)
|
|
mAppDir = qApp->applicationDirPath();
|
|
#else
|
|
mAppDir = PREFIX;
|
|
#endif
|
|
|
|
QString title = "GRASS Tools: " + QgsGrass::getDefaultLocation()
|
|
+ "/" + QgsGrass::getDefaultMapset();
|
|
setCaption(title);
|
|
|
|
QString conf = mAppDir + "/share/qgis/grass/config/default.qgc";
|
|
loadConfig ( conf );
|
|
statusBar()->hide();
|
|
restorePosition();
|
|
}
|
|
|
|
void QgsGrassTools::moduleClicked( Q3ListViewItem * item )
|
|
{
|
|
if ( !item ) return;
|
|
|
|
QString name = item->text(1);
|
|
//std::cerr << "name = " << name << std::endl;
|
|
|
|
if ( name.length() == 0 ) return; // Section
|
|
|
|
QString path = mAppDir + "/share/qgis/grass/modules/" + name;
|
|
QWidget *m;
|
|
QgsGrassShell *sh = 0;
|
|
if ( name == "shell" )
|
|
{
|
|
#ifdef HAVE_OPENPTY
|
|
sh = new QgsGrassShell(this, mTabWidget);
|
|
m = dynamic_cast<QWidget *> ( sh );
|
|
#else
|
|
QMessageBox::warning( 0, "Warning", "GRASS Shell is not compiled." );
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
m = dynamic_cast<QWidget *> ( new QgsGrassModule ( this,
|
|
mQgisApp, mIface, path, mTabWidget ) );
|
|
}
|
|
|
|
//mTabWidget->addTab ( m, item->text(0) );
|
|
QPixmap pixmap = QgsGrassModule::pixmap ( path, 25 );
|
|
QIcon is;
|
|
is.setPixmap ( pixmap, QIcon::Small, QIcon::Normal );
|
|
mTabWidget->addTab ( m, is, "" );
|
|
|
|
mTabWidget->setCurrentPage ( mTabWidget->count()-1 );
|
|
|
|
// We must call resize to reset COLUMNS enviroment variable
|
|
// used by bash !!!
|
|
if ( sh ) sh->resizeTerminal();
|
|
}
|
|
|
|
bool QgsGrassTools::loadConfig(QString filePath)
|
|
{
|
|
#ifdef QGISDEBUG
|
|
std::cerr << "QgsGrassTools::loadConfig(): " << filePath.toLocal8Bit().data() << std::endl;
|
|
#endif
|
|
mModulesListView->clear();
|
|
|
|
QFile file ( filePath );
|
|
|
|
if ( !file.exists() ) {
|
|
QMessageBox::warning( 0, "Warning", "The config file (" + filePath + ") not found." );
|
|
return false;
|
|
}
|
|
if ( ! file.open( QIODevice::ReadOnly ) ) {
|
|
QMessageBox::warning( 0, "Warning", "Cannot open config file (" + filePath + ")" );
|
|
return false;
|
|
}
|
|
|
|
QDomDocument doc ( "qgisgrass" );
|
|
QString err;
|
|
int line, column;
|
|
if ( !doc.setContent( &file, &err, &line, &column ) ) {
|
|
QString errmsg = "Cannot read config file (" + filePath + "):\n" + err + "\nat line "
|
|
+ QString::number(line) + " column " + QString::number(column);
|
|
std::cerr << errmsg.toLocal8Bit().data() << std::endl;
|
|
QMessageBox::warning( 0, "Warning", errmsg );
|
|
file.close();
|
|
return false;
|
|
}
|
|
|
|
QDomElement docElem = doc.documentElement();
|
|
QDomNodeList modulesNodes = docElem.elementsByTagName ( "modules" );
|
|
|
|
if ( modulesNodes.count() == 0 ) {
|
|
file.close();
|
|
return false;
|
|
}
|
|
|
|
QDomNode modulesNode = modulesNodes.item(0);
|
|
QDomElement modulesElem = modulesNode.toElement();
|
|
|
|
// Go through the sections and modules and add them to the list view
|
|
addModules ( 0, modulesElem );
|
|
|
|
file.close();
|
|
}
|
|
|
|
void QgsGrassTools::addModules ( Q3ListViewItem *parent, QDomElement &element )
|
|
{
|
|
QDomNode n = element.firstChild();
|
|
|
|
Q3ListViewItem *item;
|
|
Q3ListViewItem *lastItem = 0;
|
|
while( !n.isNull() ) {
|
|
QDomElement e = n.toElement();
|
|
if( !e.isNull() ) {
|
|
//std::cout << "tag = " << e.tagName() << std::endl;
|
|
|
|
if ( e.tagName() == "section" && e.tagName() == "grass" ) {
|
|
std::cout << "Unknown tag: " << e.tagName().toLocal8Bit().data() << std::endl;
|
|
continue;
|
|
}
|
|
|
|
if ( parent ) {
|
|
item = new Q3ListViewItem( parent, lastItem );
|
|
} else {
|
|
item = new Q3ListViewItem( mModulesListView, lastItem );
|
|
}
|
|
|
|
if ( e.tagName() == "section" ) {
|
|
QString label = e.attribute("label");
|
|
std::cout << "label = " << label.toLocal8Bit().data() << std::endl;
|
|
item->setText( 0, label );
|
|
item->setOpen(true); // for debuging to spare one click
|
|
|
|
addModules ( item, e );
|
|
|
|
lastItem = item;
|
|
} else if ( e.tagName() == "grass" ) { // GRASS module
|
|
QString name = e.attribute("name");
|
|
std::cout << "name = " << name.toLocal8Bit().data() << std::endl;
|
|
|
|
QString path = mAppDir + "/share/qgis/grass/modules/" + name;
|
|
QString label = QgsGrassModule::label ( path );
|
|
QPixmap pixmap = QgsGrassModule::pixmap ( path, 25 );
|
|
|
|
item->setText( 0, label );
|
|
item->setPixmap( 0, pixmap );
|
|
item->setText( 1, name );
|
|
lastItem = item;
|
|
}
|
|
}
|
|
n = n.nextSibling();
|
|
}
|
|
}
|
|
|
|
void QgsGrassTools::mapsetChanged()
|
|
{
|
|
#ifdef QGISDEBUG
|
|
std::cerr << "QgsGrassTools::mapsetChanged()" << std::endl;
|
|
#endif
|
|
|
|
QString title = "GRASS Tools: " + QgsGrass::getDefaultLocation()
|
|
+ "/" + QgsGrass::getDefaultMapset();
|
|
setCaption(title);
|
|
|
|
// TODO: Close opened tools (tabs) ?
|
|
}
|
|
|
|
QgsGrassTools::~QgsGrassTools()
|
|
{
|
|
#ifdef QGISDEBUG
|
|
std::cerr << "QgsGrassTools::~QgsGrassTools()" << std::endl;
|
|
#endif
|
|
saveWindowLocation();
|
|
}
|
|
|
|
QString QgsGrassTools::appDir(void)
|
|
{
|
|
return mAppDir;
|
|
}
|
|
|
|
void QgsGrassTools::close(void)
|
|
{
|
|
saveWindowLocation();
|
|
hide();
|
|
}
|
|
|
|
void QgsGrassTools::closeEvent(QCloseEvent *e)
|
|
{
|
|
saveWindowLocation();
|
|
e->accept();
|
|
}
|
|
|
|
void QgsGrassTools::restorePosition()
|
|
{
|
|
QSettings settings;
|
|
int ww = settings.readNumEntry("/qgis/grass/windows/tools/w", 250);
|
|
int wh = settings.readNumEntry("/qgis/grass/windows/tools/h", 300);
|
|
int wx = settings.readNumEntry("/qgis/grass/windows/tools/x", 100);
|
|
int wy = settings.readNumEntry("/qgis/grass/windows/tools/y", 100);
|
|
resize(ww,wh);
|
|
move(wx,wy);
|
|
QgsGrassToolsBase::show();
|
|
}
|
|
|
|
void QgsGrassTools::saveWindowLocation()
|
|
{
|
|
QSettings settings;
|
|
QPoint p = this->pos();
|
|
QSize s = this->size();
|
|
settings.writeEntry("/qgis/grass/windows/tools/x", p.x());
|
|
settings.writeEntry("/qgis/grass/windows/tools/y", p.y());
|
|
settings.writeEntry("/qgis/grass/windows/tools/w", s.width());
|
|
settings.writeEntry("/qgis/grass/windows/tools/h", s.height());
|
|
}
|
|
|
|
|
|
|