| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885 | 
							- /*
 
- = 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 "ganttwidget.h"
 
- #include "mainwindow.h"
 
- #include "taskmanager.h"
 
- #include <math.h>
 
- #include <QtOpenGL>
 
- #include <QTimer>
 
- #include <sstream>
 
- const int MAX_CPU_NUM = 6;
 
- const int MAX_GPU_NUM = 3;
 
- const int MARGIN = 5;
 
- const int DEFAULT_TIME_TOTAL = 20000;
 
- const int HEIGHT_TIME_AXIS = 20;
 
- const int WIDTH_GLOBAL_PU = 50; // Width of the big CPU rect
 
- const int WIDTH_PROGRAM = 50;
 
- const int WIDTH_PU = 70;
 
- const int GRAD_NUM = 5; // Number of gradations between each label
 
- const int WIDTH_PRESENT_LINE = 1;
 
- const int SIGNIF_NUM = 100;
 
- const int FIRST_THRESHOLD = 25;
 
- const int SECOND_THRESHOLD = 75;
 
- const int SHIFT_LEFT_TIME_AXIS = 3;
 
- const int SHIFT_TOP_TIME_AXIS = 3;
 
- const QColor GANTT_BACKGROUND_COLOR = Qt::gray;
 
- const QFont::StyleHint GANTT_TEXT_FONT = QFont::Times;
 
- const QColor GANTT_TEXT_COLOR = Qt::white;
 
- const QColor GANTT_PU_COLOR = Qt::blue;
 
- const QColor GANTT_TIMELINE_COLOR = Qt::blue;
 
- const QColor GANTT_PRESENTLINE_COLOR = Qt::black;
 
- const QColor GANTT_IDLE_COLOR = Qt::red;
 
- const QColor GANTT_WORKING_COLOR = Qt::green;
 
- const QColor GANTT_PREV_COLOR = Qt::yellow;
 
- GanttWidget::GanttWidget(MainWindow *mainWindow, TaskManager *taskManager) :
 
- 	QGLWidget(QGLFormat(QGL::SampleBuffers), mainWindow)
 
- {
 
-     _mainWindow = mainWindow;
 
-     _taskManager = taskManager;
 
-     setAutoFillBackground(false);
 
-     _background = QBrush(GANTT_BACKGROUND_COLOR);
 
-     _textPen = QPen(GANTT_TEXT_COLOR);
 
-     _textFont.setPixelSize(50);
 
-     _textFont.setStyleHint(GANTT_TEXT_FONT);
 
-     _coordxPresentLine = 0;
 
-     _numPUs = 0;
 
-     _wasRunning = false;
 
-     _timeTotal = DEFAULT_TIME_TOTAL;
 
-     _timeBefore = _timeTotal * 0.66;
 
-     _timeAfter = _timeTotal * 0.34;
 
-     _lastValPrevLine = 66;
 
-     _timePresent = 0;
 
-     _timeToShow = 0;
 
-     _numCPUs = 0;
 
-     _numGPUs = 0;
 
-     _heightPU = 0;
 
-     _initCompleted = false;
 
-     _PUsByDevice = 0;
 
-     _PUsByPos = 0;
 
-     // Start display update timer
 
-     _timer = new QTimer(this);
 
-     _timer->start(35);
 
-     // Connect events
 
-     QObject::connect(_mainWindow, SIGNAL(sessionOpened()),
 
-                      this, SLOT(connected()));
 
-     QObject::connect(_mainWindow, SIGNAL(sessionClosed()),
 
-                      this, SLOT(disconnected()));
 
-     QObject::connect(_mainWindow, SIGNAL(debugLocked()),
 
-                      this, SLOT(ganttLocked()));
 
-     QObject::connect(_mainWindow, SIGNAL(debugStepped()),
 
-                      this, SLOT(ganttUnlocked()));
 
-     QObject::connect(_timer, SIGNAL(timeout()),
 
-                      this, SLOT(update()));
 
- }
 
- GanttWidget::~GanttWidget()
 
- {
 
-     delete _timer;
 
-     delete _rectPUs;
 
- }
 
- void GanttWidget::defaultScreen(QPainter *painter)
 
- {
 
-     painter->setPen(GANTT_TEXT_COLOR);
 
-     drawPresentLine(painter);
 
-     drawTime(painter);
 
- }
 
- // Called each time the window is resized
 
- void GanttWidget::resizeGL(int width, int height)
 
- {
 
-     update();
 
- }
 
- void GanttWidget::paintEvent(QPaintEvent *event)
 
- {
 
-     QPainter painter;
 
-     painter.begin(this);
 
-     painter.setRenderHint(QPainter::Antialiasing);
 
-     paint(&painter, event);
 
-     painter.end();
 
- }
 
- /* Draw CPU and GPU rects */
 
