GanttDiagram.hpp 16 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 ** This file is part of the ViTE project.
 **
 ** This software is governed by the CeCILL-A license under French law
 ** and abiding by the rules of distribution of free software. You can
 ** use, modify and/or redistribute the software under the terms of the
 ** CeCILL-A license as circulated by CEA, CNRS and INRIA at the following
 ** URL: "http://www.cecill.info".
 **
 ** As a counterpart to the access to the source code and rights to copy,
 ** modify and redistribute granted by the license, users are provided
 ** only with a limited warranty and the software's author, the holder of
 ** the economic rights, and the successive licensors have only limited
 ** liability.
 **
 ** In this respect, the user's attention is drawn to the risks associated
 ** with loading, using, modifying and/or developing or reproducing the
 ** software by the user in light of its specific status of free software,
 ** that may mean that it is complicated to manipulate, and that also
 ** therefore means that it is reserved for developers and experienced
 ** professionals having in-depth computer knowledge. Users are therefore
 ** encouraged to load and test the software's suitability as regards
 ** their requirements in conditions enabling the security of their
 ** systems and/or data to be ensured and, more generally, to use and
 ** operate it in the same conditions as regards security.
 **
 ** The fact that you are presently reading this means that you have had
 ** knowledge of the CeCILL-A license and that you accept its terms.
 **
 **
 ** ViTE developers are (for version 0.* to 1.0):
 **
 **        - COULOMB Kevin
 **        - FAVERGE Mathieu
 **        - JAZEIX Johnny
 **        - LAGRASSE Olivier
 **        - MARCOUEILLE Jule
 **        - NOISETTE Pascal
 **        - REDONDY Arthur
 **        - VUCHENER Clément
 **
 */
/*!
 *\file GanttDiagram.hpp
 */

#ifndef GANTTDIAGRAM_HPP
#define GANTTDIAGRAM_HPP
49
#include <iostream>
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "Render.hpp"

class Trace;
/*!
 * \brief Structure used to store container information.
 */
struct Container_{
    /*!
     * \brief Coordinates.
     */
    Element_pos x, y, w, h;
};

/*!
 * \brief Structure used to store container text.
 */
struct Container_text_{
    /*!
     * \brief Coordinates.
     */
Thibault Soucarre's avatar
Thibault Soucarre committed
70
    Element_pos x, y, size;
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
    /*!
     * \brief Text.
     */
    std::string value;
};



/*!
 * \brief This class is used to called opengl or svg primitive functions to draw trace elements.
 */
class GanttDiagram : public Geometry
{
private:

    /*!
     * This attribute store the instance of a drawing class. (OpenGL or SVG for example)
     */
89
    Render *_render;
90
91
92
93
94
95
96

    /*!
     * \brief Used to draw counter.
     */
    bool _start_new_line;


97
    std::vector<Container_>      _containers;
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
    std::vector<Container_text_> _container_texts;

    /*!
     * \brief The default constructor is in private scope to prevent Render instanciation without
     * provide a drawing instance.
     */
    GanttDiagram(){
    }

public:

    /***********************************
     *
     * Constructor and destructor.
     *
     **********************************/

    /*!
     * \brief The default constructor
     */
    GanttDiagram(Render* instance){
119
        _render = instance;
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
    }

    /*!
     * \brief The destructor
     */
    virtual ~GanttDiagram(){
    }


    /***********************************
     *
     * Building functions.
     *
     **********************************/

    /*!
     * \brief Proceeds with the initialization of the draw functions.
     */
    inline void start_draw(){
        /* clear vectors */
        _containers.clear();
        _container_texts.clear();

143
        _render->start_draw();
144
        std::cout << "Gantt::start_draw" << std::endl;
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    }

    /*!
     * \brief Initialize container draws.
     */
    inline void start_draw_containers(){
    }

    /*!
     * \brief Draw a container according to the parameters
     * \param x the x position of the container
     * \param y the y position of the container
     * \param w the width of the container
     * \param h the height of the container
     */
160
161
162
163
164
165
166
167
    inline void draw_container(const Element_pos x,
                               const Element_pos y,
                               const Element_pos w,
                               const Element_pos h,
                               const std::string &value)
    {
        Container_text_ buft;
        Container_      buf;
168
169
170
171
172
173
174
175

        buf.x = x;
        buf.y = y;
        buf.w = w;
        buf.h = h;

        _containers.push_back(buf);

176
        buft.x     = x + w/5;
177
178
179
180
181
        buft.y     = y + h/2;
        buft.value = value;

        _container_texts.push_back(buft);

182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
        if ((x+w)>Info::Container::x_max)
            Info::Container::x_max = x+w;

        if ((y+h)>Info::Container::y_max)
            Info::Container::y_max = y+h;

        if (Info::Container::x_min > x)
            Info::Container::x_min = x;

        if (Info::Container::y_min > y)
            Info::Container::y_min = y;

#ifdef DEBUG_MODE_RENDER_AREA
        std::cerr << __FILE__ << " l." << __LINE__ << ":" << std::endl;
        std::cerr < "Container drawing:" << std::endl;
        std::cerr << "x: " << x << " y: " << y << " w: " << w << " h: " << h << " xmax-xmin: " << Info::Container::x_max << " - " << Info::Container::x_min << " ymax-ymin: " << Info::Container::y_max << " - " << Info::Container::y_min << std::endl;

#endif
    }

