added all files
[ffqwlibrary] / libffqw-1.0 / sources / ffchart.cpp
diff --git a/libffqw-1.0/sources/ffchart.cpp b/libffqw-1.0/sources/ffchart.cpp
new file mode 100644 (file)
index 0000000..ca0f7ff
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+         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 ffchart.cpp
+ * @brief Implementation of the FFChartScene class.
+ *
+ * @author ComArch S.A.
+ * @date 2009.09.01
+ * @version 1.1
+ */
+
+#include "ffchart.h"
+
+
+/**
+ * Constructs a FFChart with a parent.
+ */
+FFChart::FFChart(QWidget* parent) :
+       FFAbstractWidget(parent)
+{
+       init();
+}
+
+/**
+ * A virtual destructor.
+ */
+FFChart::~FFChart()
+{
+
+}
+
+/**
+ * Initiates an object of FFChart. Sets all needed fields and connections.
+ * It is called by all constructors.
+ */
+void FFChart::init()
+{
+       //sets size policy
+       setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
+
+
+       // creates needed objects
+       view = new QGraphicsView(this);
+       scene = new FFChartScene(this);
+       legend = new FFChartLegend(this);
+
+       //sets default values
+       autoSort_ = true;
+       autoValidate_ = true;
+
+       //sets view
+       view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+       view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+       view->setScene(scene);
+       //necessary with our librray in Qt 4.6
+#ifndef DIABLO_COMP
+       view->setOptimizationFlag(QGraphicsView::IndirectPainting);
+#endif
+       //sets legend size
+       legend->setGeometry(width() / 2, 0, width() / 2, height());
+       //hides legend
+       legend->hide();
+
+
+
+       view->installEventFilter(this);
+
+       //connects
+       connect(this,SIGNAL(seriesChanged(QList<FFChartSeries*>)),scene,SLOT(seriesChanged(QList<FFChartSeries*>)));
+       connect(legend, SIGNAL(updateSeries()), scene, SLOT(update()));
+}
+
+/**
+ * Adds new series that will be drawn on the chart.
+ */
+void FFChart::addSeries(FFChartSeries* series)
+{
+
+       //series validation
+       if(autoValidate_)
+       {
+               series->validate();
+       }
+       //series' point sorting
+       if(autoSort_)
+       {
+               series->sort();
+       }
+
+
+       series->pen()->setCosmetic(true);
+
+       //add series to sies list and legend
+       series_.append(series);
+
+       legend->addSeries(series);
+
+       //updates scene
+       scene->update();
+
+
+       emit seriesChanged(series_);
+}
+
+/**
+ * Removes series indicated by given pointer.
+ */
+void FFChart::removeSeries(FFChartSeries* series)
+{
+       //searches for series and remove it
+       for(int i = 0; i < series_.size(); ++i)
+       {
+               if(series_[i] == series)
+               {
+                       legend->deleteSeries(series);
+                       series_.removeAt(i);
+               }
+       }
+
+       //update scene
+       scene->update();
+
+       emit seriesChanged(series_);
+}
+
+/**
+ * Removes all series.
+ */
+void FFChart::removeSeries()
+{
+       //removes series
+       int num = series_.size();
+       for(int i = 0; i < num; ++i)
+       {
+               legend->deleteSeries(series_.at(0));
+               series_.removeAt(0);
+       }
+       //updates scene
+       scene->update();
+
+       emit seriesChanged(series_);
+}
+
+/**
+ * Returns a list with pointers to all series contained in the chart.
+ */
+QList<FFChartSeries*> FFChart::series()
+{
+       return series_;
+}
+
+/**
+ * Returns pointer to series with given name.
+ * @return pointer to the looking series or NULL if series is not found
+ */
+FFChartSeries* FFChart::series(QString name)
+{
+       //return pointer to first added series with given name
+
+       for(int i=0; i<series_.size();++i)
+       {
+               if(series_.at(i)->name() == name)
+               {
+                       return series_[i];
+               }
+       }
+       //If found nothing NULL is returned
+       return NULL;
+}
+
+/**
+ * Turns on/off auto-sorting on series. If it is on then each newly added series
+ * will be sorted by 'x' values.
+ */
+void FFChart::setAutoSort(const bool& autoSort)
+{
+       autoSort_ = autoSort;
+}
+
+/**
+ * Turns on/off auto-validating on series. If it is on then each newly added
+ * series will be cleaned with the same points.
+ */
+void FFChart::setAutoValidate(const bool& autoValidate)
+{
+       autoValidate_ = autoValidate;
+}
+
+/**
+ * Returns true if auto-sorting is enabled, otherwise false.
+ */
+bool FFChart::isAutoSortEnabled() const
+{
+       return autoSort_;
+}
+
+/**
+ * Returns true if auto-validating is enabled, otherwise false.
+ */
+bool FFChart::isAutoValidateEnabled() const
+{
+       return autoValidate_;
+}
+
+/**
+ * Sets object that will be responsible for managing with events sent to
+ *  the FFChart.
+ */
+void FFChart::installEventFilter(QObject* object)
+{
+       view->installEventFilter(object);
+}
+
+/**
+ * Slot that zooms in the current chart into a rectangle which is smaller by
+ * a given ratio.
+ */
+void FFChart::zoomIn(qreal ratio)
+{
+       scene->zoomIn(ratio);
+}
+
+/**
+ * Slot that zooms out the current chart into a rectangle which is larger by
+ * a given ratio.
+ */
+void FFChart::zoomOut(qreal ratio)
+{
+       scene->zoomOut(ratio);
+}
+
+/**
+ * Moves the chart by given vector.
+ */
+void FFChart::moveBy(QPointF point)
+{
+       scene->moveBy(point.toPoint());
+}
+
+/**
+ * Overridden virtual method. It is responsible for managing with resize events.
+ */
+void FFChart::resizeEvent(QResizeEvent* event)
+{
+       Q_UNUSED(event)
+       view->resize(size());
+       scene->setSceneRect(QRectF(0,0,event->size().width(),event->size().height()));
+       legend->setGeometry(width() / 2, 0, width() / 2, height());
+
+       QWidget::resizeEvent(event);
+}
+
+/**
+ * Toggles the legend. If it is visible, this method makes it hidden and
+ * vice versa.
+ */
+void FFChart::showLegend()
+{
+       if(legend->isVisible())
+       {
+               legend->hide();
+               this->repaint();
+       }
+       else
+       {
+               legend->show();
+               this->repaint();
+       }
+}
+
+/*!
+ * \fn void FFChart::seriesChanged(QList<FFChartSeries*>);
+ *
+ * This Signal  is emitted when the set of series was changed.
+ */