| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 | 
							- /*
 
- = StarPU-Top for StarPU =
 
- Copyright (C) 2011 
 
- William Braik
 
- Yann Courtois
 
- Jean-Marie Couteyen
 
- Anthony Roy
 
- This library is free software; you can redistribute it and/or
 
- modify it under the terms of the GNU Lesser General Public
 
- License as published by the Free Software Foundation; either
 
- version 2.1 of the License, or (at your option) any later version.
 
- This library 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
 
- Lesser General Public License for more details.
 
- You should have received a copy of the GNU Lesser General Public
 
- License along with this library; if not, write to the Free Software
 
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
- */
 
- #include "dataaggregatorwidget.h"
 
- #include "mainwindow.h"
 
- #include "widgetwindowsmanager.h"
 
- #include "datawidget.h"
 
- #include "configurationmanager.h"
 
- #include <qwt_plot_item.h>
 
- #include <qwt_plot_curve.h>
 
- #include <qwt_legend.h>
 
- #include <qwt_plot.h>
 
- #include <QToolBar>
 
- #include <QVBoxLayout>
 
- #include <QCloseEvent>
 
- DataAggregatorWidget::DataAggregatorWidget(
 
-         WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow,
 
-         bool inside, QList<int> dataIds) :
 
- 	AbstractWidgetWindow(widgetWindowsManager, mainWindow, inside)
 
- {
 
-     // Init UI
 
-     setWindowTitle(tr("Aggregator"));
 
-     setWindowIcon(QIcon(":/images/widget.png"));
 
-     // Buttons
 
-     QToolBar *buttonsToolBar = new QToolBar();
 
-     // In/out button
 
-     buttonsToolBar->addWidget(_inOutButton);
 
-     // Add data button
 
-     _addDataButton = new QToolButton();
 
-     _addDataButton->setIcon(QIcon(":/images/add.png"));
 
-     _addDataButton->setPopupMode(QToolButton::InstantPopup);
 
-     _addDataButton->setToolTip(tr("Add data source"));
 
-     buttonsToolBar->addSeparator();
 
-     buttonsToolBar->addWidget(_addDataButton);
 
-     // Remove data button
 
-     _removeDataButton = new QToolButton();
 
-     _removeDataButton->setIcon(QIcon(":/images/remove.png"));
 
-     _removeDataButton->setPopupMode(QToolButton::InstantPopup);
 
-     _removeDataButton->setToolTip(tr("Remove data source"));
 
-     buttonsToolBar->addWidget(_removeDataButton);
 
-     // Set layout
 
-     QVBoxLayout *layout = new QVBoxLayout();
 
-     setLayout(layout);
 
-     layout->addWidget(buttonsToolBar);
 
-     // Init actions
 
-     for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++)
 
-     {
 
-         if (_mainWindow->dataDescriptions()->at(i)->type != DATA_TYPE_BOOL)
 
-         {
 
-             QAction *addDataAction = new QAction(
 
-                     _mainWindow->dataDescriptions()->at(i)->descriptionString,
 
-                     _addDataButton);
 
-             addDataAction->setData(_mainWindow->dataDescriptions()->at(i)->id);
 
-             QObject::connect(addDataAction, SIGNAL(triggered()), this,
 
-                              SLOT(dataAdded()));
 
-             if (_mainWindow->dataDescriptions()->at(i)->widget
 
-                 == DATA_WIDGET_NONE)
 
-             {
 
-                 addDataAction->setEnabled(false);
 
-             }
 
-             _addDataButton->addAction(addDataAction);
 
-         }
 
-     }
 
-     // Init curve colors
 
-     _curveColors.append(Qt::black);
 
-     _curveColors.append(Qt::red);
 
-     _curveColors.append(Qt::green);
 
-     _curveColors.append(Qt::blue);
 
-     _curveColors.append(Qt::magenta);
 
-     _curveColors.append(Qt::yellow);
 
-     _curveColors.append(Qt::gray);
 
-     _curveColors.append(Qt::darkRed);
 
-     _curveColors.append(Qt::darkGreen);
 
-     _curveColors.append(Qt::darkBlue);
 
-     _curveColors.append(Qt::darkCyan);
 
-     _curveColors.append(Qt::darkMagenta);
 
-     _curveColors.append(Qt::darkYellow);
 
-     _curveColors.append(Qt::cyan);
 
-     _colorIterator = new QListIterator<QColor> (_curveColors);
 
-     // Create internal widget
 
-     createInternalWidget();
 
-     // Know when a data source is disabled / enabled
 
-     QObject::connect(_mainWindow, SIGNAL(dataDisabled(int)),
 
-                      this, SLOT(disableData(int)));
 
-     QObject::connect(_mainWindow, SIGNAL(dataEnabled(int)),
 
-                      this, SLOT(enableData(int)));
 
-     // Init data
 
-     if (dataIds.empty() == false)
 
-     {
 
-         for (int i = 0; i < dataIds.count(); i++)
 
-         {
 
-             addData(dataIds.at(i));
 
-         }
 
-     }
 
