summaryrefslogtreecommitdiffstats
path: root/plugins/stats/ChartDrawer.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/stats/ChartDrawer.h')
-rw-r--r--plugins/stats/ChartDrawer.h281
1 files changed, 281 insertions, 0 deletions
diff --git a/plugins/stats/ChartDrawer.h b/plugins/stats/ChartDrawer.h
new file mode 100644
index 0000000..741240e
--- /dev/null
+++ b/plugins/stats/ChartDrawer.h
@@ -0,0 +1,281 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@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. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef CHARTDRAWER_H_
+#define CHARTDRAWER_H_
+
+#include <qwidget.h>
+#include <qpainter.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qmime.h>
+#include <qimage.h>
+
+#include <klocale.h>
+
+#include <vector>
+#include <cmath>
+#include <algorithm> //fill
+
+#include "ChartDrawerData.h"
+
+namespace kt {
+
+/**
+\brief Widget for drawing line charts
+\author Krzysztof Kundzicz <athantor@gmail.com>
+*/
+class ChartDrawer : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ ///Type used as widget size unit
+ typedef uint32_t wgtsize_t;
+ ///Type used as unit in chart
+ typedef int64_t wgtunit_t;
+ /**
+ \brief Type used for data storing
+ \sa ChartDrawerData
+ */
+ typedef std::vector<ChartDrawerData> val_t;
+ ///Determines max mode
+ enum MaxMode { MaxModeTop, MaxModeExact };
+
+ private:
+ ///Maximum X value
+ wgtsize_t mXMax;
+ ///Maximum Y value
+ wgtsize_t mYMax;
+ ///Auto maximum setting
+ bool mAutoMax;
+ ///Chart data
+ val_t mEls;
+ ///Name of the chart unit
+ QString mUnitName;
+ ///Mark max
+ std::vector<bool> mMarkMax;
+ ///Max mode
+ MaxMode mMMode;
+
+ ///Paint event handler
+ void paintEvent ( QPaintEvent * );
+ /**
+ \brief Draws chart's frame
+ \param rPnt Painter on which things will be drawn
+ */
+ void DrawFrame(QPainter &rPnt);
+ /**
+ \brief Draws chart's scale
+ \param rPnt Painter on which things will be drawn
+ */
+ void DrawScale(QPainter &rPnt);
+ /**
+ \brief Draws chart
+ \param rPnt Painter on which things will be drawn
+ */
+ void DrawChart(QPainter &rPnt);
+
+ /**
+ \brief Gets distance between two values on OY
+ \return Distance
+ */
+ inline wgtsize_t GetYScale() const;
+
+ /**
+ \brief Translates widget Y coord to cartesian
+ \param y Coord
+ \return Coord
+ */
+ inline wgtunit_t TrY(const wgtunit_t y) const;
+ /**
+ \brief Returns charts height
+ \return Height
+
+ Return only height of the chart's inside the frame — not the whole widget's
+ */
+ inline wgtunit_t height() const;
+ /**
+ \brief Returns charts width
+ \return Width
+
+ Return only width of the chart's inside the frame — not the whole widget's
+ */
+ inline wgtunit_t width() const;
+
+ /**
+ \brief Finds screen X coord on the widget
+ \param x Coord
+ \return Screen coord
+ \warning Thera are rounding errors
+ */
+ inline wgtunit_t FindXScreenCoords(const double x) const;
+ /**
+ \brief Finds screen Y coord on the widget
+ \param y Coord
+ \return Screen coord
+ \warning Thera are rounding errors
+ */
+ inline wgtunit_t FindYScreenCoords(const double y) const;
+
+ ///Sets tooltip with legend
+ void MakeLegendTooltip();
+
+ public:
+ /**
+ \brief Widget's constructor
+ \param p Parent
+ \param x_max Maximum X size
+ \param y_max Maximum Y size
+ \param autom Whether athomagically set the maximum Y size
+ \param uname Unit name
+ */
+ ChartDrawer(QWidget *p = 0, wgtsize_t x_max = 2, wgtsize_t y_max = 1, bool autom = true, const QString & uname = "KB/s");
+ ~ChartDrawer();
+
+ /**
+ \brief Gets maximum X
+ \return Maximum X
+ */
+ wgtsize_t GetXMax() const;
+ /**
+ \brief Gets maximum Y
+ \return Maximum Y
+ */
+ wgtsize_t GetYMax() const;
+
+ /**
+ \brief Sets the units name
+ \param rN Name
+
+ \note It'l be drawn on the chart
+ */
+ void SetUnitName(const QString & rN);
+
+ /**
+ \brief Gets unit name
+ \return name
+ */
+ QString GetUnitName() const;
+ /**
+ \brief Doubleclick handler
+ \param evt Mouse event
+ */
+ void mouseDoubleClickEvent ( QMouseEvent * evt );
+
+ /**
+ \brief Gets mode of OY axis maximum drawing
+ \return mode
+ */
+ MaxMode GetMaxMode() const;
+
+
+ public slots:
+ /**
+ \brief Adds value to given dataset
+ \param idx Dataset index
+ \param val Value to add
+ \param update Whether update widget after adding
+ */
+ void AddValue(const size_t idx, const double val, bool update = true);
+ /**
+ \brief Adds dataset
+ \param Cdd Dataset
+ \param max Whether mark maximum of this dataset
+ */
+ void AddValues(ChartDrawerData Cdd, const bool max = true);
+ /**
+ \brief Adds dataset
+ \param Cdd Dataset
+ \param idx Where
+ \param max Whether mark maximum of this dataset
+ */
+ void AddValues(ChartDrawerData Cdd, const size_t idx, const bool max = true);
+ /**
+ \brief Adds empty dataset
+ \param rN Set's data name
+ \param max Whether mark maximum of this dataset
+ */
+ void AddValuesCnt(const QString & rN, const bool max = true);
+ /**
+ \brief Adds empty dataset
+ \param rP Pen that will be used to drawing
+ \param rN Dataset name
+ \param max Whether mark maximum of this dataset
+ */
+ void AddValuesCnt(const QPen & rP, const QString & rN, const bool max = true );
+
+ /**
+ \brief Removes dataset
+ \param idx Dataset index
+ */
+ void RemoveValuesCnt(const size_t idx);
+ /**
+ \brief Zeroes values
+ \param idx Dataset index
+ */
+ void Zero(const size_t idx);
+
+ ///Finds and sets maximum
+ void FindSetMax();
+
+ /**
+ \brief Toggles marking of the maximum Y value on given dataset
+ \param at dataset
+ \param e Toggle?
+ */
+ void EnableMaxDrawAt(const size_t, const bool);
+ /**
+ \brief Toggles automatic max Y scale settin
+ \param a Toggle?
+ */
+ void EnableAutoMax(bool a);
+
+ /**
+ \brief Sets maximum X
+ \param x X size
+ */
+ void SetXMax(const wgtsize_t x);
+ /**
+ \brief Sets maximum Y
+ \param y Y size
+ */
+ void SetYMax(const wgtsize_t x);
+
+ /**
+ \brief Sets mode of max of OY axis
+ \param mm Mode
+ */
+ void SetMaxMode(const MaxMode mm);
+
+
+ signals:
+ /**
+ \brief Emited when widget is doubleclicked
+ \param evt Mouse event
+ */
+ void DoubleClicked(QMouseEvent * evt);
+
+};
+
+}
+
+#endif
+