render_area.hpp 10.1 KB
Newer Older
1 2 3 4 5 6 7
/*!
 *\file render_area.hpp
 */

#ifndef RENDER_AREA_HPP
#define RENDER_AREA_HPP

8

9 10
class Render_area;

11 12 13
typedef double Level;


14 15
#include <QtGui>
#include <QGLWidget>/* for the OpenGL Widget */
16
//#include "interface_graphic.hpp"
17

18

19
#include "resource.hpp"
20

21

22 23 24


/*!
25
 * \brief This class redefined the OpenGL widget - QGLWidget - to display the trace.
26
 */
27
class Render_area : public QGLWidget
28 29
 {
     Q_OBJECT
30 31


32

33
 protected:
34 35 36



37 38 39 40
     std::list<Element_pos> _text_pos;
     std::list<std::string> _text_value;


41 42 43 44 45 46 47 48 49
     /***********************************
      *
      * Environment attributes.
      *
      **********************************/
     
     /*!
      * \brief Refers to the parent widget of the render area.
      */
50
     // Interface_graphic* _parent;
51
     
52

53

54 55 56 57 58 59
     /***********************************
      *
      * Data structure attributes.
      *
      **********************************/
     
60
   
61 62


63 64 65 66 67 68

     /***********************************
      *
      * Render area state attributes.
      *
      **********************************/
69

70
     /*!
71 72 73 74 75 76 77 78
      * \brief State when there is no file opened.
      */
     static const int DRAWING_STATE_WAINTING = 1;
     
     /*!
      * \brief State when the application is drawing traces.
      */
     static const int DRAWING_STATE_DRAWING = 2;
79

80
     /*!
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
      * \brief Contains the kind of state for the render area (drawing, waiting, etc.).
      */
     int _state;
 


     /***********************************
      *
      * Default QGLWidget functions.
      *
      **********************************/
     
     /*!
      * \brief Call by the system to initialize the OpenGL render area.
      */
     void initializeGL();
     
     /*!
      * \brief Call by the system when the render area was resized (occurs during a window resizement).
      * \arg width : the new width of the render area.
      *      height : the new height of the render area. 
      */
     void resizeGL(int width, int height);
     
     /*!
      * \brief Call by the system each time the render area need to be updated.
107 108
      */
     void paintGL();
109

110

111
     //  void paintEvent(QPaintEvent *event);
112

113 114 115 116 117 118 119 120 121 122 123 124

     /***********************************
      *
      * The wait screen drawing.
      *
      **********************************/

     
     /***********************************
      * The wait list Attributes.
      **********************************/
     
125
     /*!
126
     * \brief The wait GLu list.
127
     */
128
     GLuint _wait_list;
129 130
     GLuint _list_containers;
     GLuint _list_states;
131

132 133 134 135 136 137
     /*!
     * \brief Rotation angle for the wait.
     */
     float _wait_angle;

     /*!
138 139 140 141
      * \brief Time in ms between two frames for the waiting screen.
      */
     static const int DRAWING_TIMER_DEFAULT = 10;
     
142
     /*!
143 144
      * \brief Wait animation seconds per frame.
      */
145
     int _wait_spf;
146 147 148 149 150
     
     /*!
      * \brief Timer to animate the wait. 
      */
     QTimer* _wait_timer;
151

152

153 154 155 156
     /***********************************
      * Drawing function for the wait screen.
      **********************************/
     
157
     /*!
158 159
     * \brief Display a wait on the screen if there is no file opened.
     * \return Asset value of the wait.
160
     */
161 162 163 164
     GLuint draw_wait();



165

166 167 168 169 170 171 172 173 174 175 176
     /***********************************
      *
      * The trace drawing.
      *
      **********************************/


     /***********************************
      * The drawing list Attributes.
      **********************************/
     
177
     /*!
178
      * \brief The trace Glu list.
179
     */
180
     GLuint _drawing_list;
181

Olivier Lagrasse's avatar
Olivier Lagrasse committed
182
 
183 184
     Element_pos _container_x_max;
     Element_pos _container_y_max;
Olivier Lagrasse's avatar
Olivier Lagrasse committed
185

186

187
     Element_pos _z_arrow;/* z position for arrows */
188 189 190 191

     /***********************************
      * Trace Drawing functions and attributes.
      **********************************/
192 193 194 195
 
     /*!
     * \brief Return the pos container of the list
     */
196
     // Container* get_container(const std::list <Container*> *list_container, const int pos) const;
197 198


Olivier Lagrasse's avatar
Olivier Lagrasse committed
199 200
     int _state_scale;/* temporary */
     int _state_translate;/* temporary */
201
     int _container_view_size;/* temporary */
202

203
 public:
204

205 206 207 208 209 210 211 212


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

213 214 215
     /*!
     * \brief The default constructor
     */
216
     Render_area(QWidget *parent);
217 218 219 220 221

     /*!
     * \brief The destructor
     */
     virtual ~Render_area();
222

223 224 225 226 227 228 229 230


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

231
     /*!
232
      * \brief This function draws the trace.
233
      * \arg trace the trace which be displayed. 
234
      */
235
     bool build();
236 237

     /*!
238 239
      * \brief This function releases the trace.
      */
240 241
     bool unbuild();

Olivier Lagrasse's avatar
Olivier Lagrasse committed
242 243
     void change_scale(int scale);/* temporary -> to change the scale to view states */
     void change_translate(int translate);/* temporary -> to change the translate to view states */
244 245 246
     void change_container_view(int view_size);/* temporary -> to change the size of container view */
     

247
     void start_draw();
248

249
     void start_draw_containers();
250 251 252 253 254 255 256 257

     /*!
     * \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
     */
258
     void draw_container(const Element_pos x, const Element_pos y, const Element_pos w, const Element_pos h);
259 260 261 262 263 264 265

     /*!
      * \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.
      */
266
     void draw_container_text(const Element_pos x, const Element_pos y, const std::string value);
267

268
     void end_draw_containers();
Olivier Lagrasse's avatar
Olivier Lagrasse committed
269
     
270
     void start_draw_states();
271 272 273 274 275 276 277 278 279 280 281

     /*!
      * \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.
      */
282 283 284
     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);

     void end_draw_states();