-     // Setup automatic cleanup
 
-     QObject::connect(this, SIGNAL(destroyed()), _mainWindow,
 
-                      SLOT(removeDestroyedDataAggregatorWidgets()));
 
-     qDebug() << "DataAggregatorWidget" << windowId() << ": initializing";
 
- }
 
- DataAggregatorWidget::~DataAggregatorWidget()
 
- {
 
-     delete _colorIterator;
 
-     delete _addDataButton;
 
-     delete _removeDataButton;
 
-     delete _plot;
 
-     qDebug() << "DataAggregatorWidget" << windowId() << ": terminating";
 
- }
 
- void DataAggregatorWidget::closeEvent(QCloseEvent *ce)
 
- {
 
-     ce->accept();
 
- }
 
- void DataAggregatorWidget::createInternalWidget()
 
- {
 
-     _plot = new QwtPlot(QwtText(tr("Aggregator")));
 
-     QwtLegend *legend = new QwtLegend;
 
-     legend->setItemMode(QwtLegend::CheckableItem);
 
-     _plot->insertLegend(legend, QwtPlot::BottomLegend);
 
-     _plot->setMinimumSize(300, 200);
 
-     _plot->setAttribute(Qt::WA_DeleteOnClose);
 
-     layout()->addWidget(_plot);
 
-     QObject::connect(_plot, SIGNAL(legendChecked(QwtPlotItem *, bool)),
 
-                      SLOT(curveChecked(QwtPlotItem *, bool)));
 
- }
 
- void DataAggregatorWidget::addData(int dataId)
 
- {
 
-     DataWidget *dataWidget = _mainWindow->dataWidgetFromDataId(dataId);
 
-     if (dataWidget != 0)
 
-     {
 
-         qDebug() << "Aggregator" << _windowId << ": adding new data of id"
 
-                 << dataId;
 
-         switch (dataWidget->description()->type)
 
-         {
 
-         case DATA_TYPE_INT:
 
-             {
 
-                 QObject::connect(dataWidget, SIGNAL(valueChanged(int,int)),
 
-                                  this, SLOT(update(int,int)));
 
-                 break;
 
-             }
 
-         case DATA_TYPE_FLOAT:
 
-             {
 
-                 QObject::connect(dataWidget, SIGNAL(valueChanged(double,int)),
 
-                                  this, SLOT(update(double,int)));
 
-                 break;
 
-             }
 
-         default:
 
-             qDebug() << "Aggregator" << _windowId
 
-                     << ": attempt to add data of unsupported type (id :"
 
-                     << dataId << ")";
 
-         }
 
-         QwtPlotCurve *curve = new QwtPlotCurve(
 
-                 _mainWindow->dataDescriptionFromId(dataId)->descriptionString);
 
-         if (_mainWindow->configurationManager()->antialiasing() == true)
 
-         {
 
-             curve->setRenderHint(QwtPlotItem::RenderAntialiased);
 
-         }
 
-         QColor c;
 
-         if (_colorIterator->hasNext())
 
-         {
 
-             c = _colorIterator->next();
 
-             c.setAlpha(150);
 
-             curve->setPen(c);
 
-         }
 
-         _curves.insert(dataId, curve);
 
-         CurveData curveData;
 
-         curveData.xData = new QVector<double> ();
 
-         curveData.yData = new QVector<double> ();
 
-         _curvesData.insert(dataId, curveData);
 
-         curve->attach(_plot);
 
-     }
 
-     else
 
-     {
 
-         qDebug() << "Aggregator" << _windowId << ": failed to add data of id"
 
-                 << dataId;
 
-     }
 
- }
 
- void DataAggregatorWidget::removeData(int dataId)
 
- {
 
-     DataWidget *dataWidget = _mainWindow->dataWidgetFromDataId(dataId);
 
-     if (dataWidget != 0)
 
-     {
 
-         qDebug() << "Aggregator" << _windowId << ": removing data of id"
 
-                 << dataId;
 
-         switch (dataWidget->description()->type)
 
-         {
 
-         case DATA_TYPE_INT:
 
-             QObject::disconnect(dataWidget, SIGNAL(valueChanged(int,int)),
 
-                                 this, SLOT(update(int,int)));
 
-             break;
 
-         case DATA_TYPE_FLOAT:
 
-             QObject::disconnect(dataWidget, SIGNAL(valueChanged(double,int)),
 
-                                 this, SLOT(update(double,int)));
 
-             break;
 
-         default:
 
-             ;
 
-         }
 
-         _curves.value(dataId)->detach();
 
-         _curvesData.remove(dataId);
 
-         _curves.remove(dataId);
 
-     }
 
-     else
 
-     {
 
-         qDebug() << "Aggregator" << _windowId
 
-                 << ": failed to remove data of id" << dataId;
 
-     }
 
- }
 
- void DataAggregatorWidget::update(int value, int dataId)
 