- void GanttWidget::drawPUs(QPainter *painter)
 
- {
 
-     QFont f;
 
-     QPen penRect;
 
-     QPen penText;
 
-     QPointF coordTxt;
 
-     QString txt;
 
-     QStaticText name;
 
-     f.setFamily("utf8");
 
-     f.setWeight(QFont::Bold);
 
-     f.setPixelSize(12);
 
-     painter->setFont(f);
 
-     penRect.setColor(GANTT_PU_COLOR);
 
-     penText.setColor(GANTT_TEXT_COLOR);
 
-     painter->setPen(penRect);
 
-     _rectPUs = new QRectF[_numCPUs + _numGPUs];
 
-     int height_allowed = size().height() - HEIGHT_TIME_AXIS - MARGIN;
 
-     // height of each processor unit rectangles
 
-     int height = height_allowed / (_numCPUs + _numGPUs);
 
-     _heightPU = height;
 
-     int height_cpublock = height * _numCPUs;
 
-     int height_gpublock = height * _numGPUs;
 
-     /* The CPUs rect */
 
-     if (_numCPUs > 0)
 
-     {
 
-         _rectCPUblock = QRectF(WIDTH_PROGRAM + MARGIN,
 
-                                HEIGHT_TIME_AXIS + MARGIN, WIDTH_GLOBAL_PU,
 
-                                height_cpublock - MARGIN);
 
-         painter->drawRect(_rectCPUblock);
 
-         painter->fillRect(_rectCPUblock, GANTT_PU_COLOR);
 
-         painter->setPen(penText);
 
-         coordTxt = QPointF(
 
-                 _rectCPUblock.center().rx() - (WIDTH_GLOBAL_PU / 2) + 3,
 
-                 _rectCPUblock.center().ry() - f.pixelSize());
 
-         txt = QString("CPU(s)");
 
-         name = QStaticText(txt);
 
-         name.setPerformanceHint(QStaticText::AggressiveCaching);
 
-         painter->drawStaticText(coordTxt, name);
 
-     }
 
-     f.setWeight(QFont::Light);
 
-     f.setPixelSize(10);
 
-     painter->setFont(f);
 
-     painter->setPen(penRect);
 
-     /* devices */
 
-     for (int i = 0; i < _numCPUs + _numGPUs; i++)
 
-     {
 
-         painter->setPen(penRect);
 
-         _rectPUs[i] = QRectF(WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN,
 
-                              HEIGHT_TIME_AXIS + MARGIN + i * height, WIDTH_PU,
 
-                              height - MARGIN);
 
-         painter->drawRect(_rectPUs[i]);
 
-         painter->fillRect(_rectPUs[i], Qt::blue);
 
-         painter->setPen(penText);
 
-         if (_heightPU >= f.pixelSize() * 2)
 
-         {
 
-             painter->drawText(_rectPUs[i], Qt::AlignVCenter, _PUsByPos[i].name);
 
-         }
 
-     }
 
-     f.setFamily("utf8");
 
-     f.setWeight(QFont::Bold);
 
-     f.setPixelSize(12);
 
-     painter->setFont(f);
 
-     painter->setPen(penRect);
 
-     /* The GPUs rect */
 
-     if (_numGPUs > 0)
 
-     {
 
-         _rectGPUblock = QRectF(WIDTH_PROGRAM + MARGIN,
 
-                                HEIGHT_TIME_AXIS + MARGIN + height_cpublock, WIDTH_GLOBAL_PU,
 
-                                height_gpublock - MARGIN);
 
-         painter->drawRect(_rectGPUblock);
 
-         painter->fillRect(_rectGPUblock, Qt::blue);
 
-         coordTxt = QPointF(
 
-                 _rectGPUblock.center().rx() - (WIDTH_GLOBAL_PU / 2) + 3,
 
-                 _rectGPUblock.center().ry() - f.pixelSize());
 
-         txt = QString("GPU(s)");
 
-         name = QStaticText(txt);
 
-         name.setPerformanceHint(QStaticText::AggressiveCaching);
 
-         painter->setPen(penText);
 
-         painter->drawStaticText(coordTxt, name);
 
-     }
 
- }
 
