You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

233 lines
6.7 KiB
C

/***************************************************************************
* Copyright (C) gempa GmbH *
* All rights reserved. *
* Contact: gempa GmbH (seiscomp-dev@gempa.de) *
* *
* GNU Affero General Public License Usage *
* This file may be used under the terms of the GNU Affero *
* Public License version 3.0 as published by the Free Software Foundation *
* and appearing in the file LICENSE included in the packaging of this *
* file. Please review the following information to ensure the GNU Affero *
* Public License version 3.0 requirements will be met: *
* https://www.gnu.org/licenses/agpl-3.0.html. *
* *
* Other Usage *
* Alternatively, this file may be used in accordance with the terms and *
* conditions contained in a signed written agreement between you and *
* gempa GmbH. *
***************************************************************************/
#ifndef SEISCOMP_GUI_PLOT_ABSTRACTGRAPH_H
#define SEISCOMP_GUI_PLOT_ABSTRACTGRAPH_H
#include <seiscomp/gui/plot/axis.h>
#include <seiscomp/gui/plot/abstractdataset.h>
#include <QObject>
#include <QColor>
#include <QPolygonF>
namespace Seiscomp {
namespace Gui {
class AbstractDataSet;
class SC_GUI_API Graph : public QObject {
// ----------------------------------------------------------------------
// X'truction
// ----------------------------------------------------------------------
public:
//! C'tor
explicit Graph(Axis *keyAxis, Axis *valueAxis, QObject *parent=0);
explicit Graph(const QString &name, Axis *keyAxis, Axis *valueAxis, QObject *parent=0);
// ----------------------------------------------------------------------
// Meta data
// ----------------------------------------------------------------------
public:
void setName(const QString &name);
const QString &name() const;
// ----------------------------------------------------------------------
// Setup
// ----------------------------------------------------------------------
public:
/**
* @brief Sets the pen used to draw the graph
* @param p The pen
*/
void setPen(const QPen &p);
const QPen &pen() const;
/**
* @brief Sets the primary (line) color of the graph.
* @param c The color
*/
void setColor(QColor c);
QColor color() const;
/**
* @brief Sets the line width of the graph.
* @param lw The line width in pixels
*/
void setLineWidth(int lw);
int lineWidth() const;
/**
* @brief Sets whether anti aliasing should be enabled or not.
* @param e Flag
*/
void setAntiAliasing(bool e);
bool antiAliasing() const;
/**
* @brief Sets whether to drop a show in the plot or not for this graph
* @param e Flag
*/
void setDropShadow(bool e);
bool dropShadow() const;
// ----------------------------------------------------------------------
// Query interface
// ----------------------------------------------------------------------
public:
Axis *keyAxis() const;
Axis *valueAxis() const;
void setData(AbstractDataSet *data);
AbstractDataSet *data() const;
bool isEmpty() const { return count() == 0; }
int count() const;
Range getXRange() const;
Range getYRange() const;
void getBounds(Range &x, Range &y) const;
/**
* @brief Convenience function that returns a QRectF instead of two
* single ranges.
* @return The bounding rectangle of the graph data
*/
QRectF getBounds() const;
// ----------------------------------------------------------------------
// Data interface
// ----------------------------------------------------------------------
public:
void setVisible(bool visible);
bool isVisible() const { return _visible; }
void clear();
/**
* @brief Unprojects the data from axis space to pixel space
* @param poly The target polygon that holds the projected and possibly
* clipped data. Note that the number of points in the
* polygon does not necessarily match the number of points
* in the graph due to clipping.
*/
virtual void unproject(QPolygonF &poly) const;
// ----------------------------------------------------------------------
// Render interface
// ----------------------------------------------------------------------
public:
/**
* @brief Draws the graph. The default implementation projects the
* associated dataset to screen coordinates and renders a
* polyline with the configured pen and style.
*
* Derived classes can reimplement this method to do custom drawing.
* Note that screen space projection must be inverted to accomodate
* for top-down coordinate system. The plot sets up the correct
* clipping and translation before calling this method.
*
* @param p The painter
*/
virtual void draw(QPainter &p);
/**
* @brief Draws a symbol to represent the graph. This is used by e.g.
* legends. The default implementation draws a horizontal line
* with the configured pen. The line is vertically centered in
* the target rectangle.
* @param p The painter
* @param r The target rect
*/
virtual void drawSymbol(QPainter &p, const QRect &r);
// ----------------------------------------------------------------------
// Protected members
// ----------------------------------------------------------------------
protected:
// Meta data
QString _name;
// Context
Axis *_keyAxis;
Axis *_valueAxis;
AbstractDataSet *_data;
// Setup
bool _visible;
QPen _pen;
bool _antiAliasing;
bool _dropShadow;
};
inline const QString &Graph::name() const {
return _name;
}
inline Axis *Graph::keyAxis() const {
return _keyAxis;
}
inline Axis *Graph::valueAxis() const {
return _valueAxis;
}
inline void Graph::setData(AbstractDataSet *data) {
_data = data;
}
inline AbstractDataSet *Graph::data() const {
return _data;
}
inline int Graph::count() const {
return _data != nullptr ? _data->count() : 0;
}
inline Range Graph::getXRange() const {
return _data != nullptr ? _data->getXRange() : Range();
}
inline Range Graph::getYRange() const {
return _data != nullptr ? _data->getYRange() : Range();
}
inline void Graph::clear() {
if ( _data != nullptr ) _data->clear();
}
}
}
#endif