- {
 
-     qDebug() << "Aggregator" << _windowId << ": updating data of id" << dataId
 
-             << "with value" << value;
 
-     _curvesData.value(dataId).xData->append(_mainWindow
 
-                                             ->effectiveRunningTime());
 
-     _curvesData.value(dataId).yData->append(value);
 
- #if QWT_VERSION >= 0x060000
 
-     _curves.value(dataId)->setRawSamples(
 
-             _curvesData.value(dataId).xData->data(),
 
-             _curvesData.value(dataId).yData->data(),
 
-             _curvesData.value(dataId).xData->size());
 
- #else
 
- #  warning Old version of qwt being used, data aggregator will not work.
 
- #endif
 
-     _plot->replot();
 
- }
 
- void DataAggregatorWidget::update(double value, int dataId)
 
- {
 
-     qDebug() << "Aggregator" << _windowId << ": updating data of id" << dataId
 
-             << "with value" << value;
 
-     _curvesData.value(dataId).xData->append(_mainWindow
 
-                                             ->effectiveRunningTime());
 
-     _curvesData.value(dataId).yData->append(value);
 
- #if QWT_VERSION >= 0x060000
 
-     _curves.value(dataId)->setRawSamples(
 
-             _curvesData.value(dataId).xData->data(),
 
-             _curvesData.value(dataId).yData->data(),
 
-             _curvesData.value(dataId).xData->size());
 
- #else
 
- #  warning Old version of qwt being used, data aggregator will not work.
 
- #endif
 
-     _plot->replot();
 
- }
 
- QSize DataAggregatorWidget::minimumInternalWidgetSize() const
 
- {
 
-     return _plot->minimumSize();
 
- }
 
- QList<int> DataAggregatorWidget::aggregatedData() const
 
- {
 
-     QList<int> addedData;
 
-     for (int i = 0; i < _curves.values().count(); i++)
 
-     {
 
-         addedData.append(_curves.key(_curves.values().at(i)));
 
-     }
 
-     return addedData;
 
- }
 
- void DataAggregatorWidget::curveChecked(QwtPlotItem *curve, bool checked)
 
- {
 
-     curve->setVisible(!checked);
 
- }
 
- void DataAggregatorWidget::dataAdded()
 
- {
 
-     QAction *action = (QAction*) QObject::sender();
 
-     int dataId = action->data().toInt();
 
-     _addDataButton->removeAction(action);
 
-     addData(dataId);
 
-     QAction *removeDataAction = new QAction(
 
-             _mainWindow->dataDescriptionFromId(dataId)->descriptionString,
 
-             _removeDataButton);
 
-     removeDataAction->setData(dataId);
 
-     QObject::connect(removeDataAction, SIGNAL(triggered()), this,
 
-                      SLOT(dataRemoved()));
 
-     _removeDataButton->addAction(removeDataAction);
 
- }
 
- void DataAggregatorWidget::dataRemoved()
 
- {
 
-     QAction *action = (QAction*) QObject::sender();
 
-     int dataId = action->data().toInt();
 
-     _removeDataButton->removeAction(action);
 
-     removeData(dataId);
 
-     QAction *addDataAction = new QAction(
 
-             _mainWindow->dataDescriptionFromId(dataId)->descriptionString,
 
-             _addDataButton);
 
-     addDataAction->setData(dataId);
 
-     QObject::connect(addDataAction, SIGNAL(triggered()), this,
 
-                      SLOT(dataAdded()));
 
-     _addDataButton->addAction(addDataAction);
 
- }
 
- void DataAggregatorWidget::disableData(int dataId)
 
- {
 
-     // Search the action on the add button
 
-     for (int i = 0; i < _addDataButton->actions().count(); i++)
 
-     {
 
-         if (_addDataButton->actions().at(i)->data().toInt() == dataId)
 
-         {
 
-             _addDataButton->actions().at(i)->setEnabled(false);
 
-             return;
 
-         }
 
-     }
 
-     // If not found, it has already been added
 
-     for (int i = 0; i < _removeDataButton->actions().count(); i++)
 
-     {
 
-         if (_removeDataButton->actions().at(i)->data().toInt() == dataId)
 
-         {
 
-             _removeDataButton->removeAction(_removeDataButton->actions().at(i));
 
-             removeData(dataId);
 
-             QAction
 
-                     *action =
 
-                     new QAction(
 
-                             _mainWindow->dataDescriptionFromId(dataId)
 
-                             ->descriptionString,
 
-                             _addDataButton);
 
-             action->setData(dataId);
 
-             QObject::connect(action, SIGNAL(triggered()), this,
 
-                              SLOT(dataAdded()));
 
-             action->setEnabled(false);
 
-             _addDataButton->addAction(action);
 
-             return;
 
-         }
 
-     }
 
- }
 
- void DataAggregatorWidget::enableData(int dataId)
 
- {
 
-     // Search the action on the add button
 
-     for (int i = 0; i < _addDataButton->actions().count(); i++)
 
-     {
 
-         if (_addDataButton->actions().at(i)->data().toInt() == dataId)
 
-         {
 
-             _addDataButton->actions().at(i)->setEnabled(true);
 
-             return;
 
-         }
 
-     }
 
- }
 
 
  |