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
535 lines
12 KiB
C++
535 lines
12 KiB
C++
//Added by qt3to4:
|
|
#include <QMouseEvent>
|
|
#include <Q3Frame>
|
|
#include <QKeyEvent>
|
|
#include <QCloseEvent>
|
|
#include <QPixmap>
|
|
/**********************************************************************
|
|
qgsgrassmapcalc.h
|
|
-------------------
|
|
begin : September, 2005
|
|
copyright : (C) 2005 by Radim Blazek
|
|
email : radim.blazek@gmail.com
|
|
**********************************************************************/
|
|
/************************************************************************
|
|
* 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. *
|
|
*************************************************************************/
|
|
#ifndef QGSGRASSMAPCALC_H
|
|
#define QGSGRASSMAPCALC_H
|
|
|
|
class QCloseEvent;
|
|
class QString;
|
|
class QStringList;
|
|
class Q3GroupBox;
|
|
class Q3Frame;
|
|
class Q3ListView;
|
|
class QDomNode;
|
|
class QDomElement;
|
|
class QComboBox;
|
|
class QLineEdit;
|
|
class QPixmap;
|
|
|
|
#include <vector>
|
|
#include <q3groupbox.h>
|
|
#include <qcheckbox.h>
|
|
#include <q3process.h>
|
|
#include <q3canvas.h>
|
|
|
|
// Must be here, so that it is included to moc file
|
|
#include "../../src/qgisapp.h"
|
|
#include "../../src/qgisiface.h"
|
|
|
|
class QgsGrassProvider;
|
|
class QgsGrassTools;
|
|
class QgsGrassModuleItem;
|
|
class QgsGrassMapcalcView;
|
|
class QgsGrassMapcalcFunction;
|
|
class QgsGrassMapcalcItem;
|
|
class QgsGrassMapcalcObject;
|
|
class QgsGrassMapcalcConnector;
|
|
#include "qgsgrassmapcalcbase.h"
|
|
#include "qgsgrassmodule.h"
|
|
|
|
/*!
|
|
* \class QgsGrassMapcalc
|
|
* \brief Interface for r.mapcalc
|
|
*/
|
|
class QgsGrassMapcalc: public QgsGrassMapcalcBase, public QgsGrassModuleOptions
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
//! Constructor
|
|
QgsGrassMapcalc (
|
|
QgsGrassTools *tools, QgsGrassModule *module,
|
|
QgisApp *qgisApp, QgisIface *iface,
|
|
QWidget * parent = 0, const char * name = 0, Qt::WFlags f = 0 );
|
|
|
|
//! Destructor
|
|
~QgsGrassMapcalc();
|
|
|
|
// Current tool
|
|
enum Tool {
|
|
AddMap = 0,
|
|
AddConstant,
|
|
AddFunction,
|
|
AddConnector,
|
|
Select
|
|
};
|
|
|
|
//! Get module options as list of arguments for QProcess
|
|
QStringList arguments();
|
|
|
|
/** \brief recieves contentsMousePressEvent from view */
|
|
void contentsMousePressEvent(QMouseEvent*);
|
|
|
|
/** \brief recieves contentsMouseReleaseEvent from view */
|
|
void contentsMouseReleaseEvent(QMouseEvent*);
|
|
|
|
/** \brief recieves contentsMouseMoveEvent from view */
|
|
void contentsMouseMoveEvent(QMouseEvent*);
|
|
|
|
void keyPressEvent ( QKeyEvent * e );
|
|
|
|
/** Cut coordinates by current canvas extent */
|
|
void limit ( QPoint* );
|
|
|
|
/** Grow canvas and move items */
|
|
void growCanvas (int left, int right, int top, int bottom);
|
|
|
|
/** Grow automaticaly if an item is near border */
|
|
void autoGrow();
|
|
|
|
void resizeCanvas( int width, int height);
|
|
|
|
/** Show/hide options for tool */
|
|
void showOptions ( int tool );
|
|
|
|
/** Set option for selected object */
|
|
void setOption(void);
|
|
|
|
public slots:
|
|
//! Add new map
|
|
void addMap(void);
|
|
|
|
//! Add constant
|
|
void addConstant(void);
|
|
|
|
//! Add function
|
|
void addFunction(void);
|
|
|
|
//! Add connection
|
|
void addConnection(void);
|
|
|
|
//! Select item
|
|
void selectItem(void);
|
|
|
|
//! Delete selected item
|
|
void deleteItem(void);
|
|
|
|
//! Reset tool actions togles
|
|
void setToolActionsOff(void);
|
|
|
|
//! Set currnt tool and toggle menu
|
|
void setTool ( int );
|
|
|
|
//! Map selection changed
|
|
void mapChanged();
|
|
|
|
//! Constant changed
|
|
void constantChanged();
|
|
|
|
//! Function selection changed
|
|
void functionChanged();
|
|
|
|
//! Save current state to file
|
|
void save();
|
|
void saveAs();
|
|
|
|
//! Load from file
|
|
void load();
|
|
|
|
//! Remove all items including output
|
|
void clear();
|
|
|
|
// Get next item id and increase counter
|
|
int nextId() { return mNextId++; }
|
|
|
|
private:
|
|
// Canvas view
|
|
QgsGrassMapcalcView *mView;
|
|
|
|
// Canvas
|
|
Q3Canvas *mCanvas;
|
|
|
|
// Tool
|
|
int mTool;
|
|
int mToolStep;
|
|
|
|
// Pointer to current object
|
|
QgsGrassMapcalcObject *mObject;
|
|
|
|
// Pointer to current connector
|
|
QgsGrassMapcalcConnector *mConnector;
|
|
|
|
// Update combobox with maps
|
|
void updateMaps();
|
|
|
|
//! Vector of map@mapset in the combobox
|
|
std::vector<QString> mMaps;
|
|
|
|
//! Last point position
|
|
QPoint mLastPoint;
|
|
|
|
//! Start point with move
|
|
QPoint mStartMovePoint;
|
|
|
|
//! Start end points of connector with move
|
|
std::vector<QPoint> mStartMoveConnectorPoints;
|
|
|
|
//! Available functions
|
|
std::vector<QgsGrassMapcalcFunction> mFunctions;
|
|
|
|
//! Output object
|
|
QgsGrassMapcalcObject *mOutput;
|
|
|
|
//! Current file name, empty if no file is loaded/saved
|
|
QString mFileName;
|
|
|
|
//! Item id
|
|
int mNextId;
|
|
|
|
//! Background
|
|
Q3CanvasRectangle *mPaper;
|
|
};
|
|
|
|
/*
|
|
* Function. Represents function or operator data.
|
|
*/
|
|
class QgsGrassMapcalcFunction
|
|
{
|
|
public:
|
|
enum Type {
|
|
Operator = 0,
|
|
Function
|
|
};
|
|
|
|
QgsGrassMapcalcFunction() {};
|
|
QgsGrassMapcalcFunction( int type, QString name, int count =2,
|
|
QString description = 0, QString label = 0,
|
|
QString labels = 0, bool drawLabel = true );
|
|
~QgsGrassMapcalcFunction() {};
|
|
|
|
QString name() { return mName; }
|
|
int type() { return mType; }
|
|
int inputCount() { return mInputCount; }
|
|
QString label() { return mLabel; }
|
|
QString description() { return mDescription; }
|
|
QStringList inputLabels() { return mInputLabels; }
|
|
bool drawlabel() { return mDrawLabel; }
|
|
|
|
private:
|
|
/* Value used in expression, e.g. 'if' */
|
|
QString mName;
|
|
|
|
int mType;
|
|
|
|
/* Number of inputs */
|
|
int mInputCount;
|
|
|
|
/* Identification name, eg. 'if(x,a,b)' */
|
|
//QString mName;
|
|
|
|
/* Label used in combobox and objects */
|
|
QString mLabel;
|
|
|
|
/* More detailed description */
|
|
QString mDescription;
|
|
|
|
/* Input labels */
|
|
QStringList mInputLabels;
|
|
|
|
// Draw main label in box
|
|
bool mDrawLabel;
|
|
};
|
|
|
|
/******************** CANVAS ITEMS *****************************/
|
|
/*
|
|
* Base class inherited by QgsGrassMapcalcObject and
|
|
* QgsGrassMapcalcConnector
|
|
*/
|
|
class QgsGrassMapcalcItem
|
|
{
|
|
public:
|
|
QgsGrassMapcalcItem();
|
|
virtual ~QgsGrassMapcalcItem();
|
|
|
|
virtual void setSelected( bool s );
|
|
bool selected( void );
|
|
// virtual void draw ( QPainter & painter );
|
|
//
|
|
int id() { return mId; }
|
|
void setId( int id ) { mId = id; }
|
|
|
|
protected:
|
|
bool mSelected;
|
|
|
|
int mId;
|
|
};
|
|
|
|
/*
|
|
* QgsGrassMapcalcObject represents map, constant or function
|
|
*
|
|
* All coordinates are calculated from mCenter using font size,
|
|
* number of input and labels.
|
|
*
|
|
* QCanvasRectangle.x()
|
|
* |
|
|
* | mRect.x()
|
|
* | | mCenter.x()
|
|
* | | |
|
|
* +----------------------------+------QCanvasRectangle.y()
|
|
* | +------------------------+ |---mRect.y()
|
|
* | | +---------+ | |
|
|
* |o| | Input 1 | | |
|
|
* | | +---------+ +--------+ | |----------------+
|
|
* +---| | | Label | |o|--mCenter.y() |
|
|
* | | | +---------+ +--------+ | |----------------+
|
|
* | |o| | Input 2 | | | |
|
|
* | | | +---------+ | | mTextHeight
|
|
* +---| +------------------------+ |
|
|
* | +----------------------------+
|
|
* | | | | | |
|
|
* | | | | +-+---mMargin = 2*mSocketHalf+1
|
|
* | +---------+-- mInputTextWidth
|
|
* | |
|
|
* mInputHeight mLabelX
|
|
*/
|
|
class QgsGrassMapcalcObject: public Q3CanvasRectangle, public QgsGrassMapcalcItem
|
|
{
|
|
public:
|
|
enum Type {
|
|
Map = 0, // raster map
|
|
Constant,
|
|
Function,
|
|
Output
|
|
};
|
|
|
|
enum Dir {
|
|
In = 0,
|
|
Out,
|
|
None
|
|
};
|
|
|
|
QgsGrassMapcalcObject( int type );
|
|
~QgsGrassMapcalcObject();
|
|
|
|
// Set map name, constant value or function/operator
|
|
void setValue( QString val, QString lab = 0);
|
|
|
|
// Set function
|
|
void setFunction ( QgsGrassMapcalcFunction f );
|
|
|
|
void draw ( QPainter & painter );
|
|
|
|
// Set object center
|
|
void setCenter ( int, int );
|
|
|
|
// Get center point
|
|
QPoint center() { return mCenter; }
|
|
|
|
// Recalculate size
|
|
void resetSize();
|
|
|
|
void setSelected( bool s );
|
|
|
|
// Try to connect connector end
|
|
bool tryConnect ( QgsGrassMapcalcConnector *, int );
|
|
|
|
// Get socket coordinates
|
|
QPoint socketPoint ( int direction , int socket );
|
|
|
|
// Set socket's connector
|
|
void setConnector ( int direction, int socket,
|
|
QgsGrassMapcalcConnector *connector = 0, int end = 0 );
|
|
|
|
// Object type
|
|
int type();
|
|
|
|
// Value
|
|
QString value() { return mValue; }
|
|
|
|
// label
|
|
QString label() { return mLabel; }
|
|
|
|
//! Function
|
|
QgsGrassMapcalcFunction function() { return mFunction; }
|
|
|
|
// Expression
|
|
QString expression();
|
|
|
|
private:
|
|
// bool mSelected;
|
|
|
|
// Object type: Map,Constant,Function
|
|
int mType;
|
|
|
|
// Map name, constant or function/operator
|
|
QString mValue;
|
|
|
|
// Label
|
|
QString mLabel;
|
|
|
|
// Number of inputs
|
|
int mInputCount;
|
|
|
|
// Number of outputs (0 or 1)
|
|
int mOutputCount;
|
|
|
|
// Funcion
|
|
QgsGrassMapcalcFunction mFunction;
|
|
|
|
// Label font
|
|
QFont mFont;
|
|
|
|
// Drawn rectangle
|
|
QRect mRect;
|
|
|
|
// Rounding of box
|
|
int mRound;
|
|
|
|
// Center of object
|
|
QPoint mCenter;
|
|
|
|
// Half size of socket symbol
|
|
int mSocketHalf;
|
|
|
|
// Margin beteween mRect and QCanvasRectangle.rect()
|
|
int mMargin;
|
|
|
|
// Space between text boxes
|
|
int mSpace;
|
|
|
|
// Height of text box
|
|
int mTextHeight;
|
|
|
|
// Maximum width of input labels
|
|
int mInputTextWidth;
|
|
|
|
// Label box
|
|
QRect mLabelRect;
|
|
|
|
// Coordinates of input sockets
|
|
std::vector<QPoint> mInputPoints;
|
|
|
|
// Coordinates of output
|
|
QPoint mOutputPoint;
|
|
|
|
// Selection box size
|
|
int mSelectionBoxSize;
|
|
|
|
// Input connectors
|
|
std::vector<QgsGrassMapcalcConnector *> mInputConnectors;
|
|
std::vector<int> mInputConnectorsEnd;
|
|
|
|
// Output connector
|
|
QgsGrassMapcalcConnector *mOutputConnector;
|
|
int mOutputConnectorEnd;
|
|
|
|
};
|
|
|
|
/*
|
|
* Connector.
|
|
* End are stored in vectors with indexes 0,1
|
|
*/
|
|
class QgsGrassMapcalcConnector: public Q3CanvasLine, public QgsGrassMapcalcItem
|
|
{
|
|
public:
|
|
QgsGrassMapcalcConnector( Q3Canvas * );
|
|
~QgsGrassMapcalcConnector();
|
|
|
|
void draw ( QPainter & painter );
|
|
|
|
// Set connector end point coordinates
|
|
void setPoint ( int, QPoint );
|
|
|
|
QPoint point ( int );
|
|
|
|
// Recalculate size
|
|
//void resetSize();
|
|
|
|
void setSelected( bool s );
|
|
|
|
// Select end
|
|
void selectEnd( QPoint );
|
|
|
|
// Which end is selected
|
|
int selectedEnd();
|
|
|
|
// Try to connect specified end to an object
|
|
bool tryConnectEnd ( int end);
|
|
|
|
// Register end as connected to object/input
|
|
// If this end of connector was connected to an object
|
|
// the connection is also deleted from object
|
|
// If object is NULL the old connection is deleted.
|
|
void setSocket ( int end, QgsGrassMapcalcObject *object = 0,
|
|
int direction = QgsGrassMapcalcObject::None,
|
|
int socket = 0
|
|
);
|
|
|
|
// Returnt pointer to object on end
|
|
QgsGrassMapcalcObject *object(int end);
|
|
|
|
// End object direction
|
|
int socketDirection ( int end ) { return mSocketDir[end]; }
|
|
|
|
// End object socket number
|
|
int socket ( int end ) { return mSocket[end]; }
|
|
|
|
// Refresh/repaint
|
|
void repaint();
|
|
|
|
// Is it connected to a socket of given direction
|
|
bool connected ( int direction );
|
|
|
|
// Expression
|
|
QString expression();
|
|
|
|
private:
|
|
// Coordinates of ends
|
|
std::vector<QPoint> mPoints;
|
|
|
|
// Selected end, -1 for whole connector
|
|
int mSelectedEnd;
|
|
|
|
// Connected objects
|
|
std::vector<QgsGrassMapcalcObject *> mSocketObjects;
|
|
std::vector<int> mSocketDir;
|
|
std::vector<int> mSocket;
|
|
};
|
|
|
|
/******************** CANVAS VIEW ******************************/
|
|
class QgsGrassMapcalcView: public Q3CanvasView
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
QgsGrassMapcalcView (QgsGrassMapcalc *mapcalc, QWidget* parent=0, const char* name=0, Qt::WFlags f=0);
|
|
|
|
protected:
|
|
void contentsMousePressEvent(QMouseEvent*);
|
|
void contentsMouseReleaseEvent(QMouseEvent*);
|
|
void contentsMouseMoveEvent(QMouseEvent*);
|
|
void keyPressEvent ( QKeyEvent * e );
|
|
|
|
private:
|
|
QgsGrassMapcalc *mMapcalc;
|
|
|
|
};
|
|
|
|
#endif // QGSGRASSMAPCALC_H
|