- /* calculate abscissa on the screen for a given time (in ms) if it's displayable
 
-  return -1 if timestampMs is outside time displayable because of scale*/
 
- qreal GanttWidget::coordxForTime(qlonglong timestampMs)
 
- {
 
-     qreal startx = (qreal) WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN
 
-                    + WIDTH_PU + MARGIN;
 
-     qreal widthAllowed = (qreal) size().width() - startx;
 
-     qreal scale = (qreal) widthAllowed / _timeTotal;
 
-     qreal coordx = -1;
 
-     if (timestampMs >= 0)
 
-     {
 
-         if ((timestampMs <= _timePresent) && (timestampMs >= (_timePresent
 
-                                                               - _timeBefore)))
 
-         {
 
-             coordx = (qreal) startx + (qreal)(
 
-                     (_timeBefore - (_timePresent - timestampMs)) * scale);
 
-         }
 
-         else if ((timestampMs > _timePresent) && timestampMs <= (_timeAfter
 
-                                                                  + _timePresent))
 
-         {
 
-             coordx = (qreal) _coordxPresentLine + (qreal)(
 
-                     (timestampMs - _timePresent) * scale);
 
-         }
 
-     }
 
-     return coordx;
 
- }
 
- void GanttWidget::drawTime(QPainter *painter)
 