    /*!
     * \brief Draw the text of a container.
     * \param x the x position of the text.
     * \param y the y position of the text.
     * \param value the string value of the text.
     *
     * This function stores text in a list. This list will be display each time the render area need to be updated.
     */
210
211
212
    inline void draw_container_text(const Element_pos x, const Element_pos y, const std::string value)
    {
        return;
213
214
215
216
217
    }

    /*!
     * \brief Closes the container display list.
     */
218
219
220
221
222
    inline void end_draw_containers()
    {
        static float j = 0.6f;
        float coeffx =  (Info::Render::width                /Info::Container::x_max) * _x_scale_container_state;
        float coeffy = ((Info::Render::height-_ruler_height)/Info::Container::y_max) * _y_state_scale;
223
224

        /* Before calling start_draw_container(), Info::Container::y_max should have a correct value */
225
        _render->start_draw_containers();
226
227

        for (unsigned int i=0 ; i<_containers.size() ; i++){
228
229
230
231
232
233
            _render->set_color(0, 0, j);
            _render->draw_quad(_containers[i].x * coeffx,
                               trace_to_render_y(_containers[i].y),
                               _z_container,
                               _containers[i].w * coeffx,
                               _containers[i].h * coeffy);
234
235
236
        }

        for (unsigned int i=0 ; i<_container_texts.size() ; i++){
237
238
            _container_texts[i].x *= coeffx;
            _container_texts[i].y  = trace_to_render_y(_container_texts[i].y);
239

240
241
242
243
            _render->draw_text(_container_texts[i].x,
                               _container_texts[i].y,
                               _containers[i].w * coeffx,
                               _container_texts[i].value);
244
245
        }

246
        _render->end_draw_containers();
247
248
249
250
251
    }

    /*!
     * \brief Creates and opens the display list for state draws.
     */
252
253
254
    inline void start_draw_states()
    {
        _render->start_draw_states();
255
256
257
258
259
260
261
262
263
264
265
266
    }

    /*!
     * \brief Draw a state of the trace.
     * \param start the beginning time of the state.
     * \param end the ending time of the state.
     * \param base vertical position of the state.
     * \param height the state height.
     * \param r the red color rate of the state.
     * \param g the green color rate of the state.
     * \param b the blue color rate of the state.
     */
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
    inline void draw_state(const Element_pos start,
                           const Element_pos end,
                           const Element_pos base,
                           const Element_pos height,
                           const Element_col r,
                           const Element_col g,
                           const Element_col b,
                           EntityValue * value)
    {
        _render->set_color(r, g, b);
        _render->draw_state(trace_to_render_x(start - Info::Render::_x_min_visible),
                            trace_to_render_y(base),
                            _z_state,
                            (end-start)*coeff_trace_render_x(),
                            height     *coeff_trace_render_y(),
                            value);
283
284
285
286
287
    }

    /*!
     * \brief Closes the state display list.
     */
288
289
290
    inline void end_draw_states()
    {
        _render->end_draw_states();
291
292
293
294
295
    }

    /*!
     * \brief Open the arrow display list.
     */
296
297
298
    inline void start_draw_arrows()
    {
        _render->start_draw_arrows();
299
300
301
302
303
304
305
306
307
308
309
    }

    /*!
     * \brief Draw an arrow.
     * \param start_time the beginning time of the arrow.
     * \param end_time the ending time of the arrow.
     * \param start_height vertical position of the begining time of the arrow.
     * \param end_height vertical position of the ending time of the arrow.
     *
     * This function stores all the information of the arrow to display it each time the render area need to be updated.
     */
310
311
312
313
314
315
316
317
318
    inline void draw_arrow(Element_pos start_time,
                           Element_pos end_time,
                           Element_pos start_height,
                           Element_pos end_height,
                           const Element_col r,
                           const Element_col g,
                           const Element_col b,
                           EntityValue* value)
    {
319
320
321
322
323
        /* For SVG */
        const Element_pos triangle_size = 2.0;
        const Element_pos coeff         = 180.0f/M_PI;
        Element_pos angle;

324
        _render->set_color(r, g, b);
325
326

        start_time   = trace_to_render_x(start_time - Info::Render::_x_min_visible);
327
        end_time     = trace_to_render_x(end_time   - Info::Render::_x_min_visible);
328
329
330
331
        start_height = trace_to_render_y(start_height);
        end_height   = trace_to_render_y(end_height);

        if (start_time != end_time)
332
            angle = atan2((end_height - start_height), (end_time - start_time))*coeff;
333
334
335
        else
            angle = 90;

336
337
        _render->draw_triangle(end_time, end_height, triangle_size, angle);
        _render->draw_line(start_time, start_height, end_time, end_height, _z_arrow);
338
339

        /* For OpenGL */
340
341
        _render->draw_arrow(start_time, end_time, start_height, end_height, r, g, b, value);
        _render->set_color(1, 1, 1);/* init */
342
343
344
345
346
    }

