added all files
[ffqwlibrary] / libffqw-n810-1.0 / sources / ffchartscene.h
diff --git a/libffqw-n810-1.0/sources/ffchartscene.h b/libffqw-n810-1.0/sources/ffchartscene.h
new file mode 100644 (file)
index 0000000..64203a8
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+         GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+http://www.gnu.org/licenses/gpl-3.0.txt
+*/
+/**
+ * @file ffchartscene.h
+ * @brief Contains a necessary class declaration.
+ *
+ * @author ComArch S.A.
+ * @date 2009.09.01
+ * @version 1.1
+ */
+
+#ifndef FFCHARTSCENE_H
+#define FFCHARTSCENE_H
+
+#include <QGraphicsScene>
+#include <QGraphicsSceneMouseEvent>
+#include <QGraphicsSceneDragDropEvent>
+#include <QGraphicsLineItem>
+#include <QDebug>
+#include <QKeyEvent>
+#include <QPainter>
+#include <QApplication>
+#include <QStyleOptionGraphicsItem>
+#include <QTimer>
+#include <qmath.h>
+#include <QGraphicsPathItem>
+#include <QTransform>
+
+#include "ffchartseries.h"
+#include "ffchartbutton.h"
+#include "ffabstractwidget.h"
+#include <QGraphicsEllipseItem>
+/**
+ * @author ComArch S.A.
+ * @date 2009.09.01
+ * @version 1.1
+ *
+ * @brief Reimplemented a QGraphicsScene class. It is used by the FFChart class
+ * to whole drawing.
+ */
+
+class FFChartScene : public QGraphicsScene
+{
+Q_OBJECT
+public:
+       FFChartScene(QObject* parent = 0);
+       virtual ~FFChartScene();
+
+       void moveTo(QPoint point);
+       void moveTo(float x, float y);
+       void moveBy(QPoint destPoint);
+       void moveBy(float x, float y);
+
+       void addSeries(FFChartSeries* series);
+       void setSeries(QList<FFChartSeries*> series);
+
+       void setSceneRect(const QRectF& rect);
+
+       void setSubaxesSpacing(const float& subaxesSpacing);
+       float subaxesSpacing() const;
+
+       void setSubaxesPen(const QPen& subaxesPen);
+       QPen subaxesPen() const;
+
+       void setAxesValuesPen(const QPen& axesValuesPen);
+       QPen axesValuesPen() const;
+
+public slots:
+       void seriesChanged(QList<FFChartSeries*> series);
+       void zoom(QRectF zoomRect);
+       void zoomIn(qreal ratio);
+       void zoomOut(qreal ratio);
+
+signals:
+       void seriesChanged(QList<FFChartSeries*>*);
+
+protected:
+       void drawItems(QPainter* painter,
+                      int numItems,
+                      QGraphicsItem* items[],
+                      const QStyleOptionGraphicsItem options[],
+                      QWidget * widget);
+       void mousePressEvent(QGraphicsSceneMouseEvent* event);
+       void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);
+       void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
+       void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
+
+private:
+       QTimer* timer; ///< animation's timer
+
+       QTransform transform; ///< tool uses to transformations
+
+       float subaxesSpacing_; ///< spacing between suaxes
+       QPen subaxesPen_; ///< a pen of subaxes
+       QPen axesValuesPen_; ///< a pen of subaxes' values
+
+       QPointF translateFactor_; ///< new point of scene's top left corner
+
+       QSizeF accumulatedZoomFactor_; ///< accumulates factor of zooming
+       QPointF pressPos; ///< stores actual press position
+       QPointF oldPressPos;///< stores old press position
+       QPointF kineticVec; ///< stores kintetic vector
+       QPointF oldKineticVec; ///< stores old kinetic vector
+
+       QRectF itemsBoundingRect_; ///< bounding rectangle of items
+
+       QVector<float> itemsBoundingValues_; ///< stores items' bounding values
+       QRectF sceneRec; ///< stores scene's rectangle
+
+       QGraphicsRectItem* zoomRect; ///< stores pointer to zoom rectangle
+
+       FFChartButton zoomInButton; ///< button to zooming in
+       FFChartButton zoomOutButton; ///< button to zooming out
+       FFChartButton legendButton; ///< button to showing legend
+       QList<QGraphicsItem*> staticItems; ///< list of items on the scene
+       QList<FFChartSeries*> series; ///< list of series
+
+       bool zoomModeSw; ///< true if zooming mode is active
+       bool moveModeSw; ///< true if moving mode is active
+       bool kinetic; ///< true if kinetic is active
+
+       int kineticCount; ///< kinetic's counter
+
+       void init();
+       QRectF itemsBoundingRect(QVector<float>* boundaryValues = 0);
+
+       void drawAxes(QPainter* painter, QWidget* widget);
+       void drawSubAxes(QPainter* painter, QWidget* widget);
+       void drawSeries(QPainter* painter, QWidget* widget);
+       void drawStaticItems(QPainter* painter, QWidget* widget);
+       void drawValues(QPainter* painter, QWidget* widget);
+
+private slots:
+       void kineticScroll();
+       void zoomIn();
+       void zoomOut();
+
+private:
+       static const qreal kineticRatio = 1.5; ///< ratio of kinetic scolling
+       static const qreal defaultZoomInRatio = 0.2; ///< ratio of zoom in
+       static const qreal defaultZoomOutRatio = 1.0;///< ratio of zoom out
+};
+#endif // FFCHARTSCENE