285

286
     void draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height);
287

288
     void end_draw();
289
    
290 291
  };

292

293 294


295 296 297
/* inline function area */


298 299 300 301 302 303 304 305 306 307
/***********************************
 *
 *
 *
 * Drawing function for the trace.
 *
 *
 *
 **********************************/

308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449

inline void Render_area::start_draw(){
    /* clear lists to store container texts */
    _text_pos.clear();
    _text_value.clear();
}


inline void Render_area::start_draw_containers(){

    _list_containers = glGenLists(1);/* create the list */
    if (_list_containers==0){
        
        //        _parent->warning("Error when creating list");
    }

    glNewList(_list_containers, GL_COMPILE);/* open the list */

}


inline void Render_area::draw_container(const Element_pos x, const Element_pos y, const Element_pos w, const Element_pos h) {

    float j=0.6;

    glBegin(GL_QUADS);/* create a quads */
    {
        glColor3d(0, 0, j);glVertex2d(x, y);
        glColor3d(0, 0, j-0.1);glVertex2d(x, y+h);
        glColor3d(0, 0, j-0.1);glVertex2d(x+w, y+h);
        glColor3d(0, 0, j);glVertex2d(x+w, y);
    }
    glEnd();

    if (x>_container_x_max)
        _container_x_max = x;
    
    if (y>_container_y_max)
        _container_y_max = y;

}

inline void Render_area::draw_container_text(const Element_pos x, const Element_pos y, const std::string value){

    _text_pos.push_back(x); 
    _text_pos.push_back(y);
    _text_value.push_back(value);

}



inline void Render_area::end_draw_containers(){
    glEndList();/* close the list */
}




inline void Render_area::start_draw_states(){

    _list_states = glGenLists(1);/* create the list */
    if (_list_states==0){
        
        //      _parent->warning("Error when creating list");
    }
    
    glNewList(_list_states, GL_COMPILE);/* open the list */
}


inline void Render_area::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){

    

#ifdef DEBUG_MODE_RENDER_AREA
    
    cerr << __FILE__ << " l." << __LINE__ << ":" << endl;  
    cerr << "States position (for drawing): (x = " <<  start << ", y = " << base << ", w = " << end-start << ", h = " << height << ") -> level:" << level << endl << endl;  

#endif

  
    glBegin(GL_QUADS);/* create a quads */
    {
        glColor3d(r, g, b);glVertex2d(start, base);
        glColor3d(r, g, b);glVertex2d(start, base + height);
        glColor3d(r*2, g*2, b*2);glVertex2d(end, base + height);
        glColor3d(r*2, g*2, b*2);glVertex2d(end, base);
    }
    glEnd();
}


inline void Render_area::end_draw_states(){
    glEndList();/* close the list */
}


inline void Render_area::draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height){

    Element_pos angle;


    glPushMatrix();

    if (start_time != end_time){

        angle = atan2((end_height - start_height), (end_time - start_time))*180.0f/PI;/* arc tangent */

        glRotatef(angle,0, 0, 1);
 
    }/* end if (start_time != end_time) */

    glTranslated(end_time, end_height, _z_arrow);
    
    glBegin(GL_TRIANGLES);/* create an arrow */
    {
        glColor3d(1.0, 1.0, 1.0);glVertex2d(0.0, 0.5);
        glColor3d(0.9, 0.9, 0.9);glVertex2d(0.5, -0.5);
        glColor3d(0.9, 0.9, 0.9);glVertex2d(-0.5, -0.5);
    }
    glEnd();
    
    glPopMatrix();


    glBegin(GL_LINE);
    {
        glColor3d(1.0, 1.0, 1.0);glVertex3d(start_time, start_height, _z_arrow);
        glColor3d(0.9, 0.9, 0.9);glVertex3d(end_time, end_height, _z_arrow);
    }
    glEnd();

}


inline void Render_area::end_draw(){

}


450
 #endif