    /*!
     * \brief Closes the arrow display list.
     */
347
348
349
    inline void end_draw_arrows()
    {
        _render->end_draw_arrows();
350
351
    }

352
353
354
    inline void start_draw_events()
    {
        _render->start_draw_events();
355
356
357
358
359
360
361
362
363
364
    }

    /*!
     * \brief Draw an event.
     * \param time time when the event occurs.
     * \param height vertical position of the event.
     * \param container_height information to draw event. It corresponds to the container height when they are drawn horizontally.
     *
     * This function stores all the information of the event to display it each time the render area need to be updated.
     */
365
366
367
368
369
370
371
372
    inline void draw_event(Element_pos time,
                           Element_pos height,
                           Element_pos container_height,
                           const Element_col r,
                           const Element_col g,
                           const Element_col b,
                           EntityValue* value)
   {
373
        /* For SVG */
374
        _render->set_color(r, g, b);
375
376
377
378
379
380

        time             = trace_to_render_x(time - Info::Render::_x_min_visible);
        height           = trace_to_render_y(height);
        container_height = container_height*coeff_trace_render_y();

        /* For OpenGL */
381
        _render->draw_event(time, height, container_height, value);
382
383
    }

384
385
386
    inline void end_draw_events()
    {
        _render->end_draw_events();
387
388
389
390
391
    }

    /*!
     * \brief Creates and opens the display list for counter draws.
     */
392
393
394
    inline void start_draw_counter()
    {
        _render->set_color(1.0, 1.0, 1.0);
395
396
        _counter_last_x=0.0;
        _counter_last_y=0.0;
397
        _render->start_draw_counter();
398
399
400
401
402
403
404
405
406
        _start_new_line = true;
    }

    /*!
     * \brief Draw a text with the value of a variable
     * \param text text to draw.
     * \param y y position of the point.
     *
     */
407
408
409
    inline void draw_text_value(long int id, double text, double y)
    {
        _render->draw_text_value(id,text,y);
410
    }
411

412
413
414
415
416
417
418
    /*!
     * \brief Draw a point of the counter.
     * \param x x position of the point.
     * \param y y position of the point.
     *
     * Each time counter is increased, this function is called with the coordinates of the new point.
     */
419
420
    inline void draw_counter(const Element_pos x, const Element_pos y)
    {
421
422
423
424
425
426
        if (_start_new_line){/* Start a new line */

            _counter_last_x = x;
            _counter_last_y = y;
            _start_new_line = false;

427
428
429
        }
        else
        {/* line is already started */
430
431

            if (x <= 0.0){/* convention: the line is over */
432
433
434
435
436
                _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible),
                                    trace_to_render_y(_counter_last_y),
                                    trace_to_render_x(Info::Entity::x_max),
                                    trace_to_render_y(_counter_last_y),
                                    _z_counter );
437
                _start_new_line = true;
438
439
440
            }
            else
            {/* add new points to the line */
441
442
443

                /* Each time, the method draw the line from the previous point to
                 the current point (x, y). This last is stored for the next line drawing. */
444
445
446
447
448
449
450
451
452
453
                _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible),
                                    trace_to_render_y(_counter_last_y),
                                    trace_to_render_x(x - Info::Render::_x_min_visible),
                                    trace_to_render_y(_counter_last_y),
                                    _z_counter );
                _render->draw_line( trace_to_render_x(x - Info::Render::_x_min_visible),
                                    trace_to_render_y(_counter_last_y),
                                    trace_to_render_x(x - Info::Render::_x_min_visible),
                                    trace_to_render_y(y),
                                    _z_counter );
454
455
456
457
458
459
460
461
462
                _counter_last_x = x;
                _counter_last_y = y;
            }
        }
    }

    /*!
     * \brief Closes the counter display list.
     */
463
464
    inline void end_draw_counter()
    {
465
466
        if (!_start_new_line) {/* If a line was previously opened */
            /* Draw the last line */
467
468
469
470
471
            _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible),
                                trace_to_render_y(_counter_last_y),
                                trace_to_render_x(Info::Entity::x_max),
                                trace_to_render_y(_counter_last_y),
                                _z_counter );
472
        }
473
        _render->end_draw_counter();
474
475
476
477
478
    }

    /*!
     * \brief Do nothing (it is present for compatibility of the Render class).
     */
479
480
    inline void end_draw()
    {
481
482
483
484
485
486
487
488
489
        std::ostringstream buf_txt;
        Element_pos graduation_diff;
        //Element_pos coeff_prefix;
        const Element_pos offset_x = 0;
        const Element_pos offset_y = 0;

        graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);

        /* Now, draw ruler */
490
        /*Rendering is done in paintGL because we need to recalculate graduations each time paintGL is called, not just when launching the program*/
491
        _render->start_ruler();
492
        {
493
            //_render->call_ruler();
494
        }
495
        _render->end_ruler();
496
497
498
499

        /* clear vectors */
        _containers.clear();
        _container_texts.clear();
500
        _render->end_draw();
501
502

    }
503
};
504
505

#endif