- {
 
-     QFont f;
 
-     QPen penRect;
 
-     QPen penText;
 
-     penRect.setColor(GANTT_TIMELINE_COLOR);
 
-     penText.setColor(GANTT_TEXT_COLOR);
 
-     painter->setPen(penRect);
 
-     f.setFamily("utf8");
 
-     f.setWeight(QFont::DemiBold);
 
-     f.setPixelSize(10);
 
-     painter->setFont(f);
 
-     _rectTime = QRectF(0, 0, size().width(), 20);
 
-     painter->drawRect(_rectTime);
 
-     painter->fillRect(_rectTime, Qt::blue);
 
-     QString titre = QString("Time (ms)");
 
-     QStaticText titreTxt = QStaticText(titre);
 
-     titreTxt.setPerformanceHint(QStaticText::AggressiveCaching);
 
-     QPointF coordRect = QPointF(_rectTime.left() + SHIFT_LEFT_TIME_AXIS,
 
-                                 _rectTime.center().ry() - f.pixelSize() + SHIFT_TOP_TIME_AXIS);
 
-     painter->setPen(penText);
 
-     painter->drawStaticText(coordRect, titreTxt);
 
-     f.setWeight(QFont::Light);
 
-     f.setPixelSize(10);
 
-     painter->setFont(f);
 
-     qreal ourStartx = WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN
 
-                       + WIDTH_PU + MARGIN;
 
-     qreal widthAvailable = ((qreal)(size().width() - ourStartx));
 
-     qreal scale = ((qreal)(_timeBefore + _timeAfter) / widthAvailable);
 
-     qreal scale_time_px = (qreal) widthAvailable / (_timeBefore + _timeAfter);
 
-     int timeInterval = computeTimeInterval(_timeTotal);
 
-     qreal sizeInterval = ((qreal)(timeInterval * scale_time_px));
 
-     qreal step_x = (qreal)(sizeInterval / GRAD_NUM);
 
-     //we calculate the location of the next gradation in the future part
 
-     qlonglong first = _timePresent - _timePresent % ((qlonglong) timeInterval);
 
-     qlonglong cur_t = first;
 
-     //gradations in the past
 
-     while (cur_t > _timePresent - _timeBefore)
 
-     {
 
-         if (cur_t >= (qlonglong) 0)
 
-         {
 
-             qreal cur_x =
 
-                     ((qreal)((_timeBefore - (_timePresent - cur_t)) / scale)
 
-                      + ourStartx);
 
-             QString buffer;
 
-             buffer.append(QString("%1").arg(cur_t));
 
-             QStaticText gradTxt = QStaticText(buffer);
 
-             gradTxt.setPerformanceHint(QStaticText::AggressiveCaching);
 
-             //calculate the fading
 
-             int fading = 3 * (cur_x - ourStartx);
 
-             if (fading < 0)
 
-             {
 
-                 fading = 0;
 
-             }
 
-             if (fading > 255)
 
-             {
 
-                 fading = 255;
 
-             }
 
-             _textPen.setColor(QColor(255, 255, 255, fading));
 
-             painter->setPen(_textPen);
 
-             painter->drawLine(
 
-                     QLineF(cur_x, 0, cur_x, HEIGHT_TIME_AXIS - MARGIN));
 
-             if (widthAvailable > 500)
 
-             {
 
-                 painter->drawStaticText(
 
-                         QPointF(cur_x,
 
-                                 HEIGHT_TIME_AXIS - MARGIN - f.pixelSize()),
 
-                         gradTxt);
 
-             }
 
-             for (int k = 1; k < GRAD_NUM; k++)
 
-             { // k=1 ,because of spans
 
-                 painter->drawLine(
 
-                         QLineF(cur_x + step_x * k, 0, cur_x + step_x * k,
 
-                                HEIGHT_TIME_AXIS - MARGIN * 3));
 
-             }
 
-         }
 
-         cur_t -= timeInterval;
 
-     }
 
-     //in the future
 
-     cur_t = first + timeInterval;
 
-     while (cur_t < _timePresent + _timeAfter)
 
-     {
 
-         qreal cur_x = ((qreal)((_timeBefore - (_timePresent - cur_t)) / scale)
 
-                        + ourStartx);
 
-         QString buffer;
 
-         buffer.append(QString("%1").arg(cur_t));
 
-         QStaticText gradTxt = QStaticText(buffer);
 
-         gradTxt.setPerformanceHint(QStaticText::AggressiveCaching);
 
-         //calculate the fading
 
-         int fading = 3 * (size().width() - cur_x);
 
-         if (fading > 255)
 
-         {
 
-             fading = 255;
 
-         }
 
-         _textPen.setColor(QColor(255, 255, 255, fading));
 
-         painter->setPen(_textPen);
 
-         painter->drawLine(QLineF(cur_x, 0, cur_x, HEIGHT_TIME_AXIS - MARGIN));
 
-         if (widthAvailable > 500)
 
-         {
 
-             painter->drawStaticText(
 
-                     QPointF(cur_x, HEIGHT_TIME_AXIS - MARGIN - f.pixelSize()),
 
-                     gradTxt);
 
-         }
 
-         for (int k = 1; k < GRAD_NUM; k++)
 
-         {
 
-             painter->drawLine(
 
-                     QLineF(cur_x + step_x * k, 0, cur_x + step_x * k,
 
-                            HEIGHT_TIME_AXIS - MARGIN * 3));
 
-         }
 
-         cur_t += timeInterval;
 
-     }
 
-     _textPen.setColor(QColor(255, 255, 255));
 
-     painter->setPen(_textPen);
 
- }
 
- //calculate un lapse of time to get at least 20 gradations if 1000 <= timeTotal
 
- //and <=24 * 10^X
 
- int GanttWidget::computeTimeInterval(int timeTotal)
 
- {
 
-     int coef = 1;
 
-     while (timeTotal >= SIGNIF_NUM)
 
-     {
 
-         timeTotal = timeTotal / 10;
 
-         coef *= 10;
 
-     }
 
-     //we have a number between 1 and 99
 
-     if (timeTotal < FIRST_THRESHOLD)
 
-     {
 
-         return coef;
 
-     }
 
-     else if (timeTotal < SECOND_THRESHOLD)
 
-     {
 
-         return coef * 5;
 
-     }
 
-     else
 
-     {
 
-         return coef * 10;
 
-     }
 
- }
 
- void GanttWidget::drawProgram(QPainter *painter)
 
