diff --git a/src/common/Errors.cpp b/src/common/Errors.cpp index b1efe17bdde27740a87e1311695ae33a89ca44d5..44b7f2b1762af43ee66f4f6be012848b92de3e23 100644 --- a/src/common/Errors.cpp +++ b/src/common/Errors.cpp @@ -203,7 +203,7 @@ void Error::flush(const string &filename){ return; } else { - outfile << "File " << Message::get_interface()->get_filename() << endl << endl; + outfile << "File " << Message::get_interface()->get_filename().back() << endl << endl; if(!_errors.empty()) { outfile << "Errors :" << endl; diff --git a/src/common/Info.cpp b/src/common/Info.cpp index e8208b15bf057f4d1969469cd2d0859ce10bed37..abc5cfefcdf1c59a83c269803a5c151341988e3f 100644 --- a/src/common/Info.cpp +++ b/src/common/Info.cpp @@ -68,10 +68,6 @@ Element_pos Info::Render::height = 100; /* 100 OpenGL units for 1 pixel */ bool Info::Render::_key_alt = false; bool Info::Render::_key_ctrl = false; -Element_pos Info::Render::_x_min_visible = 0.0; -Element_pos Info::Render::_x_max_visible = 0.0; -Element_pos Info::Render::_x_min = 0.0; -Element_pos Info::Render::_x_max = 0.0; Element_pos Info::Render::_info_x = 0.0; Element_pos Info::Render::_info_y = 0.0; @@ -103,11 +99,6 @@ void Info::release_all(){ Info::Container::y_min = 0; Info::Container::y_max = 0; - Info::Entity::x_min = 0; - Info::Entity::x_max = 0; Info::Entity::y_min = 0; Info::Entity::y_max = 0; - - Info::Render::_x_min_visible = 0.0; - Info::Render::_x_max_visible = 0.0; } diff --git a/src/common/Info.hpp b/src/common/Info.hpp index 0e609eb8527c2eb010317b4ae8e02605c345f90f..1f4a8046960c78f9d8598f8e77cbb2f19304f4ca 100644 --- a/src/common/Info.hpp +++ b/src/common/Info.hpp @@ -199,26 +199,6 @@ public: */ static bool _vertical_line; - /*! - * \brief Contains the trace minimum visible time. - */ - static Element_pos _x_min_visible; - - /*! - * \brief Contains the trace maximum visible time. - */ - static Element_pos _x_max; - - /*! - * \brief Contains the trace minimum visible time, uncorrected (state width isn't removed) - */ - static Element_pos _x_min; - - /*! - * \brief Contains the trace maximum visible time. - */ - static Element_pos _x_max_visible; - /*! * \brief Contains the x position of selection. */ diff --git a/src/core/Core.cpp b/src/core/Core.cpp index 245354d1b291ae887ced175751155729b4eb4fac..b879c347d33bb60608117bee39655fa5d47f772e 100644 --- a/src/core/Core.cpp +++ b/src/core/Core.cpp @@ -155,7 +155,6 @@ using namespace std; Core::Core(int &argc, char ** argv) { - /* Initialize global variable */ waitGUIInit = nullptr; _is_window_displayed = false; @@ -218,8 +217,8 @@ Core::Core(int &argc, char ** argv) Core::~Core(){ - if( _trace != nullptr ) - delete _trace; + for (int i = 0; i < _traces.size(); i++) + delete _traces[i]; if ( _run_env[0] != nullptr ) delete _run_env[0]; @@ -227,9 +226,9 @@ Core::~Core(){ if ( _run_env[1] != nullptr ) delete _run_env[1]; - if (_render_windowed != nullptr ) { - _render_windowed->release(); - delete _render_windowed; + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->release(); + delete _renders[i]; } /* Qt desallocates _main_window and _render_windowed automatically */ @@ -323,14 +322,14 @@ int Core::get_options(int &argc, char **argv) break; case 'i' : - _file_opened = optarg; + _files_opened.push_back(optarg); if (state == 0) state = _STATE_OPEN_FILE; break; case 's' : // We want to split the file and save its parts - _file_opened = optarg; + _files_opened.push_back(optarg); Info::Splitter::split=true; if (state == 0) state = _STATE_SPLITTING ; break; @@ -381,7 +380,7 @@ int Core::get_options(int &argc, char **argv) if(optind < argc) { - _file_opened = largv[optind]; + _files_opened.push_back(largv[optind]); if (state == 0) state = _STATE_OPEN_FILE; } @@ -400,7 +399,7 @@ int Core::get_options(int &argc, char **argv) * **********************************/ -bool Core::draw_trace(const string & filename, const int format) { +bool Core::draw_trace(const std::string & filename, const int format, int index) { delete parser; parser = nullptr; DrawTrace drawing_ogl; @@ -428,15 +427,16 @@ bool Core::draw_trace(const string & filename, const int format) { _main_window->update_recent_files_menu(); } - if (nullptr == _trace) { /* no trace is loaded, parse the file */ + while (_traces.size() <= index) { + this->launch_action(_STATE_OPEN_NEW_RENDER_AREA, &index); + } + + if (nullptr == _traces[index]) { /* no trace is loaded, parse the file */ - /* Init data */ - Info::Entity::x_min = 0; - Info::Entity::x_max = 0; - Info::Render::_x_min_visible = 0; - Info::Render::_x_max_visible = 0; + Info::Entity::x_min = 0; + Info::Entity::x_max = 0; - _trace = new Trace(); + _traces[index] = new Trace(); // Init of the thread _finished = new QWaitCondition(); @@ -445,7 +445,7 @@ bool Core::draw_trace(const string & filename, const int format) { QThread thread; - ParsingThread pt(parser, _trace, _finished,_closed, _mutex); + ParsingThread pt(parser, _traces[index], _finished,_closed, _mutex); pt.moveToThread(&thread); qRegisterMetaType<std::string>("std::string"); @@ -465,8 +465,8 @@ bool Core::draw_trace(const string & filename, const int format) { } #if defined(USE_ITC) && defined(BOOST_SERIALIZE) - if(Info::Splitter::path.empty())Info::Splitter::path=QFileInfo(_file_opened.c_str()).dir().path().toStdString(); - if(Info::Splitter::filename.empty())Info::Splitter::filename=QFileInfo(_file_opened.c_str()).baseName().toStdString(); + if(Info::Splitter::path.empty())Info::Splitter::path=QFileInfo(_files_opened.back().c_str()).dir().path().toStdString(); + if(Info::Splitter::filename.empty())Info::Splitter::filename=QFileInfo(_files_opened.back().c_str()).baseName().toStdString(); if(Info::Splitter::xml_filename.empty() && !_xml_config_file.empty())Info::Splitter::xml_filename=_xml_config_file; if(Info::Splitter::split==true){ @@ -546,7 +546,7 @@ bool Core::draw_trace(const string & filename, const int format) { loaded = (int)(loaded_f*100.0f); if(parser->is_end_of_parsing() && !killed){ - if(!_xml_config_file.empty() && _trace->get_view_root_containers()->empty()){//if we have a partial loading, process it here, but only once + if(!_xml_config_file.empty() && _traces[index]->get_view_root_containers()->empty()){//if we have a partial loading, process it here, but only once launch_action(_DRAW_OPENGL_PARTIAL,nullptr); } @@ -629,27 +629,38 @@ bool Core::draw_trace(const string & filename, const int format) { delete parser; parser=nullptr; + + _renders[index]->entities_x_min = Info::Entity::x_min; + _renders[index]->entities_x_max = Info::Entity::x_max; } - else if ( _file_opened != filename) {/* just check if execution is normal */ - *Message::get_instance() << "Try to use file: " << filename << " instead of a previous parsed file: " << _file_opened << Message::ende; + else if (index < _files_opened.size()) { + if ( _files_opened[index] != filename) {/* just check if execution is normal */ + *Message::get_instance() << "Try to use file: " << filename << " instead of a previous parsed file: " << _files_opened[index] << Message::ende; + } } - if(_trace!=nullptr && !killed){ - if (Info::Render::_x_min_visible == Info::Render::_x_max_visible){ // first time - _trace->set_interval_constrained(new Interval(0,_trace->get_max_date())); + + + if(_traces[index]!=nullptr && !killed){ + if (_renders[index]->_x_min_visible == _renders[index]->_x_max_visible){ // first time + _traces[index]->set_interval_constrained(new Interval(0,_traces[index]->get_max_date())); }else{ - _trace->set_interval_constrained(new Interval(Info::Render::_x_min_visible, Info::Render::_x_max_visible)); + _traces[index]->set_interval_constrained(new Interval(_renders[index]->_x_min_visible, _renders[index]->_x_max_visible)); } - if(!_xml_config_file.empty() && _trace->get_view_root_containers()->empty()){//if we have a partial loading, process it here, but only once + if(!_xml_config_file.empty() && _traces[index]->get_view_root_containers()->empty()){//if we have a partial loading, process it here, but only once launch_action(_DRAW_OPENGL_PARTIAL,nullptr); } if (_DRAW_OPENGL == format) { - GanttDiagram render(_render_windowed); - drawing_ogl.build(&render, _trace); - _render_windowed->build(); + GanttDiagram render(_renders[index]); + drawing_ogl.build(&render, _traces[index]); + _renders[index]->build(); // _render_windowed->update(); - _render_windowed->refresh_scroll_bars(); - _file_opened = filename;/* store filename for a future export */ + _renders[index]->refresh_scroll_bars(); + if (index < _files_opened.size()) { /* store filename for a future export */ + _files_opened[index] = filename; + } else { + _files_opened.push_back(filename); + } } else if (_DRAW_SVG == format) { @@ -661,25 +672,25 @@ bool Core::draw_trace(const string & filename, const int format) { buf_max = Info::Entity::x_max; /* Change current view to fit the user zoom */ - Info::Render::_x_min_visible = _time_start; + rsvg->_x_min_visible = _time_start; if(_time_end == 0.) { - Info::Render::_x_max_visible = _trace->get_max_date().get_value(); - Info::Entity::x_max = Info::Render::_x_max_visible; + rsvg->_x_max_visible = _traces[index]->get_max_date().get_value(); + Info::Entity::x_max = rsvg->_x_max_visible; } else { - Info::Render::_x_max_visible = _time_end; + rsvg->_x_max_visible = _time_end; } - if(Info::Entity::x_max >= Info::Render::_x_min_visible) { - Info::Entity::x_min = Info::Render::_x_min_visible; + if(Info::Entity::x_max >= rsvg->_x_min_visible) { + Info::Entity::x_min = rsvg->_x_min_visible; } if(_time_end > _time_start && _time_end <= Info::Entity::x_max) { Info::Entity::x_max = _time_end; } cout << "Exporting trace to " << _path_to_export<<" ... Please Wait " << endl ; GanttDiagram render(rsvg); - drawing_ogl.build(&render, _trace); + drawing_ogl.build(&render, _traces[index]); delete(rsvg);/* Release the svg render */ @@ -732,7 +743,7 @@ void Core::launch_action(int state, void* arg) { break; case _STATE_OPEN_FILE: - message << QObject::tr("Opening the file: ").toStdString ()+_file_opened + message << QObject::tr("Opening the file: ").toStdString ()+_files_opened.back() << Message::endi; __attribute__((fallthrough)); @@ -741,6 +752,32 @@ void Core::launch_action(int state, void* arg) { waitGUIInit = new QEventLoop(this); + _main_window = new Interface_graphic(this);/* launch the window interface */ + Message::set_interface(_main_window);/* define which interface will receive messages */ + + connect(this, &Core::close_windows, + _main_window, &Interface_graphic::on_quit_triggered); + + int zero = 0; + this->launch_action(_STATE_OPEN_NEW_RENDER_AREA, &zero); + + /* Wait that the open gl renderer calls waitGUIInit->quit() to load the file */ + waitGUIInit->exec(); + if (_STATE_OPEN_FILE == state) { + _main_window->opening_file( + _files_opened.back());/* Must be called after binding the render area to the main window */ + if (false == draw_trace(_files_opened.back(), _DRAW_OPENGL, 0)) { + message << QObject::tr("Draw trace failed").toStdString() + << Message::ende; + break; + } + } + + _is_window_displayed = true; + break; + } + + case _STATE_OPEN_NEW_RENDER_AREA: { // Check the compatibility of the system with the render engine #ifndef USE_VULKAN QGLFormat format(QGL::HasOverlay); @@ -755,31 +792,33 @@ void Core::launch_action(int state, void* arg) { if (!QGLFormat::hasOpenGL()) qFatal("This system has no OpenGL support"); #endif - - _main_window = new Interface_graphic(this);/* launch the window interface */ - Message::set_interface(_main_window);/* define which interface will receive messages */ - - connect(this, &Core::close_windows, - _main_window, &Interface_graphic::on_quit_triggered); - + int index = *((int*) arg); + if (index >= _main_window->numberOfRenders()) + _main_window->addRender(); + // format.setOverlay(true); #ifdef USE_VULKAN - _render_windowed = new Render_vulkan(this, _main_window); + _renders.push_back(new Render_vulkan(this, _main_window)); #else #ifdef VITE_ENABLE_VBO - _render_windowed = new Render_alternate(this, _main_window, format); + if (index >= _renders.size()) + _renders.push_back(new Render_alternate(this, _main_window, format)); #else - _render_windowed = new Render_opengl (this, _main_window, format); + _renders.push_back(new Render_opengl(this, _main_window, format)); #endif #endif + if (index >= _traces.size()) + _traces.push_back(nullptr); + + Render_windowed* render = _renders[_renders.size() - 1]; - if (nullptr == _render_windowed) { + if (nullptr == render) { message << QObject::tr("Cannot allocate memory for an OpengGL instance").toStdString() << Message::ende; break; } - if (!_render_windowed->is_validated()) { + if (!render->is_validated()) { break; } @@ -791,34 +830,25 @@ void Core::launch_action(int state, void* arg) { // else // message << QObject::tr("An overlay format was originally asked, but was not created").toStdString () << Message::endw; // } - _main_window->bind_render_area(_render_windowed, 0); - - /* Wait that the open gl renderer calls waitGUIInit->quit() to load the file */ - waitGUIInit->exec(); - if (_STATE_OPEN_FILE == state) { - _main_window->opening_file( - _file_opened);/* Must be called after binding the render area to the main window */ - if (false == draw_trace(_file_opened, _DRAW_OPENGL)) { - message << QObject::tr("Draw trace failed").toStdString() - << Message::ende; - break; - } - } + _main_window->bind_render_area(render, _renders.size() - 1); // If -t has been set, we define the interval to zoom in - if (_time_start != 0 && _time_end == 0.) - _time_end = _trace->get_max_date().get_value(); + if (_time_start != 0 && _time_end == 0.) { + Trace* trace = _traces[_traces.size() - 1]; + _time_end = trace->get_max_date().get_value(); + } if (_time_end != 0.) { - _render_windowed->apply_zoom_on_interval(_time_start, _time_end); + render->apply_zoom_on_interval(_time_start, _time_end); } - _is_window_displayed = true; + QApplication::processEvents(); + break; } case _STATE_SPLITTING: - *Message::get_instance() << "Splitting " << _file_opened << Message::endi; - draw_trace(_file_opened, _STATE_SPLITTING); + *Message::get_instance() << "Splitting " << _files_opened.back() << Message::endi; + draw_trace(_files_opened.back(), _STATE_SPLITTING, 0); break; @@ -838,25 +868,34 @@ void Core::launch_action(int state, void* arg) { _closed->wait(_mutex,100); }*/ - if (_render_windowed->unbuild() == false) - message << "Close file : an error occured with trace releasing." << Message::ende; - _file_opened.clear(); - - if (false == _is_trace_loaded) { *Message::get_instance() << "Try to release a render area whereas no file was loaded" << Message::ende; - } else { - _is_trace_loaded = false; } - if (nullptr == _trace) { - *Message::get_instance() << "Try to release a render area whereas no trace is loaded" << Message::ende; - } else { - delete _trace; - _trace = nullptr; - } - _render_windowed->update_render(); + // releases last render + Render_windowed* render = _renders.back(); + if (render->unbuild() == false) + message << "Close file : an error occured with trace releasing." << Message::ende; + + render->update_render(); + _files_opened.pop_back(); + + if (!_traces.empty()) { + Trace* trace = _traces.back(); + _traces.pop_back(); + + if (nullptr == trace) { + *Message::get_instance() << "Try to release a render area whereas no trace is loaded" << Message::ende; + } else { + delete trace; + _traces[_traces.size()] = nullptr; + } + } + + if (_traces.size() == 0) { + _is_trace_loaded = false; + } /* Release all data */ Info::release_all(); } @@ -865,12 +904,12 @@ void Core::launch_action(int state, void* arg) { case _STATE_EXPORT_FILE: case _STATE_EXPORT_FILE_IN_INTERVAL: { - if (_file_opened.empty()) { + if (_files_opened.empty()) { *Message::get_instance() << "Please to previously open a trace." << Message::endw; return; } - cout << "export of " << _file_opened << " to " << _path_to_export << " between "; + cout << "export of " << _files_opened.back() << " to " << _path_to_export << " between "; if(_time_start == 0){ cout << "the beginning of the trace to "; } @@ -884,41 +923,55 @@ void Core::launch_action(int state, void* arg) { cout << "the end of the trace." << endl; } - draw_trace(_file_opened, _DRAW_SVG); + draw_trace(_files_opened.back(), _DRAW_SVG, 0); } break; case _STATE_RENDER_AREA_CHANGE_TRANSLATE: - _render_windowed->change_translate( *((int*)arg) ); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->change_translate( *((int*)arg) ); + } break; case _STATE_RENDER_AREA_CHANGE_SCALE: - _render_windowed->change_scale( *((Element_pos*)arg) ); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->change_scale( *((Element_pos*)arg) ); + } break; case _STATE_RENDER_AREA_CHANGE_SCALE_Y: - _render_windowed->change_scale_y( *((Element_pos*)arg) ); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->change_scale_y( *((Element_pos*)arg) ); + } break; case _STATE_RENDER_AREA_CHANGE_CONTAINER_SCALE: - _render_windowed->change_scale_container_state( *((int*)arg) ); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->change_scale_container_state( *((int*)arg) ); + } break; case _STATE_RENDER_AREA_REPLACE_SCALE: - _render_windowed->replace_scale( *((Element_pos*)arg) ); - _render_windowed->replace_scale_y( *((Element_pos*)arg) ); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->replace_scale( *((Element_pos*)arg) ); + _renders[i]->replace_scale_y( *((Element_pos*)arg) ); + } break; case _STATE_RENDER_AREA_REPLACE_TRANSLATE: - _render_windowed->replace_translate( *((Element_pos*)arg) ); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->replace_translate( *((Element_pos*)arg) ); + } break; case _STATE_RENDER_AREA_REPLACE_TRANSLATE_Y: - _render_windowed->replace_translate_y( *((Element_pos*)arg) ); + _renders[*((int*) ((void**)arg)[0])]->replace_translate_y( *((Element_pos*) ((void**)arg)[1]) ); break; case _STATE_RENDER_AREA_REGISTERED_TRANSLATE: - _render_windowed->registered_translate( *((int*)arg) ); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->registered_translate( *((int*)arg) ); + } break; case _STATE_AJUST_SCROLL_BARS: @@ -935,28 +988,49 @@ void Core::launch_action(int state, void* arg) { break; case _STATE_RENDER_DISPLAY_INFORMATION: - if(_trace != nullptr){ - buf.display_information(_trace, Info::Render::_info_x, Info::Render::_info_y, Info::Render::_info_accurate); + for (int i = 0; i < _traces.size(); i++) { + if(_traces[i] != nullptr){ + buf.display_information(_traces[i], Info::Render::_info_x, Info::Render::_info_y, Info::Render::_info_accurate); + } } break; case _STATE_RENDER_UPDATE: - _render_windowed->update_render(); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->update_render(); + } break; case _STATE_CLEAN_RENDER_AREA: { - Info::Render::_x_min_visible = 0.0; - Info::Render::_x_max_visible = 0.0; - if (_render_windowed->unbuild() == false) - message << "Close file : an error occured while cleaning the render." << Message::ende; - _render_windowed->release(); - _render_windowed->update_render(); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->_x_min_visible = 0.0; + _renders[i]->_x_max_visible = 0.0; + if (_renders[i]->unbuild() == false) + message << "Close file : an error occured while cleaning the render." << Message::ende; + _renders[i]->release(); + _renders[i]->update_render(); + } } break; + + case _STATE_REMOVE_RENDER_AREA: + { + Render_windowed* render = _renders.back(); + _renders.pop_back(); + + delete render; + _renders[_renders.size()] = nullptr; + + if(_renders.size() > 0) + _main_window->removeRender(); + break; + } case _STATE_RENDER_SHOW_MINIMAP: - _render_windowed->show_minimap(); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->show_minimap(); + } break; case _STATE_SWITCH_CONTAINERS: @@ -965,8 +1039,8 @@ void Core::launch_action(int state, void* arg) { Element_pos yr2 = ((Element_pos*)arg)[1]; const Container* container=nullptr; const Container* container2=nullptr; - const Container::Vector *root_containers = _trace->get_view_root_containers(); - if(root_containers->empty())root_containers= _trace->get_root_containers(); + const Container::Vector *root_containers = _traces[0]->get_view_root_containers(); + if(root_containers->empty())root_containers= _traces[0]->get_root_containers(); if (!root_containers->empty()){ for (const auto &root_container : *root_containers) if ((container = buf.search_container_by_position(root_container, yr))) @@ -986,10 +1060,10 @@ void Core::launch_action(int state, void* arg) { return; //we found the two children containers, we have to know the depth - Element_pos xr = ((Element_pos*)arg)[2] * (_trace->get_depth()+1); + Element_pos xr = ((Element_pos*)arg)[2] * (_traces[0]->get_depth()+1); if(xr<0)return; - Element_pos xr2 = ((Element_pos*)arg)[3] * (_trace->get_depth()+1); + Element_pos xr2 = ((Element_pos*)arg)[3] * (_traces[0]->get_depth()+1); if(xr2<0)return; for(int i=0; i < (const_cast<Container*>(container)->get_depth() - xr); i++){ container= container->get_parent(); @@ -1014,9 +1088,9 @@ void Core::launch_action(int state, void* arg) { bool children_allocated = false; if( parent == nullptr ) {//we switch top level containers - children = _trace->get_view_root_containers(); + children = _traces[0]->get_view_root_containers(); if( children->empty() ) - children = _trace->get_root_containers(); + children = _traces[0]->get_root_containers(); } else { children = new std::list<Container*>(*parent->get_view_children()); if( children->empty() ) { @@ -1051,20 +1125,21 @@ void Core::launch_action(int state, void* arg) { else new_list->push_back(*it); } - _trace->set_view_root_containers(*new_list); + _traces[0]->set_view_root_containers(*new_list); delete new_list; } - Element_pos zoom[2]={Info::Render::_x_min, Info::Render::_x_max}; - Info::Render::_x_min_visible = 0.0; - Info::Render::_x_max_visible = 0.0; - launch_action(Core:: _STATE_CLEAN_RENDER_AREA); -#if defined(USE_ITC) && defined(BOOST_SERIALIZE) - _trace->updateTrace(new Interval(zoom[0], zoom[1])); -#endif - draw_trace(get_filename(),Core::_DRAW_OPENGL); - launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom); + + for (int i = 0; i < _renders.size(); i++) { + Element_pos zoom[3] = {_renders[i]->_x_min, _renders[i]->_x_max, (Element_pos) i}; + + #if defined(USE_ITC) && defined(BOOST_SERIALIZE) + _traces[i]->updateTrace(new Interval(zoom[0], zoom[1])); + #endif + draw_trace(get_filename().back(),Core::_DRAW_OPENGL, i); + launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom); + } launch_action(Core:: _STATE_RENDER_UPDATE); if ( children_allocated ) { @@ -1077,7 +1152,7 @@ void Core::launch_action(int state, void* arg) { case _DRAW_OPENGL_PARTIAL: { //_main_window->get_node_select()->set_trace(_trace); - bool xml_success = _trace->load_config_from_xml(QString::fromStdString(_xml_config_file)); + bool xml_success = _traces[0]->load_config_from_xml(QString::fromStdString(_xml_config_file)); if(!xml_success){ //std::list<Container *> displayed_containers; //_main_window->get_node_select()->build_displayed_nodes(displayed_containers); @@ -1089,15 +1164,19 @@ void Core::launch_action(int state, void* arg) { } case _STATE_ZOOM_IN_AN_INTERVAL: { - _render_windowed->apply_zoom_on_interval(((Element_pos*)arg)[0], ((Element_pos*)arg)[1]); + for (int i = 0; i < _renders.size(); i++) { + _renders[i]->apply_zoom_on_interval(((Element_pos*)arg)[0], ((Element_pos*)arg)[1]); + } } break; case _STATE_UPDATE_VARVALUES: { - if( nullptr != _trace ) { - std::map<long int, double> var_map = _trace->update_text_variable_values(((Element_pos*)arg)[0]); - buf.draw_text_variable_values(_render_windowed, &var_map, ((Element_pos*)arg)[0]); + for (int i = 0; i < _traces.size(); i++) { + if( nullptr != _traces[i] ) { + std::map<long int, double> var_map = _traces[i]->update_text_variable_values(((Element_pos*)arg)[0]); + buf.draw_text_variable_values(_renders[i], &var_map, ((Element_pos*)arg)[0]); + } } } break; @@ -1113,7 +1192,7 @@ void Core::launch_action(int state, void* arg) { char args[512]; sprintf(args,"-t %lf:%lf", _time_start, _time_end); QStringList arguments = (QStringList() << QString::fromStdString(args)); - arguments << QString::fromStdString(_file_opened); + arguments << QString::fromStdString(_files_opened.back()); QString program; QDir::setCurrent(*_run_env[0]); @@ -1153,6 +1232,14 @@ void Core::display_help(){ } +Render* Core::get_render_of_trace(const Trace* trace) const { + for (int i = 0; i < _traces.size(); i++) { + if (_traces[i] == trace) return _renders[i]; + } + return nullptr; +} + + /*********************************** * * @@ -1176,8 +1263,8 @@ void Core::information(const string &s) const{ cerr << s <<endl; } -const string Core::get_filename() const{ - return _file_opened; +const std::vector<std::string> Core::get_filename() const{ + return _files_opened; } void Core::set_path_to_export(const string& path){ @@ -1197,7 +1284,7 @@ void Core::set_max_value_for_export(const double d) { } Trace *Core::get_trace() const { - return _trace; + return _traces[0]; } @@ -1227,5 +1314,5 @@ void Core::export_variable(Variable *var, const string &filename) { } Render_windowed* Core::get_render() const { - return _render_windowed; + return _renders[0]; } diff --git a/src/core/Core.hpp b/src/core/Core.hpp index 91e3fb7d9b2180c0841c1411658d7260b40d53a6..c1d63b265c824096831ffd7aa63c9cdba6459730 100644 --- a/src/core/Core.hpp +++ b/src/core/Core.hpp @@ -232,6 +232,10 @@ class Core : public QObject, public Interface { static const int _STATE_UPDATE_VARVALUES = 30; + static const int _STATE_OPEN_NEW_RENDER_AREA = 31; + + static const int _STATE_REMOVE_RENDER_AREA = 32; + /*! * \brief Launch an action according to the argument state value. * \param state An integer corresponding to a kind of action which must be executed. @@ -292,7 +296,7 @@ protected: * \brief Contains the OpenGL render instance. */ /* MOD */ - Render_windowed* _render_windowed; + std::vector<Render_windowed*> _renders; #ifdef USE_MPI boost::mpi::communicator _world; @@ -310,7 +314,7 @@ protected: /*! * \brief Contains the trace instance. */ - Trace* _trace; + std::vector<Trace*> _traces; QMutex* _mutex; Parser* parser = nullptr; @@ -323,9 +327,9 @@ protected: QString* _run_env[2]; /*! - *\brief If a file must be opened, this attribute contains its path. + *\brief If files must be opened, this attribute contains their path. */ - std::string _file_opened; + std::vector<std::string> _files_opened; /*! *\brief If a container's config file has to be opened, this attribute contains its path. @@ -406,7 +410,7 @@ public: * * \return true if no errors occurs. */ - bool draw_trace(const std::string & filename, const int format); + bool draw_trace(const std::string & filename, const int format, int index); /*! * \brief This function launch Qt event loop. @@ -418,7 +422,7 @@ public: * \brief Get the name of the current trace file. * */ - const std::string get_filename() const override; + const std::vector<std::string> get_filename() const override; /*! * \brief Set the name of the output file for SVG export. @@ -490,6 +494,11 @@ public: */ Render_windowed* get_render() const; + /*! + * \brief Returns the displayed render area which shows the given trace, if it exists, `nullptr` otherwise + */ + Render* get_render_of_trace(const Trace* trace) const; + /*! *\brief Export a counter * Need to choose a counter, and a filename diff --git a/src/interface/Interface.hpp b/src/interface/Interface.hpp index 6fb85e590a64fb62ad016bfffcdc8d9255051526..d9a69d3e32fc8ca0cd4e0cdc21d0b4aa68e947e4 100644 --- a/src/interface/Interface.hpp +++ b/src/interface/Interface.hpp @@ -49,6 +49,8 @@ #ifndef INTERFACE_HPP #define INTERFACE_HPP +#include <vector> + class Interface; @@ -90,7 +92,7 @@ public: /*! \brief Return the name of the file opened. */ - virtual const std::string get_filename() const = 0; + virtual const std::vector<std::string> get_filename() const = 0; }; #endif diff --git a/src/interface/Interface_graphic.cpp b/src/interface/Interface_graphic.cpp index f6882ffcf5aeaa15d2b78992562894a44e581cef..41189481381c04b44b0be7f8d993e72c03df0d61 100644 --- a/src/interface/Interface_graphic.cpp +++ b/src/interface/Interface_graphic.cpp @@ -95,7 +95,7 @@ using namespace std; **********************************/ -Interface_graphic::Interface_graphic(Core* core, QWidget *parent):QMainWindow(parent){ +Interface_graphic::Interface_graphic(Core* core, QWidget *parent):multirender_window(parent){ setupUi(this); @@ -204,16 +204,12 @@ void Interface_graphic::load_windows(){ _ui_info_window->setWindowFlags(_ui_info_window->windowFlags() | Qt::WindowStaysOnTopHint);/* Always display info_window on top */ _ui_time_selection_export->setWindowFlags(_ui_time_selection_export->windowFlags() | Qt::WindowStaysOnTopHint); - /* Load widget from the .ui file */ - CKFP(_ui_render_area_layout = this->findChild<QVBoxLayout*>(QStringLiteral("render_area_layout")), "Cannot find the render_area layout in the .ui file"); - CKFP(_ui_fullscreen_menu = this->findChild<QAction*>(QStringLiteral("fullscreen")), "Cannot find the fullscreen menu in the .ui file"); CKFP(_ui_info_trace_text = _ui_info_window->findChild<QTextEdit*>(QStringLiteral("info_trace_text")), "Cannot find the info_trace_text QTextEdit widget in the .ui file"); CKFP(_ui_info_selection_text = _ui_info_window->findChild<QTextEdit*>(QStringLiteral("info_selection_text")), "Cannot find the info_selection_text QTextEdit widget in the .ui file"); CKFP(_ui_toolbar = this->findChild<QToolBar*>(QStringLiteral("toolBar")), "Cannot find the tool bar in the .ui file"); CKFP(_ui_x_scroll = this->findChild<QScrollBar*>(QStringLiteral("x_scroll")), "Cannot find the horizontal scroll bar in the .ui file"); - CKFP(_ui_y_scroll = this->findChild<QScrollBar*>(QStringLiteral("y_scroll")), "Cannot find the vertical scroll bar in the .ui file"); CKFP(_ui_zoom_box = this->findChild<QComboBox*>(QStringLiteral("zoom_box")), "Cannot find the zoom box in the .ui file"); @@ -243,7 +239,6 @@ void Interface_graphic::load_windows(){ QMetaObject::connectSlotsByName(nullptr); _ui_x_scroll->setMaximum(_REAL_X_SCROLL_LENGTH); - _ui_y_scroll->setMaximum(_REAL_Y_SCROLL_LENGTH); delete loader; /* Display the main window */ @@ -313,9 +308,9 @@ void Interface_graphic::opening_file(const string &path){ information(string("File opened: ")+ path); - _trace_path = path; + _traces_path.push_back(path); - this->setWindowTitle(QStringLiteral("ViTE :: ")+QString::fromStdString(_trace_path)); + this->setWindowTitle(QStringLiteral("ViTE :: ")+QString::fromStdString(_traces_path.back())); QApplication::setOverrideCursor(Qt::WaitCursor); @@ -345,7 +340,9 @@ void Interface_graphic::set_scroll_bars_length(Element_pos new_x_virtual_length, void Interface_graphic::linking_scroll_bars(Element_pos x_bar_new_value, Element_pos y_bar_new_value){ _on_manual_change = true; _ui_x_scroll->setValue(virtual_to_real_scroll_unit(x_bar_new_value, 'x')); - _ui_y_scroll->setValue(virtual_to_real_scroll_unit(y_bar_new_value, 'y')); + for (int i = 0; i < _scrolls.size(); i++) { + _scrolls[i]->setValue(virtual_to_real_scroll_unit(y_bar_new_value, 'y')); + } _on_manual_change = false; } @@ -425,11 +422,30 @@ void Interface_graphic::on_open_triggered(){ QString filename = QFileDialog::getOpenFileName(this); if (!filename.isEmpty()){ - open_trace(filename); + open_trace(filename, 0); }/* end if (!filename.isEmpty()) */ } +void Interface_graphic::on_add_trace_triggered(){ + + /* + Be careful! Here, this is used instead 'this' pointer because 'this' is not a window, + it's an interface class (Interface_graphic*). The real window is this. + If 'this' is put, the application closes after the getOpenFilename() dialog box closes. + */ + QString filename = QFileDialog::getOpenFileName(this); + + if (!filename.isEmpty()){ + + if (_traces_path.size()>0) + open_trace(filename, _renders.size()); + else { + open_trace(filename, 0); + } + }/* end if (!filename.isEmpty()) */ +} + void Interface_graphic::on_export_file_triggered(){ QStringList selected_files; @@ -449,7 +465,7 @@ void Interface_graphic::on_export_file_triggered(){ warning("Cannot restore the export file dialog state"); } - file_dialog.setLabelText(QFileDialog::FileName, QString::fromStdString(_trace_path.substr(0, _trace_path.find_last_of('.'))) + QStringLiteral(".svg")); + file_dialog.setLabelText(QFileDialog::FileName, QString::fromStdString(_traces_path.back().substr(0, _traces_path.back().find_last_of('.'))) + QStringLiteral(".svg")); file_dialog.setFileMode(QFileDialog::AnyFile);/* Allow to browse among directories */ file_dialog.setAcceptMode(QFileDialog::AcceptSave);/* Only save file */ file_dialog.setNameFilter(tr("Vector (*.svg);;Bitmap PNG (*.png);;Bitmap JPEG (*.jpeg *.jpg);;Counter (*.txt)")); @@ -557,6 +573,7 @@ void Interface_graphic::on_export_file_triggered(){ void Interface_graphic::on_reload_triggered() { if(_is_rendering_trace) { + Element_pos zoom[2] = { Info::Splitter::_x_min, Info::Splitter::_x_max }; if( _ui_settings != nullptr ) { @@ -566,19 +583,41 @@ void Interface_graphic::on_reload_triggered() { // _ui_node_selection->on_reset_button_clicked(); // if(_ui_interval_selection!=NULL) // _ui_interval_selection->on_reset_button_clicked(); - if( _reload_type ) { + + // for the moment: _STATE_CLEAN_RENDER_AREA and multiple traces not compatible + + /* if( _reload_type ) { _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA); } else { _core->launch_action(Core::_STATE_CLEAN_RENDER_AREA); + } */ + + for (int i=_ui_render_areas.size()-1; i>=0; i--){ + Render_windowed* render = _ui_render_areas.back(); + + if (render != nullptr && i>0) + _render_area_layouts[i]->removeWidget(render->get_render_widget()); + + _ui_render_areas.pop_back(); + _ui_render_areas[_ui_render_areas.size()] = nullptr; + } + + for (int i=0; i<_traces_path.size(); i++) { + _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA); + _core->launch_action(Core::_STATE_REMOVE_RENDER_AREA); + } + + for (int i=0; i<_traces_path.size(); i++) { + if(false==_core->draw_trace(_traces_path[i], Core::_DRAW_OPENGL, i)) + error("Draw trace failed"); } - _core->draw_trace(_trace_path, Core::_DRAW_OPENGL); if( Info::Splitter::_x_max != 0.0 ) { - _core->launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom); + _core->launch_action(Core::_STATE_ZOOM_IN_AN_INTERVAL, &zoom); } - _core->launch_action(Core:: _STATE_RENDER_UPDATE); + _core->launch_action(Core::_STATE_RENDER_UPDATE); //reset the slider to its original value scale_container_state->setValue(20); @@ -587,6 +626,7 @@ void Interface_graphic::on_reload_triggered() { if( _ui_interval_selection != nullptr ) { _ui_interval_selection->update_values(); } + } } @@ -608,7 +648,7 @@ void Interface_graphic::on_clear_recent_files_triggered() { void Interface_graphic::counter_choosed_triggered() { // Il faut faire choisir le nom du fichier! et enfin on peut lancer l'action ! - // const QString path_by_default = QString(_trace_path.substr(0, _trace_path.find_last_of('.')).c_str()) + ".txt"; + // const QString path_by_default = QString(_traces_path.back().substr(0, _traces_path.back().find_last_of('.')).c_str()) + ".txt"; //QString filename = QFileDialog::getSaveFileName(this, QObject::tr("Export File"), // path_by_default, // QObject::tr("All files")); @@ -629,7 +669,7 @@ void Interface_graphic::option_export_ok_pressed(){ // We have to save the option from _ui_time_selection_export and hide her if it is not do automatically _ui_time_selection_export->hide(); - // const QString path_by_default = QString(_trace_path.substr(0, _trace_path.find_last_of('.')).c_str()) + ".svg"; + // const QString path_by_default = QString(_traces_path.back().substr(0, _traces_path.back().find_last_of('.')).c_str()) + ".svg"; //QString filename = QFileDialog::getSaveFileName(this, tr("Export File"), // path_by_default, // tr("Images (*.svg)")); @@ -645,7 +685,7 @@ void Interface_graphic::option_export_ok_pressed(){ information(string("Exporting trace to ")+filename.toStdString()); _core->set_path_to_export(filename.toStdString()); - // _core->draw_trace(_trace_path, Core::_DRAW_SVG); + // _core->draw_trace(_traces_path.back(), Core::_DRAW_SVG); // if(_ui_CheckBox_time_export->isChecked()){ // _core->set_min_value_for_export(convert_to_double(_ui_min_time_export->text().toStdString())); @@ -670,33 +710,68 @@ void Interface_graphic::on_close_triggered(){ if(_is_rendering_trace == false) return; - /* - * Clear the informative window texts and hide it. - */ - _ui_info_trace_text->clear();/* Clear the current text (if exists) */ - _ui_info_selection_text->clear();/* Clear the current text (if exists) */ - _ui_info_window->hide();/* Hide the informative window */ + // differenciate between closing the only trace or stopping trace comparaison + if (_traces_path.size()>1) { + + for (int i=0; i<_ui_render_areas.size()-1; i++){ + Render_windowed* render = _ui_render_areas.back(); + + if (render != nullptr) + _render_area_layouts[i]->removeWidget(render->get_render_widget()); + + _ui_render_areas.pop_back(); + _ui_render_areas[_ui_render_areas.size()] = nullptr; + } + + for (int i=0; i<_traces_path.size()-1; i++) { + _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA); + _core->launch_action(Core::_STATE_REMOVE_RENDER_AREA); + } - if(_ui_settings) { + while(_traces_path.size()>1){ + _traces_path.pop_back(); + } + + } else { + + /* + * Clear the informative window texts and hide it. + */ + _ui_info_trace_text->clear();/* Clear the current text (if exists) */ + _ui_info_selection_text->clear();/* Clear the current text (if exists) */ + _ui_info_window->hide();/* Hide the informative window */ + + if(_ui_settings) { _ui_settings->hide(); - } + } - if(_plugin_window != nullptr) { - _plugin_window->hide(); - //_plugin_window->clear_plugins(); - } + if(_plugin_window != nullptr) { + _plugin_window->hide(); + //_plugin_window->clear_plugins(); + } - _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA); - if (_cmd_window){ + if (_cmd_window){ delete _cmd_window; _cmd_window = nullptr; - } + } - _is_rendering_trace = false; + for (int i=0; i<_ui_render_areas.size(); i++){ + Render_windowed* render = _ui_render_areas.back(); + + _ui_render_areas.pop_back(); + _ui_render_areas[_ui_render_areas.size()] = nullptr; + } + + _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA); + while (!_traces_path.empty()) + _traces_path.pop_back(); + + _is_rendering_trace = false; - information(string("File closed.")); + information(string("File closed.")); - this->setWindowTitle(QStringLiteral("ViTE")); + this->setWindowTitle(QStringLiteral("ViTE")); + } } @@ -746,7 +821,7 @@ void Interface_graphic::on_shaded_states_triggered(){ _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA); else _core->launch_action(Core::_STATE_CLEAN_RENDER_AREA); - _core->draw_trace(_trace_path, Core::_DRAW_OPENGL); + _core->draw_trace(_traces_path.back(), Core::_DRAW_OPENGL, 0); } } @@ -992,10 +1067,11 @@ void Interface_graphic::on_x_scroll_valueChanged(int new_value){ } } -void Interface_graphic::on_y_scroll_valueChanged(int new_value){ +void Interface_graphic::on_y_scroll_valueChanged(int index, int new_value){ if (!_on_manual_change){ Element_pos converted_new_value = real_to_virtual_scroll_unit(new_value, 'y');/* change type of new_value */ - _core->launch_action(Core::_STATE_RENDER_AREA_REPLACE_TRANSLATE_Y, &converted_new_value); + void* arg[] = {&index, &converted_new_value}; + _core->launch_action(Core::_STATE_RENDER_AREA_REPLACE_TRANSLATE_Y, arg); } } @@ -1026,8 +1102,8 @@ void Interface_graphic::closeEvent(QCloseEvent *event){ _ui_interval_selection->close(); } -const std::string Interface_graphic::get_filename() const{ - return _trace_path; +const std::vector<std::string> Interface_graphic::get_filename() const{ + return _traces_path; } Core * Interface_graphic::get_console(){ @@ -1065,6 +1141,27 @@ void Interface_graphic::update_recent_files_menu() { } } +void Interface_graphic::addRender() { + int index = _projectors.size(); + + multirender_window::addRender(); + + InterfaceEventProjector* proj = new InterfaceEventProjector(this, &Interface_graphic::on_y_scroll_valueChanged, index); + _projectors.push_back(proj); + QObject::connect(_scrolls[index], &QScrollBar::valueChanged, proj, &InterfaceEventProjector::call); +} + +void Interface_graphic::removeRender() { + int index = _projectors.size() - 1; + InterfaceEventProjector* proj = _projectors[index]; + + QObject::disconnect(_scrolls[index], &QScrollBar::valueChanged, proj, &InterfaceEventProjector::call); + _projectors.pop_back(); + delete proj; + + multirender_window::removeRender(); +} + void Interface_graphic::dragEnterEvent(QDragEnterEvent *event) { setBackgroundRole(QPalette::Highlight); event->acceptProposedAction(); @@ -1125,35 +1222,11 @@ void Interface_graphic::end_parsing() { setDisabled(false); // Enable the main window } -void Interface_graphic::open_trace(const QString &filename) { - - // We open the trace - if (_is_rendering_trace == true){ /* open a new process */ - - QStringList arguments = (QStringList() << filename); - QString program; - const QString** run_env = _core->get_runenv(); - QDir::setCurrent(*run_env[0]); - QString run_cmd = *run_env[1]; - -#ifdef VITE_DEBUG - cout << __FILE__ << " " << __LINE__ << " : " << run_env[0]->toStdString() << " " << run_env[1]->toStdString() << endl; -#endif - - if (run_cmd.startsWith(QLatin1String("."))) - program = *run_env[0]+(run_cmd.remove(0,1)); - else - program = run_cmd; - - QProcess new_process; - new_process.startDetached(program, arguments); - } - else{ +void Interface_graphic::open_trace(const QString &filename, int index) { opening_file(filename.toStdString()); - if(false==_core->draw_trace(filename.toStdString(), Core::_DRAW_OPENGL)) + if(false==_core->draw_trace(filename.toStdString(), Core::_DRAW_OPENGL, index)) error("Draw trace failed"); - }/* end else of if (_is_rendering_trace == true) */ } void Interface_graphic::update_settings() { @@ -1165,3 +1238,14 @@ void Interface_graphic::update_settings() { _core->launch_action(Core::_STATE_RENDER_UPDATE); } + + +InterfaceEventProjector::InterfaceEventProjector(Interface_graphic* object, void (Interface_graphic::*func_pointer)(int, int), int arg1): + _object(object), + _func_pointer(func_pointer), + _arg1(arg1) {} + + +void InterfaceEventProjector::call(int arg2) { + (_object->*_func_pointer)(_arg1, arg2); +} diff --git a/src/interface/Interface_graphic.hpp b/src/interface/Interface_graphic.hpp index d28e6b706a2fdf10545366fce8b589c3871ae56c..641b1c5252b9b26ab00654de8cf15b9cef9f2762 100644 --- a/src/interface/Interface_graphic.hpp +++ b/src/interface/Interface_graphic.hpp @@ -64,6 +64,7 @@ class QProgressDialog; /* -- */ #include "common/common.hpp" #include "common/Session.hpp" +#include "common/Tools.hpp" #include "render/Render.hpp" /* -- */ #include "multirender_window.hpp" /* the main window graphical interface */ @@ -75,10 +76,13 @@ class QProgressDialog; #include "interface/Interval_select.hpp" #include "render/Render_windowed.hpp" + +class InterfaceEventProjector; + /*! *\brief This class is a graphical interface which creates a window, it inherited from the Interface interface. */ -class Interface_graphic : public QMainWindow, public Ui::multirender_window, public Interface { +class Interface_graphic : public Ui::multirender_window, public Interface { Q_OBJECT protected: @@ -106,7 +110,7 @@ class Interface_graphic : public QMainWindow, public Ui::multirender_window, pub /*! *\brief Open the trace of filename. Create a new process if necessary */ - void open_trace(const QString &filename); + void open_trace(const QString &filename, int index=0); /*********************************** * @@ -134,11 +138,6 @@ class Interface_graphic : public QMainWindow, public Ui::multirender_window, pub */ QScrollBar* _ui_x_scroll; - /*! - * \brief This variable contains the instance of the vertical scroll bar. - */ - QScrollBar* _ui_y_scroll; - /*! *\brief To show the avancement of parsing. */ @@ -167,7 +166,12 @@ class Interface_graphic : public QMainWindow, public Ui::multirender_window, pub /*! * \brief Contains the trace displayed path. */ - std::string _trace_path; + std::vector<std::string> _traces_path; + + /*! + * \brief Contains the projectors related to the vertical scrollbar events + */ + std::vector<InterfaceEventProjector*> _projectors; /*! * \brief Contains the conversion factor between x virtual and real scroll unit. @@ -179,16 +183,6 @@ class Interface_graphic : public QMainWindow, public Ui::multirender_window, pub */ double _y_factor_virtual_to_real; - /*! - * \brief Contains the real x scroll bar length. - */ - static const int _REAL_X_SCROLL_LENGTH = 10000; - - /*! - * \brief Contains the real x scroll bar length. - */ - static const int _REAL_Y_SCROLL_LENGTH = 10000; - /*********************************** * * Informative window widget attributes. @@ -480,7 +474,7 @@ public: * * \return The name of the current trace file */ - const std::string get_filename() const override; + const std::vector<std::string> get_filename() const override; /*! * \fn get_console() @@ -507,6 +501,10 @@ public: * */ void update_recent_files_menu(); + void addRender() override; + + + void removeRender() override; public Q_SLOTS: /*! @@ -529,6 +527,11 @@ protected Q_SLOTS: */ void on_open_triggered(); + /*! + *\brief A slot called when 'add_trace' in the menu is clicked. + */ + void on_add_trace_triggered(); + /*! *\brief A slot called when 'export' in the menu is clicked. */ @@ -694,9 +697,10 @@ protected Q_SLOTS: /*! * \brief Change the y position of camera view for state drawing area. + * \param index the index of the vertical scroll bar * \param new_value The new position. */ - void on_y_scroll_valueChanged(int new_value);/* temporary slot */ + void on_y_scroll_valueChanged(int index, int new_value);/* temporary slot */ /*! * \brief Change the percentage taken by container display in the render area. @@ -710,4 +714,21 @@ protected Q_SLOTS: }; + +class InterfaceEventProjector : public QObject { + Q_OBJECT + + Interface_graphic* _object; + void (Interface_graphic::*_func_pointer)(int, int); + int _arg1; + +public: + + InterfaceEventProjector(Interface_graphic* object, void (Interface_graphic::*func_pointer)(int, int), int arg1); + + void call(int arg2); + +}; + + #endif diff --git a/src/interface/Interval_select.cpp b/src/interface/Interval_select.cpp index 0369e596e882874b0178f7bdd833ea6fde321e24..c5c23d68fc6d5a0374e1cc6eb3babcdf4bfcb85f 100644 --- a/src/interface/Interval_select.cpp +++ b/src/interface/Interval_select.cpp @@ -102,21 +102,22 @@ Trace* Interval_select::get_trace() { void Interval_select::set_trace(Trace *trace) { // Initialize _trace _trace = trace; + Render* render = _console->get_console()->get_render_of_trace(_trace); - min_value->setText(QString().setNum (Info::Entity::x_min)); - max_value->setText(QString().setNum (Info::Entity::x_max)); + min_value->setText(QString().setNum (render->entities_x_min)); + max_value->setText(QString().setNum (render->entities_x_max)); - minSpinBox->setMinimum(Info::Entity::x_min); - minSpinBox->setMaximum(Info::Entity::x_max); - maxSpinBox->setMinimum(Info::Entity::x_min); - maxSpinBox->setMaximum(Info::Entity::x_max); + minSpinBox->setMinimum(render->entities_x_min); + minSpinBox->setMaximum(render->entities_x_max); + maxSpinBox->setMinimum(render->entities_x_min); + maxSpinBox->setMaximum(render->entities_x_max); //the slider stays in int, we will translate its values /*interval_slider->setMinimum(0); interval_slider->setMaximum(99);*/ - double delta=Info::Entity::x_max - Info::Entity::x_min; - double step= 0.001 * delta; //make steps of .1% for spinboxes + double delta = render->entities_x_max - render->entities_x_min; + double step = 0.001 * delta; //make steps of .1% for spinboxes minSpinBox->setSingleStep(step); maxSpinBox->setSingleStep(step); @@ -131,21 +132,23 @@ void Interval_select::update_values() { Element_pos _min; Element_pos _max; + Render* render = _console->get_console()->get_render_of_trace(_trace); + //choose which value to load the actual position from (can change if we are loading from a splitted file set) if(Info::Splitter::preview == true){ - _min = Info::Entity::x_min; - _max = Info::Entity::x_max; + _min = render->entities_x_min; + _max = render->entities_x_max; } else if(Info::Splitter::load_splitted == true) { - Info::Render::_x_min = Info::Splitter::_x_min; - Info::Render::_x_max = Info::Splitter::_x_max; + render->_x_min = Info::Splitter::_x_min; + render->_x_max = Info::Splitter::_x_max; auto_refresh_box->setChecked(false);//set the checkbox to false because reload is expensive for splitted mode _min = Info::Splitter::_x_min; _max = Info::Splitter::_x_max; } else { - _min = Info::Render::_x_min; - _max = Info::Render::_x_max; + _min = render->_x_min; + _max = render->_x_max; } bool v = minSpinBox->blockSignals(true); bool v2 = maxSpinBox->blockSignals(true); @@ -257,8 +260,6 @@ void Interval_select::maxSliderValueChanged( int _value ) if(_auto_refresh)apply_settings(); } _applied = false; - - std::cerr << "maxvalue changed" << std::endl; } @@ -280,7 +281,7 @@ void Interval_select::apply_settings(){ _trace->updateTrace(new Interval(zoom[0], zoom[1])); #endif - _console->get_console()->draw_trace(_console->get_filename(),Core::_DRAW_OPENGL); + _console->get_console()->draw_trace(_console->get_filename()[0].c_str(), Core::_DRAW_OPENGL, 0); _console->get_console()->launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom); _console->get_console()->launch_action(Core:: _STATE_RENDER_UPDATE); diff --git a/src/interface/Node_select.cpp b/src/interface/Node_select.cpp index a7caaf98fc195c617e4c724bd983009086c45632..2a59fe777368073d9aa504f1aa106d8c4d32248b 100644 --- a/src/interface/Node_select.cpp +++ b/src/interface/Node_select.cpp @@ -265,16 +265,15 @@ void Node_select::on_reset_button_clicked(){ _nodes_displayed->clear(); //can we load that from _nodes_original instead ? set_displayed_container_names(); - Element_pos zoom[2]={Info::Render::_x_min, Info::Render::_x_max}; - Info::Render::_x_min_visible = 0.0; - Info::Render::_x_max_visible = 0.0; + Render* render = _console->get_console()->get_render_of_trace(_trace); + Element_pos zoom[2]={render->_x_min, render->_x_max}; _trace->set_view_root_containers(_displayed_containers); //_trace->set_selected_container(_trace->get_root_containers()); _console->get_console()->launch_action(Core:: _STATE_CLEAN_RENDER_AREA); #if defined(USE_ITC) && defined(BOOST_SERIALIZE) _trace->updateTrace(new Interval(zoom[0], zoom[1])); #endif - _console->get_console()->draw_trace(_console->get_filename(),Core::_DRAW_OPENGL); + _console->get_console()->draw_trace(_console->get_filename().back(), Core::_DRAW_OPENGL, 0); _console->get_console()->launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom); _console->get_console()->launch_action(Core:: _STATE_RENDER_UPDATE); } @@ -330,14 +329,15 @@ void Node_select::on_display_button_clicked(){ _displayed_containers.clear(); build_displayed_nodes(_displayed_containers); _trace->set_view_root_containers(_displayed_containers); - Element_pos it[2]={Info::Render::_x_min, Info::Render::_x_max}; + Render* render = _console->get_console()->get_render_of_trace(_trace); + Element_pos it[2]={render->_x_min, render->_x_max}; //Info::Render::_x_min_visible = 0.0; //Info::Render::_x_max_visible = 0.0; _console->get_console()->launch_action(Core:: _STATE_CLEAN_RENDER_AREA); #if defined(USE_ITC) && defined(BOOST_SERIALIZE) _trace->updateTrace(new Interval(it[0], it[1])); #endif - _console->get_console()->draw_trace(_console->get_filename(),Core::_DRAW_OPENGL); + _console->get_console()->draw_trace(_console->get_filename()[0], Core::_DRAW_OPENGL, 0); _console->get_console()->launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &it); _console->get_console()->launch_action(Core:: _STATE_RENDER_UPDATE); diff --git a/src/interface/multirender_window.cpp b/src/interface/multirender_window.cpp index 36dc9f5b5755b14b826eea72b824404909d4f4c6..cfdb68ed6b4ec1175f863804088e5ffa7d559530 100644 --- a/src/interface/multirender_window.cpp +++ b/src/interface/multirender_window.cpp @@ -10,6 +10,9 @@ std::string concatenate(const char* name, int index) { } +multirender_window::multirender_window(QWidget* parent):QMainWindow(parent) {} + + void multirender_window::setupUi(QMainWindow *main_window) { Ui_default_window::setupUi(main_window); this->addRender(); @@ -33,6 +36,7 @@ void multirender_window::addRender() { _scrolls.push_back(y_scroll); y_scroll->setObjectName(QString::fromUtf8(concatenate("y_scroll", index).c_str())); y_scroll->setOrientation(Qt::Vertical); + y_scroll->setMaximum(_REAL_Y_SCROLL_LENGTH); render->addWidget(y_scroll); @@ -46,17 +50,25 @@ void multirender_window::removeRender() { QHBoxLayout* render = _renders.back(); _renders.pop_back(); - QVBoxLayout* render_area_layout = _render_area_layouts.back(); - _render_area_layouts.pop_back(); - render->removeItem(render_area_layout); - delete render_area_layout; - QScrollBar* y_scroll = _scrolls.back(); _scrolls.pop_back(); render->removeWidget(y_scroll); delete y_scroll; + _scrolls[_scrolls.size()] = nullptr; + + QVBoxLayout* render_area_layout = _render_area_layouts.back(); + _render_area_layouts.pop_back(); + render->removeItem(render_area_layout); + delete render_area_layout; + _render_area_layouts[_render_area_layouts.size()] = nullptr; render_areas->removeItem(render); delete render; + _renders[_renders.size()] = nullptr; +} + + +int multirender_window::numberOfRenders() { + return _renders.size(); } \ No newline at end of file diff --git a/src/interface/multirender_window.hpp b/src/interface/multirender_window.hpp index 448e8e79214c72458639eca45f632eb1f4adb14a..877b8e11e6451f8ca575c1d0d0b95087294376c4 100644 --- a/src/interface/multirender_window.hpp +++ b/src/interface/multirender_window.hpp @@ -3,30 +3,53 @@ namespace Ui { - class multirender_window: protected Ui_default_window { + class multirender_window: public QMainWindow, protected Ui_default_window { protected: std::vector<QHBoxLayout*> _renders; std::vector<QVBoxLayout*> _render_area_layouts; std::vector<QScrollBar*> _scrolls; + /*! + * \brief Contains the real x scroll bar length. + */ + static const int _REAL_X_SCROLL_LENGTH = 10000; + + /*! + * \brief Contains the real x scroll bar length. + */ + static const int _REAL_Y_SCROLL_LENGTH = 10000; + public: + /*! + * \brief The default constructor + * \param parent The parent widget of the graphical interface. Should be ignored. + */ + multirender_window(QWidget* parent = nullptr); + /*! * \brief Sets up the displayed elements on the window * \param main_window The window which is to setup (equal to `this`) */ - void setupUi(QMainWindow *main_window); + virtual void setupUi(QMainWindow *main_window); /*! * \brief This method adds a new empty render area to be displayed on the window */ - void addRender(); + virtual void addRender(); /*! * \brief Removes the last (lower) render area of the window */ - void removeRender(); + virtual void removeRender(); + + /*! + * \brief Returns the number of renders area available on the screen + * + * \return int + */ + virtual int numberOfRenders(); }; } \ No newline at end of file diff --git a/src/plugin/Command_window.cpp b/src/plugin/Command_window.cpp index f8321598e173f4c98d5fa8e8a7445590e7976d45..4c2ce9a56531254d218c80f1c4f3aab64451a385 100644 --- a/src/plugin/Command_window.cpp +++ b/src/plugin/Command_window.cpp @@ -159,7 +159,7 @@ void Command_window::on_execute_button_clicked(){ _trace->set_filter(filter.toDouble()); _console->get_console()->launch_action(Core::_STATE_RENDER_UPDATE); - _console->get_console()->draw_trace(_console->get_filename(),Core::_DRAW_OPENGL); + _console->get_console()->draw_trace(_console->get_filename().back(), Core::_DRAW_OPENGL, 0); } diff --git a/src/render/GanttDiagram.hpp b/src/render/GanttDiagram.hpp index b60dd70355ffc3b995c07e5fcc3b04a6d3b4d7d3..94e1e6c16f52cca9fc3e22d047182f28eadd77c5 100644 --- a/src/render/GanttDiagram.hpp +++ b/src/render/GanttDiagram.hpp @@ -112,7 +112,7 @@ public: /*! * \brief The default constructor */ - GanttDiagram( Render *instance ) { + GanttDiagram( Render *instance ) : Geometry(instance) { _render = instance; _start_new_line = false; } @@ -273,7 +273,7 @@ public: EntityValue * value) { _render->set_color(r, g, b); - _render->draw_state(trace_to_render_x(start - Info::Render::_x_min_visible), + _render->draw_state(trace_to_render_x(start - _render->_x_min_visible), trace_to_render_y(base), _z_state, (end-start)*coeff_trace_render_x(), @@ -317,8 +317,8 @@ public: { _render->set_color(r, g, b); - start_time = trace_to_render_x(start_time - Info::Render::_x_min_visible); - end_time = trace_to_render_x(end_time - Info::Render::_x_min_visible); + start_time = trace_to_render_x(start_time - _render->_x_min_visible); + end_time = trace_to_render_x(end_time - _render->_x_min_visible); start_height = trace_to_render_y(start_height); end_height = trace_to_render_y(end_height); @@ -358,7 +358,7 @@ public: /* For SVG */ _render->set_color(r, g, b); - time = trace_to_render_x(time - Info::Render::_x_min_visible); + time = trace_to_render_x(time - _render->_x_min_visible); height = trace_to_render_y(height); container_height = container_height*coeff_trace_render_y(); @@ -414,7 +414,7 @@ public: {/* line is already started */ if (x <= 0.0){/* convention: the line is over */ - _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible), + _render->draw_line( trace_to_render_x(_counter_last_x - _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), @@ -426,14 +426,14 @@ public: /* 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. */ - _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible), + _render->draw_line( trace_to_render_x(_counter_last_x - _render->_x_min_visible), trace_to_render_y(_counter_last_y), - trace_to_render_x(x - Info::Render::_x_min_visible), + trace_to_render_x(x - _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), + _render->draw_line( trace_to_render_x(x - _render->_x_min_visible), trace_to_render_y(_counter_last_y), - trace_to_render_x(x - Info::Render::_x_min_visible), + trace_to_render_x(x - _render->_x_min_visible), trace_to_render_y(y), _z_counter ); _counter_last_x = x; @@ -449,7 +449,7 @@ public: { if (!_start_new_line) {/* If a line was previously opened */ /* Draw the last line */ - _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible), + _render->draw_line( trace_to_render_x(_counter_last_x - _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), diff --git a/src/render/Geometry.cpp b/src/render/Geometry.cpp index 4b92efb642bf89bac423bbfef93d352617ec8d5a..00915a21494a8c77b05ab4a8f25f5247478cfd41 100644 --- a/src/render/Geometry.cpp +++ b/src/render/Geometry.cpp @@ -67,7 +67,7 @@ using namespace std; * **********************************/ -Geometry::Geometry(){ +Geometry::Geometry(Render* render) : _render(render) { init_geometry(); @@ -189,7 +189,7 @@ Element_pos Geometry::coeff_screen_render_y() const { Element_pos Geometry::coeff_trace_render_x() const { - return ((Info::Render::width-_default_entity_x_translate)*_x_state_scale) / (Info::Entity::x_max - Info::Entity::x_min); + return ((Info::Render::width-_default_entity_x_translate)*_x_state_scale) / (_render->entities_x_max - _render->entities_x_min); } Element_pos Geometry::coeff_trace_render_y() const { @@ -200,8 +200,8 @@ Element_pos Geometry::coeff_trace_render_y() const { void Geometry::update_visible_interval_value() const { - Info::Render::_x_min_visible = max(Info::Entity::x_min, (_x_state_translate - _default_entity_x_translate )/coeff_trace_render_x()); - Info::Render::_x_min=max(Info::Entity::x_min, _x_state_translate/coeff_trace_render_x()); - Info::Render::_x_max=min(Info::Entity::x_max, (_x_state_translate- _default_entity_x_translate + Info::Render::width)/coeff_trace_render_x()); - Info::Render::_x_max_visible = min(Info::Entity::x_max, (_x_state_translate - _default_entity_x_translate + Info::Render::width)/coeff_trace_render_x()); + _render->_x_min_visible = max(_render->entities_x_min, (_x_state_translate - _default_entity_x_translate )/coeff_trace_render_x()); + _render->_x_min = max(_render->entities_x_min, _x_state_translate/coeff_trace_render_x()); + _render->_x_max = min(_render->entities_x_max, (_x_state_translate- _default_entity_x_translate + Info::Render::width)/coeff_trace_render_x()); + _render->_x_max_visible = min(_render->entities_x_max, (_x_state_translate - _default_entity_x_translate + Info::Render::width)/coeff_trace_render_x()); } diff --git a/src/render/Geometry.hpp b/src/render/Geometry.hpp index d3754c485154d0d1da376ab5c2ad730a6f3b51e8..aac6929867ca48dd93e3178730c66dd6d5bc5d79 100644 --- a/src/render/Geometry.hpp +++ b/src/render/Geometry.hpp @@ -48,6 +48,8 @@ #ifndef GEOMETRY_HPP #define GEOMETRY_HPP +#include "render/Render.hpp" + /*! * \brief This class provide some tools to manage the window and render area geometry. */ @@ -56,6 +58,11 @@ class Geometry protected: + /*! + * \brief The render area on which the geometry is based + */ + Render* _render; + /*! * \brief The last x position of the point (for counter). */ @@ -237,8 +244,9 @@ public: /*! * \brief The constructor. + * \param render the render area on which the geometry is based */ - Geometry(); + Geometry(Render* render); /*! * \brief The destructor diff --git a/src/render/Render.hpp b/src/render/Render.hpp index 6408cf0d6e71445948b642ef4c3ad3d9bf79be09..f123b2207a7c86de918ac8be0411adf76161213a 100644 --- a/src/render/Render.hpp +++ b/src/render/Render.hpp @@ -117,6 +117,36 @@ class Render public: + /*! + * \brief Contains the trace maximum visible time. + */ + Element_pos _x_max = 0.0; + + /*! + * \brief Contains the trace minimum visible time, uncorrected (state width isn't removed) + */ + Element_pos _x_min = 0.0; + + /*! + * \brief Contains the trace minimum visible time. + */ + Element_pos _x_min_visible = 0.0; + + /*! + * \brief Contains the trace maximum visible time. + */ + Element_pos _x_max_visible = 0.0; + + /*! + * \brief Contains the trace minimum states time. + */ + Element_pos entities_x_min = 0.0; + + /*! + * \brief Contains the trace maximum states time. + */ + Element_pos entities_x_max = 0.0; + virtual ~Render() = default; /*! diff --git a/src/render/Render_abstract.cpp b/src/render/Render_abstract.cpp index 766159d53d87cb3d0d5010274c5c0c1f358f8b0e..b238f43c25d91ae05c3c3d17b08f06ac207b712e 100644 --- a/src/render/Render_abstract.cpp +++ b/src/render/Render_abstract.cpp @@ -79,7 +79,7 @@ static const int scroll_margin = 100;/* Control the margin of the trace. Must be **********************************/ Render_abstract::Render_abstract(Core *core) - : _core(core) { + : Geometry(this), _core(core) { /* init main informations about the scene and the widget size */ @@ -178,7 +178,7 @@ void Render_abstract::apply_zoom_box(Element_pos x_min, Element_pos x_max, Eleme /* Now, check if zoom is not too much */ update_visible_interval_value(); - delta = Info::Render::_x_max_visible - Info::Render::_x_min_visible; + delta = _x_max_visible - _x_min_visible; if (delta <= zoom_limit) {/* if too much, cancel */ @@ -190,8 +190,8 @@ void Render_abstract::apply_zoom_box(Element_pos x_min, Element_pos x_max, Eleme #if defined(USE_ITC) && defined(BOOST_SERIALIZE) if(Info::Splitter::preview==true && Info::Render::_key_ctrl == true){ //we are in preview mode, we have to load the actual data from the serialized files - Info::Splitter::_x_min= Info::Render::_x_min_visible; - Info::Splitter::_x_max= Info::Render::_x_max_visible; + Info::Splitter::_x_min= _x_min_visible; + Info::Splitter::_x_max= _x_max_visible; // Info::Splitter::preview=false; _core->launch_action(_core->_LOAD_DATA, NULL); Info::Render::_key_ctrl =false; diff --git a/src/render/Render_svg.cpp b/src/render/Render_svg.cpp index 9dba3185b317f715d1a288e3eeb907e6696f253f..ef56709c4e60c5d2a58f086e7779d8eb05a2c181 100644 --- a/src/render/Render_svg.cpp +++ b/src/render/Render_svg.cpp @@ -80,7 +80,7 @@ using namespace std; * **********************************/ -Render_svg::Render_svg(string* output_filename){ +Render_svg::Render_svg(string* output_filename) : Geometry(this) { _output_file.open(output_filename->c_str(), ofstream::out | ofstream::trunc); @@ -93,7 +93,7 @@ Render_svg::Render_svg(string* output_filename){ } -Render_svg::~Render_svg(){ +Render_svg::~Render_svg() { if (_output_file.is_open()) _output_file.close(); @@ -296,8 +296,8 @@ void Render_svg::end_ruler(){ Element_pos coeff_prefix; - graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible); - coeff_prefix = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible); + graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible); + coeff_prefix = Ruler::get_coeff_for_common_prefix(_x_min_visible, _x_max_visible); _buffer.str("");/* flush the buffer */ @@ -305,22 +305,22 @@ void Render_svg::end_ruler(){ << " y=\"" << render_to_screen_y(3) << "\"" << " font-size=\"" << 14 << "\"" << " fill=\"white\">" - << "min: " << (double)Info::Render::_x_min_visible + << "min: " << (double)_x_min_visible << "</text>\n"; - _buffer << "<text x=\"" << render_to_screen_x(trace_to_render_x(Info::Render::_x_max_visible))- render_to_screen_x(trace_to_render_x(Info::Render::_x_min_visible)) <<"\"" + _buffer << "<text x=\"" << render_to_screen_x(trace_to_render_x(_x_max_visible))- render_to_screen_x(trace_to_render_x(_x_min_visible)) <<"\"" << " y=\"" << render_to_screen_y(3) << "\"" << " font-size=\"" << 14 << "\"" << " fill=\"white\">" - << "max: " << (double)Info::Render::_x_max_visible + << "max: " << (double)_x_max_visible << "</text>\n"; - for (Element_pos i = Info::Render::_x_min_visible ; - i < Info::Render::_x_max_visible ; + for (Element_pos i = _x_min_visible ; + i < _x_max_visible ; i+=graduation_diff){ - _buffer << "<text x=\"" << render_to_screen_x(trace_to_render_x(i - Info::Render::_x_min_visible)+1) <<"\"" + _buffer << "<text x=\"" << render_to_screen_x(trace_to_render_x(i - _x_min_visible)+1) <<"\"" << " y=\"" << render_to_screen_y(8) << "\"" << " font-size=\"" << 10 << "\"" << " fill=\"white\">" diff --git a/src/render/opengl/Render_opengl.cpp b/src/render/opengl/Render_opengl.cpp index ce012917cea318ce74470f8e359b898f9e165cae..5077903a5b2fa9ee001ad9b5affdf8c859d6dcae 100644 --- a/src/render/opengl/Render_opengl.cpp +++ b/src/render/opengl/Render_opengl.cpp @@ -434,42 +434,42 @@ void Render_opengl::paintGL(){ std::ostringstream buf_txt; Element_pos graduation_diff; Element_pos coeff_prefix; - graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible); - coeff_prefix = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible); + graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible); + coeff_prefix = Ruler::get_coeff_for_common_prefix(_x_min_visible, _x_max_visible); arial_font.setPointSize(14); buf_txt.str("");/* flush the buffer */ - buf_txt << "min: " << (double)Info::Render::_x_min_visible; + buf_txt << "min: " << (double)_x_min_visible; - renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_min_visible)), + renderText (render_to_screen_x(trace_to_render_x(_x_min_visible)), render_to_screen_y(3), QString::fromStdString(buf_txt.str()), arial_font); buf_txt.str("");/* flush the buffer */ - buf_txt << "max: " << (double)Info::Render::_x_max_visible; + buf_txt << "max: " << (double)_x_max_visible; - renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_max_visible))-130, + renderText (render_to_screen_x(trace_to_render_x(_x_max_visible))-130, render_to_screen_y(3), QString::fromStdString(buf_txt.str()), arial_font); buf_txt.str(""); - buf_txt << Ruler::get_common_part_string(Info::Render::_x_min_visible, coeff_prefix) << "--"; + buf_txt << Ruler::get_common_part_string(_x_min_visible, coeff_prefix) << "--"; renderText (render_to_screen_x( trace_to_render_x( - (Info::Render::_x_min_visible + - Info::Render::_x_max_visible) / 2)), + (_x_min_visible + + _x_max_visible) / 2)), render_to_screen_y(3), QString::fromStdString(buf_txt.str()), arial_font); arial_font.setPointSize(10); - for (Element_pos i = Info::Render::_x_min_visible ; - i < Info::Render::_x_max_visible ; + for (Element_pos i = _x_min_visible ; + i < _x_max_visible ; i+=graduation_diff){ buf_txt.str("");/* flush the buffer */ @@ -697,26 +697,26 @@ void Render_opengl::call_ruler(){ update_visible_interval_value(); - graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible); + graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible); // coeff_prefix = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible); set_color(1.0, 1.0, 1.0); - for (Element_pos i = Info::Render::_x_min_visible ; - i < Info::Render::_x_max_visible ; + for (Element_pos i = _x_min_visible ; + i < _x_max_visible ; i+=graduation_diff){ const Element_pos grad_div_by_5 = graduation_diff/5; for (Element_pos j = (i+grad_div_by_5) ; j<(i+graduation_diff) ; j+= grad_div_by_5){ - if (j>=Info::Render::_x_max_visible) + if (j>=_x_max_visible) break; draw_line( trace_to_render_x(j) + offset_x, offset_y , trace_to_render_x(j) + offset_x, 2+offset_y, _z_ruler); } - if (i>=Info::Render::_x_max_visible) + if (i>=_x_max_visible) break; draw_line( trace_to_render_x(i) + offset_x, offset_y-1 , @@ -726,20 +726,20 @@ void Render_opengl::call_ruler(){ glBegin(GL_QUADS); { glColor4f(0.0f, 0.0f, 1.0f, 0.8f); - glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 3, _z_ruler_under ); - glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 8, _z_ruler_under ); - glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 8, _z_ruler_under ); - glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 3, _z_ruler_under ); + glVertex3d(trace_to_render_x(_x_min_visible), 3, _z_ruler_under ); + glVertex3d(trace_to_render_x(_x_min_visible), 8, _z_ruler_under ); + glVertex3d(trace_to_render_x(_x_max_visible), 8, _z_ruler_under ); + glVertex3d(trace_to_render_x(_x_max_visible), 3, _z_ruler_under ); } glEnd(); glBegin(GL_QUADS); { glColor4f(0.0, 0.0, 0.0, 1.0); - glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 0, _z_ruler_over ); - glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 3, _z_ruler_over ); - glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 3, _z_ruler_over ); - glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 0, _z_ruler_over ); + glVertex3d(trace_to_render_x(_x_min_visible), 0, _z_ruler_over ); + glVertex3d(trace_to_render_x(_x_min_visible), 3, _z_ruler_over ); + glVertex3d(trace_to_render_x(_x_max_visible), 3, _z_ruler_over ); + glVertex3d(trace_to_render_x(_x_max_visible), 0, _z_ruler_over ); } glEnd(); diff --git a/src/render/vbo/Render_alternate.cpp b/src/render/vbo/Render_alternate.cpp index 4625e5e48146570d14a7108d355142e97804c121..56cbd0fca6b2f4e135dc737adcff3e5ae3e64c02 100644 --- a/src/render/vbo/Render_alternate.cpp +++ b/src/render/vbo/Render_alternate.cpp @@ -99,6 +99,7 @@ extern "C" { } #endif } + #define message *Message::get_instance() << "(" << __FILE__ << " l." << __LINE__ << "): " static bool _draw_container; @@ -649,33 +650,33 @@ void Render_alternate::paintGL(){ Element_pos graduation_diff; Element_pos ruler_duration; Element_pos coeff_prefix; - graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible); - ruler_duration = Ruler::get_ruler_duration(Info::Render::_x_min_visible, Info::Render::_x_max_visible); - coeff_prefix = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible); + graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible); + ruler_duration = Ruler::get_ruler_duration(_x_min_visible, _x_max_visible); + coeff_prefix = Ruler::get_coeff_for_common_prefix(_x_min_visible, _x_max_visible); arial_font.setPointSize(14); buf_txt.str("");/* flush the buffer */ - buf_txt << "min: " << (double)Info::Render::_x_min_visible; + buf_txt << "min: " << (double)_x_min_visible; - renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_min_visible)), + renderText (render_to_screen_x(trace_to_render_x(_x_min_visible)), render_to_screen_y(3), QString::fromStdString(buf_txt.str()), arial_font); buf_txt.str("");/* flush the buffer */ - buf_txt << "max: " << (double)Info::Render::_x_max_visible; + buf_txt << "max: " << (double)_x_max_visible; - renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_max_visible))-130, + renderText (render_to_screen_x(trace_to_render_x(_x_max_visible))-130, render_to_screen_y(3), QString::fromStdString(buf_txt.str()), arial_font); buf_txt.str(""); - buf_txt << Ruler::get_common_part_string(Info::Render::_x_min_visible, coeff_prefix) << "-- "; + buf_txt << Ruler::get_common_part_string(_x_min_visible, coeff_prefix) << "-- "; - renderText(render_to_screen_x(trace_to_render_x((Info::Render::_x_min_visible + - Info::Render::_x_max_visible) / 2)), + renderText(render_to_screen_x(trace_to_render_x((_x_min_visible + + _x_max_visible) / 2)), render_to_screen_y(3), QString::fromStdString(buf_txt.str()), arial_font); @@ -684,14 +685,14 @@ void Render_alternate::paintGL(){ buf_txt.str(""); buf_txt << Ruler::get_ruler_duration_string(ruler_duration); - renderText(render_to_screen_x(trace_to_render_x((3*Info::Render::_x_min_visible + - Info::Render::_x_max_visible) / 4)), + renderText(render_to_screen_x(trace_to_render_x((3*_x_min_visible + + _x_max_visible) / 4)), render_to_screen_y(3), QString::fromStdString(buf_txt.str()), arial_font); - for (Element_pos i = Info::Render::_x_min_visible ; - i < Info::Render::_x_max_visible ; + for (Element_pos i = _x_min_visible ; + i < _x_max_visible ; i+=graduation_diff){ buf_txt.str("");/* flush the buffer */ @@ -866,28 +867,28 @@ void Render_alternate::call_ruler(){ update_visible_interval_value(); - graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible); + graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible); //coeff_prefix = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible); //draw quads set_color(0.0, 0.0, 1.0); - _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 8, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 8, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 8, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_min_visible), 3, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_min_visible), 8, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_max_visible), 8, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_max_visible), 8, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_max_visible), 3, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_min_visible), 3, _r, _g, _b); set_color(0.0, 0.0, 0.0); - _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 0, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 0, _r, _g, _b); - _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 0, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_min_visible), 0, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_min_visible), 3, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_max_visible), 3, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_max_visible), 3, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_max_visible), 0, _r, _g, _b); + _ruler.add(trace_to_render_x(_x_min_visible), 0, _r, _g, _b); //draw graduations set_color(1.0, 1.0, 1.0); - for (Element_pos i = Info::Render::_x_min_visible ; i < Info::Render::_x_max_visible ; i+=graduation_diff){ + for (Element_pos i = _x_min_visible ; i < _x_max_visible ; i+=graduation_diff){ const Element_pos grad_div_by_5 = graduation_diff/5; for (Element_pos j = (i+grad_div_by_5) ; j<(i+graduation_diff) ; j+= grad_div_by_5){ draw_line( trace_to_render_x(j) + offset_x, 3, diff --git a/src/statistics/Statistics_window.cpp b/src/statistics/Statistics_window.cpp index 385705dc5c1f271cd03bebca49b4f35b4a6b7895..aa952e1be89235f794029afe0989ca9a0b8617ca 100644 --- a/src/statistics/Statistics_window.cpp +++ b/src/statistics/Statistics_window.cpp @@ -192,9 +192,9 @@ void Statistics_window::on_reload_button_clicked() { return ; } - auto range = (Info::Render::_x_max_visible - Info::Render::_x_min_visible); - auto start_time = Info::Render::_x_min_visible + _start_time_widget->value() * range / 100; - auto end_time = Info::Render::_x_min_visible + _end_time_widget->value() * range / 100; + auto range = (_render->_x_max_visible - _render->_x_min_visible); + auto start_time = _render->_x_min_visible + _start_time_widget->value() * range / 100; + auto end_time = _render->_x_min_visible + _end_time_widget->value() * range / 100; auto interval = Interval{start_time, end_time}; diff --git a/src/trace/values/Date.cpp b/src/trace/values/Date.cpp index 9a668ede7f5c706204768d727a80d0a9c5a02645..1a3e014fb47b5cc2ef81e8a402197aeffc84b93a 100644 --- a/src/trace/values/Date.cpp +++ b/src/trace/values/Date.cpp @@ -70,10 +70,11 @@ Date::Date(double value) : _value(value) { Date::Date(const std::string &value) { _is_correct = convert_to_double(value, &_value); - if (_value > Info::Entity::x_max) + if (_value > Info::Entity::x_max) { Info::Entity::x_max = _value; - else if ((Info::Entity::x_min > _value) && (_value != -1.)) + } else if ((Info::Entity::x_min > _value) && (_value != -1.)) { Info::Entity::x_min = _value; + } } std::string Date::to_string() const{