- {
 
-     QFont f;
 
-     QPen penRect;
 
-     QPen penText;
 
-     penRect.setColor(GANTT_PU_COLOR);
 
-     penText.setColor(GANTT_TEXT_COLOR);
 
-     f.setFamily("utf8");
 
-     f.setWeight(QFont::Black);
 
-     f.setPixelSize(10);
 
-     painter->setFont(f);
 
-     painter->setPen(penRect);
 
-     _rectProg = QRectF(0, HEIGHT_TIME_AXIS + MARGIN, WIDTH_PROGRAM,
 
-                        size().height() - HEIGHT_TIME_AXIS - MARGIN * 2);
 
-     painter->drawRect(_rectProg);
 
-     painter->fillRect(_rectProg, Qt::blue);
 
-     QPointF coordTxt = QPointF(
 
-             _rectProg.center().rx() - (WIDTH_PROGRAM / 2) + 3,
 
-             _rectProg.center().ry() - f.pixelSize());
 
-     QString txt = QString("Program");
 
-     QStaticText name = QStaticText(txt);
 
-     name.setPerformanceHint(QStaticText::AggressiveCaching);
 
-     painter->setPen(penText);
 
-     painter->drawStaticText(coordTxt, name);
 
- }
 
- void GanttWidget::drawPresentLine(QPainter *painter)
 
- {
 
-     QPen pen;
 
-     pen.setColor(GANTT_PRESENTLINE_COLOR);
 
-     painter->setPen(pen);
 
-     qreal widthAllowed = (qreal)(
 
-             size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN
 
-             - WIDTH_PU - MARGIN);
 
-     int timeTotal = _timeBefore + _timeAfter;
 
-     int x, y, w, h;
 
-     x = WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN + WIDTH_PU + MARGIN;
 
-     y = (HEIGHT_TIME_AXIS + MARGIN);
 
-     w = WIDTH_PRESENT_LINE;
 
-     h = size().height() - (HEIGHT_TIME_AXIS + MARGIN);
 
-     qreal scale = (qreal)(widthAllowed / timeTotal);
 
-     qreal gap_x = (qreal)(scale * _timeBefore);
 
-     _linePresent = QRectF(x + gap_x, y, w, h);
 
-     _coordxPresentLine = (qreal)(x + gap_x);
 
-     painter->drawRect(_linePresent);
 
-     painter->fillRect(_linePresent, Qt::black);
 
- }
 
- /* Draw whole gantt diagram depending on time showing line present location.
 
-  Useful to draw the diagram after the complete execution. */
 
- void GanttWidget::drawFromTime(QPainter *painter, qlonglong timestamp)
 
- {
 
-     Q_ASSERT_X(timestamp >= 0, "GanttWidget::drawFromTime",
 
-                "Negative timestamp !");
 
-     /* program rect */
 
-     drawProgram(painter);
 
-     _timePresent = timestamp;
 
-     /* time line */
 
-     drawTime(painter);
 
-     drawPUs(painter);
 
-     /* Tasks */
 
-     drawIdlePU(painter);
 
-     qlonglong borneBefore = _timePresent - _timeBefore;
 
-     if (borneBefore < 0)
 
-     {
 
-         borneBefore = 0;
 
-     }
 
-     _tasks = _taskManager->tasks(borneBefore, _timePresent);
 
-     foreach(StarputopTask t, _tasks)
 
-     {
 
- 	drawWorkPU(painter,t);
 
-     }
 
- }
 
- /* draw idle time for each processor */
 
- void GanttWidget::drawIdlePU(QPainter *painter)
 
- {
 
-     int starty = HEIGHT_TIME_AXIS + MARGIN;
 
-     int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN
 
-                        - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN;
 
-     int timeTotal = _timeBefore + _timeAfter;
 
-     qreal posBlockx = 0;
 
-     qreal placeTime = 0;
 
-     bool isStartx = false;
 
-     qreal scale = (qreal) widthAllowed / timeTotal;
 
-     QRectF rectIdle;
 
-     qlonglong timestampS = 0;
 
-     if (_timePresent >= _timeBefore)
 
-     {
 
-         timestampS = _timePresent - _timeBefore;
 
-     }
 
-     /* drawIdlePu */
 
-     for (qlonglong j = timestampS; j < _timePresent; j++)
 
-     {
 
-         if (!isStartx)
 
-         {
 
-             isStartx = true;
 
-             posBlockx = coordxForTime(j);
 
-         }
 
-         placeTime++;
 
-     }
 
-     QFont f;
 
-     QPen pen;
 
-     f.setFamily("utf8");
 
-     f.setWeight(QFont::DemiBold);
 
-     f.setPixelSize(10);
 
-     painter->setFont(f);
 
-     pen.setColor(GANTT_IDLE_COLOR.lighter(110));
 
-     painter->setPen(pen);
 
-     for (int i = 0; i < _numPUs; i++)
 
-     {
 
-         rectIdle = QRectF(posBlockx, starty + (_heightPU) * i,
 
-                           placeTime * scale, (_heightPU - MARGIN));
 
-         painter->drawRect(rectIdle);
 
-         painter->fillRect(rectIdle, GANTT_IDLE_COLOR);
 
-     }
 
- }
 
- /* draw forecasted working time for each processor */
 
- void GanttWidget::drawPrevWorkPU(QPainter *painter, StarputopTask t)
 
- {
 
-     int starty = HEIGHT_TIME_AXIS + MARGIN;
 
-     int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN
 
-                        - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN;
 
-     qreal posBlockx = 0;
 
-     qreal placeTime = 0;
 
-     bool isStartx = false;
 
-     qreal scale = (qreal) widthAllowed / _timeTotal;
 
-     QRectF rectForecast;
 
-     //either the beginning is in the Future Part
 
-     //( timeAfter ) or either in the Past Part (timeBefore)
 
-     qlonglong timestampS = (t.timestampStart - _timePresent);
 
-     if (timestampS > 0)
 
-     {
 
-         // the beginning is in the Future part (displayable here)
 
-         timestampS = t.timestampStart;
 
-     }
 
-     else
 
-     {
 
-         // the beginning is in the Past part (not displayable here)
 
-         timestampS = _timePresent;
 
-         // +1 just to be sure we don't draw over the line of Present
 
-         posBlockx = _coordxPresentLine + WIDTH_PRESENT_LINE + 1;
 
-         isStartx = true;
 
-         placeTime -= WIDTH_PRESENT_LINE + 1;
 
-     }
 
-     qlonglong timestampE = (t.timestampEnd - _timePresent);
 
-     if (timestampE > 0)
 
-     {
 
-         if (timestampE <= _timeAfter)
 
-         {
 
-             timestampE = t.timestampEnd; // the end is displayable
 
-         }
 
-         else
 
-         {
 
-             // the end is not displayable because it's in the future
 
-             // more than timePresent + timeAfter
 
-             timestampE = _timePresent + _timeAfter;
 
-         }
 
-     }
 
-     else
 
-     {
 
-         // the end is not displayable because it's in the past
 
-         timestampE = _timePresent;
 
-         posBlockx = _coordxPresentLine + WIDTH_PRESENT_LINE + 1;
 
-         isStartx = true;
 
-         placeTime -= WIDTH_PRESENT_LINE + 1;
 
-     }
 
-     /* Future */
 
-     for (qlonglong i = timestampS; i <= timestampE; i++)
 
-     {
 
-         if (!isStartx)
 
-         {
 
-             isStartx = true;
 
-             posBlockx = coordxForTime(i);
 
-         }
 
-         placeTime++;
 
-     }
 
-     int pos = _PUsByDevice[t.deviceId].id;
 
-     QFont f;
 
-     QPen pen;
 
-     pen.setColor(GANTT_TEXT_COLOR);
 
-     painter->setPen(pen);
 
-     f.setFamily("utf8");
 
-     f.setWeight(QFont::DemiBold);
 
-     f.setPixelSize(10);
 
-     painter->setFont(f);
 
-     QLinearGradient gradient(posBlockx,
 
-                              starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2,
 
-                              posBlockx + placeTime * scale,
 
-                              starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2);
 
-     QColor prevColor = GANTT_PREV_COLOR;
 
-     gradient.setColorAt(0.2, prevColor.lighter(110));
 
-     gradient.setColorAt(0.3, Qt::yellow);
 
-     gradient.setColorAt(0.80, prevColor.darker(270));
 
-     QBrush brush(gradient);
 
-     pen.setBrush(brush);
 
-     painter->setPen(pen);
 
-     rectForecast = QRectF(posBlockx, starty + (_heightPU) * pos,
 
-                           placeTime * scale, (_heightPU - MARGIN));
 
-     painter->drawRect(rectForecast);
 
-     painter->fillRect(rectForecast, brush);
 
- }
 
- /* Draw working time for each processor. Working PUs.
 
-  We don't mind about task values because the taskmanager gives us only the tasks
 
-  between timeBefore and timePresent so
 
-  we haven't to test if they are displayable or not. We just have to calculate
 
-  which part of time is displayable.
 
-  The task t has its begin or its end between time Before and timePresent */
 
- void GanttWidget::drawWorkPU(QPainter *painter, StarputopTask t)
 
- {
 
-     int starty = HEIGHT_TIME_AXIS + MARGIN;
 
-     int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN
 
-                        - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN;
 
-     qreal posBlockx = 0;
 
-     qreal placeTime = 0;
 
-     bool isStartx = false;
 
-     qreal scale = (qreal) widthAllowed / _timeTotal;
 
-     QRectF rectWorking;
 
-     qlonglong timestampS = (_timePresent - t.timestampStart);
 
-     qlonglong timestampE = -1;
 
-     if (timestampS > _timeBefore)
 
-     {
 
-         // Begin time of task t is not displayable
 
-         timestampS = _timePresent - _timeBefore;
 
-     }
 
-     else
 
-     {
 
-         timestampS = t.timestampStart; // Begin time of task t is displayable
 
-     }
 
-     if (t.timestampEnd == -1)
 
-     {
 
-         for (qlonglong i = timestampS; i <= _timePresent; i++)
 
-         {
 
-             if (!isStartx)
 
-             {
 
-                 isStartx = true;
 
-                 posBlockx = coordxForTime(i);
 
-             }
 
-             placeTime++;
 
-         }
 
-     }
 
-     else
 
-     {
 
-         timestampE = t.timestampEnd;
 
-         if (timestampE > _timePresent)
 
-         {
 
-             timestampE = _timePresent;
 
-         }
 
-         for (qlonglong i = timestampS; i <= timestampE; i++)
 
-         {
 
-             if (!isStartx)
 
-             {
 
-                 isStartx = true;
 
-                 posBlockx = coordxForTime(i);
 
-             }
 
-             placeTime++;
 
-         }
 
-     }
 
-     int pos = _PUsByDevice[t.deviceId].id;
 
-     QFont f;
 
-     QPen pen;
 
-     f.setFamily("utf8");
 
-     f.setWeight(QFont::DemiBold);
 
-     f.setPixelSize(10);
 
-     painter->setFont(f);
 
-     rectWorking = QRectF(posBlockx, starty + (_heightPU) * pos,
 
-                          placeTime * scale, (_heightPU - MARGIN));
 
-     painter->drawRect(rectWorking);
 
-     QLinearGradient gradient(posBlockx,
 
-                              starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2,
 
-                              posBlockx + placeTime * scale,
 
-                              starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2);
 
-     QColor workingColor = GANTT_WORKING_COLOR;
 
-     gradient.setColorAt(0.2, workingColor.lighter(110));
 
-     gradient.setColorAt(0.3, Qt::green);
 
-     gradient.setColorAt(0.8, workingColor.darker(270));
 
-     gradient.setSpread(QGradient::PadSpread);
 
-     QBrush brush(gradient);
 
-     pen.setBrush(brush);
 
-     painter->setPen(pen);
 
-     painter->fillRect(rectWorking, brush);
 
- }
 
- void GanttWidget::updateZoom(double value)
 
- {
 
-     qDebug() << "VALEUR === " << value;
 
-     //   if(!(value == 0.0))
 
-     // {
 
-     _timeTotal = value;
 
-     updatePrevLine( _lastValPrevLine);
 
-     //}
 
- }
 
- void GanttWidget::updatePrevLine(double value)
 
- {
 
-     _timeBefore = _timeTotal * (value / 100);
 
-     _timeAfter = _timeTotal * ((100 - value) / 100);
 
-     _lastValPrevLine = value;
 
-     if (!(_timer->isActive()))
 
-     {
 
-         update();
 
-     }
 
- }
 
- void GanttWidget::updateTimeView(int time)
 
- {
 
-     qlonglong newTimeToShow = time;
 
-     if (!(_timer->isActive()))
 
-     {
 
-         _timeToShow = newTimeToShow;
 
-         update();
 
-     }
 
- }
 
- void GanttWidget::connected()
 
- {
 
-     _wasRunning = false;
 
-     _initCompleted = false;
 
-     _timePresent = 0;
 
-     if (!(_timer->isActive()))
 
-     {
 
-         _timer->start(35);
 
-     }
 
- }
 
- void GanttWidget::disconnected()
 
- {
 
-     _wasRunning = true;
 
-     if (_timer->isActive())
 
-     {
 
-         _timer->stop();
 
-     }
 
- }
 
- void GanttWidget::ganttLocked()
 
- {
 
-     update(); // a last drawing update before to freeze the drawing
 
-     if (_timer->isActive())
 
-     {
 
-         _timer->stop(); // freeze the drawing
 
-     }
 
- }
 
- void GanttWidget::ganttUnlocked()
 
- {
 
-     if (!(_timer->isActive()))
 
-     {
 
-         _timer->start(35); // start the timer again
 
-     }
 
- }
 
- void GanttWidget::countPUs()
 
- {
 
-     int length;
 
-     _numCPUs = 0;
 
-     _numGPUs = 0;
 
-     length = _mainWindow->serverDevices()->length();
 
-     _numPUs = length;
 
-     delete _PUsByDevice;
 
-     delete _PUsByPos;
 
-     _PUsByDevice = new StarputopDevice[length];
 
-     _PUsByPos = new StarputopDevice[length];
 
-     int pos = 0;
 
-     /* CPUs */
 
-     foreach(StarputopDevice sD,*_mainWindow->serverDevices())
 
-     {
 
- 	if(sD.type == 0)
 
- 	{
 
-             _PUsByDevice[sD.id].name = sD.name;
 
-             _PUsByDevice[sD.id].type = sD.type;
 
-             _PUsByDevice[sD.id].id = pos; // actual location
 
-             _PUsByPos[pos].id = sD.id; // the reak id
 
-             _PUsByPos[pos].name = sD.name;
 
-             _PUsByPos[pos].type = sD.type;
 
-             _numCPUs++;
 
-             pos++;
 
- 	}
 
-     }
 
-     /* GPUs */
 
-     foreach (StarputopDevice sD , *_mainWindow->serverDevices())
 
-     {
 
- 	if(sD.type == 1 || sD.type == 2)
 
- 	{
 
-             _PUsByDevice[sD.id].name = sD.name;
 
-             _PUsByDevice[sD.id].type = sD.type;
 
-             _PUsByDevice[sD.id].id = pos; // actually location
 
-             _PUsByPos[pos].id = sD.id; // the real id
 
-             _PUsByPos[pos].name = sD.name;
 
-             _PUsByPos[pos].type = sD.type;
 
-             pos++;
 
-             _numGPUs++;
 
- 	}
 
-     }
 
- }
 
- void GanttWidget::paint(QPainter *painter, QPaintEvent *event)
 
- {
 
-     painter->fillRect(event->rect(), _background);
 
-     painter->setPen(_textPen);
 
-     if (_mainWindow->isReady())
 
-     {
 
-         if (!_initCompleted)
 
-         { // do not call countPUs more than once per execution
 
-             countPUs();
 
-             _initCompleted = true;
 
-         }
 
-         drawProgram(painter);
 
-         drawPUs(painter);
 
-         if (_mainWindow->isRunning())
 
-         {
 
-             _timePresent = _mainWindow->effectiveRunningTime();
 
-             _timeToShow = _timePresent; // saved the time of end
 
-             drawTime(painter);
 
-             drawPresentLine(painter);
 
-             drawIdlePU(painter);
 
-             /* Past part */
 
-             qlonglong borneBefore = _timePresent - _timeBefore;
 
-             if (borneBefore < 0)
 
-             {
 
-                 borneBefore = 0;
 
-             }
 
-             _tasks = _taskManager->tasks(borneBefore, _timePresent);
 
-             foreach (StarputopTask t, _tasks)
 
-             {
 
-                 drawWorkPU(painter,t);
 
-             }
 
-             /* Future past */
 
-             qlonglong borneAfter = _timePresent + _timeAfter;
 
-             _tasks = _taskManager->prevTasks(_timePresent, borneAfter);
 
-             foreach		(StarputopTask t, _tasks)
 
-             {
 
-                 drawPrevWorkPU(painter,t);
 
-             }
 
- 	}
 
- 	else if (!_wasRunning)
 
- 	{
 
-             defaultScreen(painter);
 
- 	}
 
-     }
 
-     else
 
-     {
 
- 	if (_wasRunning)
 
- 	{
 
-             // display wanted part of execution (only if it's finished)
 
-             drawFromTime(painter,_timeToShow);
 
- 	}
 
-     }
 
- }
 
 
  |