Commit 813ce278 authored by Thibault Soucarre's avatar Thibault Soucarre

Add settings for links. Arrows heads are not correctly affected when using triangles

parent 15793646
......@@ -1321,6 +1321,11 @@ void Core::change_event_color(std::string event, Element_col r, Element_col g, E
_render_opengl->change_event_color(event, r, g, b);
}
void Core::change_link_color(std::string link, Element_col r, Element_col g, Element_col b){
std::cout << "core change link color" << std::endl;
_render_opengl->change_link_color(link, r, g, b);
}
void Core::change_entity_visible(std::string entity, bool visible){
std::cout << "core" << std::endl;
_render_opengl->change_visible(entity, visible);
......@@ -1331,6 +1336,11 @@ void Core::change_event_visible(std::string event, bool visible){
_render_opengl->change_event_visible(event, visible);
}
void Core::change_link_visible(std::string link, bool visible){
std::cout << "core" << std::endl;
_render_opengl->change_link_visible(link, visible);
}
void Core::reload_states(){
_render_opengl->reload_states();
}
......@@ -511,9 +511,14 @@ public:
void change_event_color(std::string event, Element_col r, Element_col g, Element_col b);
void change_link_color(std::string link, Element_col r, Element_col g, Element_col b);
void change_entity_visible(std::string entity, bool visible);
void change_event_visible(std::string event, bool visible);
void change_link_visible(std::string link, bool visible);
/*!
* \brief reload state color from trace file
*/
......
......@@ -213,7 +213,7 @@ void Settings_window::color_changed(string name, QTableWidget *table, const QCol
else if (name == "event_types")
changes = &_events_color_changes;
else
changes = NULL;
changes = &_links_color_changes;
S.add_state_to_palette(name, palette_name, state_name, color, checked );
......@@ -255,7 +255,7 @@ void Settings_window::visible_changed(string name, QTableWidget *table, const bo
else if(name == "event_types")
changes = &_events_visible_changes;
else
changes = NULL;
changes = &_links_visible_changes;
S.add_state_to_palette(name, palette_name, state_name, color, checked );
p->add_state(state_name, color, checked );
if(changes->count(state_name)>0)
......@@ -384,7 +384,7 @@ void Settings_window::fill_table_events( const string &palette_name ) {
void Settings_window::fill_table_links( const string &palette_name ) {
fill_table( link_types_table,
SLOT(link_types_color_changed(const QColor &)),
SLOT(links_types_visible_changed(int )),
SLOT(link_types_visible_changed(int)),
"link_types", palette_name );
}
......@@ -510,7 +510,8 @@ void Settings_window::on_reload_states_btn_clicked(){
_states_visible_changes.clear();
_events_color_changes.clear();
_events_visible_changes.clear();
_links_color_changes.clear();
_links_visible_changes.clear();
}
void Settings_window::on_add_state_btn_clicked() {
......@@ -774,10 +775,23 @@ void Settings_window::on_apply_clicked() {
_c->change_event_visible(it2->first, it2->second);
it2++;
}
it = _links_color_changes.begin();
while(it != _links_color_changes.end()){
color = it->second;
_c->change_link_color(it->first, color.get_red(), color.get_green(), color.get_blue());
it++;
}
it2 = _links_visible_changes.begin();
while(it2 != _links_visible_changes.end()){
_c->change_link_visible(it2->first, it2->second);
it2++;
}
_states_changes.clear();
_states_visible_changes.clear();
_events_color_changes.clear();
_events_visible_changes.clear();
_links_color_changes.clear();
_links_visible_changes.clear();
_color_cancel.clear();
_visible_cancel.clear();
emit settings_changed(); // Catch by at least the interface_graphic which will dispatch it to the classes which needs
......@@ -808,6 +822,8 @@ void Settings_window::on_cancel_clicked() {
_states_changes.clear();
_events_color_changes.clear();
_events_visible_changes.clear();
_links_color_changes.clear();
_links_visible_changes.clear();
_color_cancel.clear();
_visible_cancel.clear();
_reload = false;
......
......@@ -75,6 +75,8 @@ private:
std::map<std::string, bool> _states_visible_changes;
std::map<std::string, Color> _events_color_changes;
std::map<std::string, bool> _events_visible_changes;
std::map<std::string, Color> _links_color_changes;
std::map<std::string, bool> _links_visible_changes;
bool _reload;
//used to check if leaving the tab needs an apply first when OK button is pressed
bool _changed;
......
......@@ -582,7 +582,7 @@ void ParserEventPaje::store_event(const PajeLine *line,
case _PajeStartLink :
{
LinkType *temp_link_type = trace.search_link_type(type);
EntityValue *temp_entity_value = trace.search_entity_value(value_string, temp_link_type);
//EntityValue *temp_entity_value = trace.search_entity_value(value_string, temp_link_type);
Container *temp_container = NULL;
Container *temp_start_container = NULL;
......@@ -614,7 +614,7 @@ void ParserEventPaje::store_event(const PajeLine *line,
Error::set(Error::VITE_ERR_UNKNOWN_CONTAINER + start_container.to_string(), line->_id, Error::VITE_ERRCODE_ERROR);
}
else{
trace.start_link(time, temp_link_type, temp_container, temp_start_container, temp_entity_value, key, extra_fields);
trace.start_link(time, temp_link_type, temp_container, temp_start_container, key, extra_fields);
}
}
break;
......@@ -622,7 +622,7 @@ void ParserEventPaje::store_event(const PajeLine *line,
case _PajeEndLink :
{
LinkType *temp_link_type = trace.search_link_type(type);
EntityValue *temp_entity_value = trace.search_entity_value(value_string, temp_link_type);
//EntityValue *temp_entity_value = trace.search_entity_value(value_string, temp_link_type);
Container *temp_container = NULL;
Container *temp_end_container = NULL;
......@@ -653,7 +653,7 @@ void ParserEventPaje::store_event(const PajeLine *line,
Error::set(Error::VITE_ERR_UNKNOWN_CONTAINER + end_container.to_string(), line->_id, Error::VITE_ERRCODE_ERROR);
}
else{
trace.end_link(time, temp_link_type, temp_container, temp_end_container, temp_entity_value, key, extra_fields);
trace.end_link(time, temp_link_type, temp_container, temp_end_container, /*temp_entity_value, */key, extra_fields);
}
}
break;
......
......@@ -307,7 +307,7 @@ public:
*
* This function stores all the information of the arrow to display it each time the render area need to be updated.
*/
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){
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){
/* For SVG */
const Element_pos triangle_size = 2.0;
......@@ -332,7 +332,7 @@ public:
end_time, end_height, _z_arrow);
/* For OpenGL */
drawing_instance->draw_arrow(start_time, end_time, start_height, end_height, r, g, b);
drawing_instance->draw_arrow(start_time, end_time, start_height, end_height, r, g, b, value);
drawing_instance->set_color(1, 1, 1);/* init */
}
......
......@@ -192,7 +192,8 @@ virtual void draw_arrow(const Element_pos start_time,
const Element_pos end_height,
const Element_col red,
const Element_col green,
const Element_col blue) = 0;
const Element_col blue,
EntityValue* value) = 0;
/*!
\brief initialization for events draws
......
......@@ -103,8 +103,8 @@ Render_alternate::Render_alternate(Core* core, QWidget *parent, const QGLFormat&
_glsl(0),
_containers(GL_QUADS),
/*_states(GL_QUADS),*/
_arrows(GL_LINE),
_arrows2(GL_TRIANGLES),
//_arrows(GL_LINE),
//_arrows2(GL_TRIANGLES),
_counters(GL_LINE),
_ruler(GL_QUADS),
_wait(GL_QUADS),
......@@ -267,12 +267,29 @@ void Render_alternate::paintGL(){
//matrix change that are necessary for each link
_modelview = glm::translate(_modelview, glm::vec3(_default_entity_x_translate - _x_state_translate, _ruler_y + _ruler_height - _y_state_translate , _z_arrow));
_modelview = glm::scale(_modelview, glm::vec3(_x_state_scale, _y_state_scale, 1.0));
//draw the line
_arrows.lock();
mvp = _projection * _modelview;
glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
glDrawArrays(GL_LINES, 0, _arrows.getNbVertex());
_arrows.unlock();
//draw the lines
std::map<EntityValue*, std::pair<Vbo *, Vbo*> >::iterator it_link = _arrows.begin();
while(it_link != _arrows.end()){
Shader*s = _arrows_shaders[it_link->first];
glUseProgram(s->getProgramID());
it_link->second.first->lock();
glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
if(it_link->first == NULL || it_link->first->get_visible())
glDrawArrays(GL_LINES, 0, it_link->second.first->getNbVertex());
it_link->second.first->unlock();
if(Info::Render::_arrows_shape == 1){
std::cout << "head of the arrow " << it_link->second.second->getNbVertex() << " " << it_link->second.first->getNbVertex() << std::endl;
it_link->second.second->lock();
glEnable(GL_PROGRAM_POINT_SIZE);
glEnable(GL_POINT_SMOOTH);
glPointSize(5);
if(it_link->first == NULL || it_link->first->get_visible())
glDrawArrays(GL_POINTS, 0, it_link->second.second->getNbVertex());
it_link->second.second->unlock();
}
it_link++;
}
//draw the head of the arrow according to the parameter arrows_shape
int n = _links.size()/4;
switch(Info::Render::_arrows_shape){
......@@ -291,9 +308,9 @@ void Render_alternate::paintGL(){
_arrows3.unlock();
break;
case 1: //points
_arrows2.lock();
glDrawArrays(GL_POINTS, 0, _arrows2.getNbVertex());
_arrows2.unlock();
//_arrows2.lock();
//glDrawArrays(GL_POINTS, 0, _arrows2.getNbVertex());
//_arrows2.unlock();
break;
default: //no head
break;
......@@ -318,8 +335,8 @@ void Render_alternate::paintGL(){
glEnable(GL_POINT_SMOOTH);
glPointSize(5);
glDrawArrays(GL_POINTS, 0, it_event->second.first->getNbVertex());
it_event->second.first->unlock();
}
it_event->second.first->unlock();
it_event->second.second->lock();
glLineWidth(2);
if(it_event->first==NULL || it_event->first->get_visible())
......@@ -344,6 +361,7 @@ void Render_alternate::paintGL(){
//restore basic matrix
_modelview = tmp;
glUseProgram(_shader->getProgramID());
/*draw selection if necessary*/
......@@ -800,7 +818,7 @@ void Render_alternate::end_draw_states(){
std::map<EntityValue*, Vbo*>::iterator it;
it = _states.begin();
while(it!=_states.end()){
std::cout << it->first->get_name().get_name() << std::endl;
//std::cout << it->first->get_name().get_name() << std::endl;
it->second->config(_glsl);
it++;
}
......@@ -812,41 +830,60 @@ void Render_alternate::start_draw_arrows(){
}
void Render_alternate::draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height, const Element_col red, const Element_col green, const Element_col blue){
const Element_pos offset_x = -_default_entity_x_translate;
const Element_pos offset_y = -_ruler_y - _ruler_height;
Element_pos x0, x1, y0, y1, l, alpha, cosa, sina;
x0 = start_time + offset_x;
x1 = end_time + offset_x;
y0 = start_height + offset_y;
y1 = end_height + offset_y;
//size of the arrow
l = sqrt(pow(x1-x0,2)+pow(y1-y0,2));
//calculate angle beetween arrow and horizontal axe
cosa = (x1-x0)/l;
sina = (y1-y0)/l;
alpha = acos(cosa);
if(sina<0) alpha*= -1;
_arrows.add(x0, y0, 1, 1, 1);
_arrows.add(x1, y1, 1, 1, 1);
_arrows2.add(x1, y1, 1, 1, 1);
_links.push_back(alpha);
_links.push_back(l);
_links.push_back(x1);
_links.push_back(y1);
}
void Render_alternate::draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height, const Element_col red, const Element_col green, const Element_col blue, EntityValue* value){
if(_arrows.count(value) == 0){
Shader *s = new Shader(_glsl, _r, _g, _b, false);
s->charger();
std::pair<EntityValue*, Shader*> p(value, s);
_arrows_shaders.insert(p);
Vbo* v1 = new Vbo(GL_LINES);
Vbo* v2 = new Vbo(GL_POINTS);
std::pair<Vbo*, Vbo*> p2(v1, v2);
std::pair<EntityValue*, std::pair<Vbo*, Vbo*> > p3(value, p2);
_arrows.insert(p3);
}
const Element_pos offset_x = -_default_entity_x_translate;
const Element_pos offset_y = -_ruler_y - _ruler_height;
Element_pos x0, x1, y0, y1, l, alpha, cosa, sina;
x0 = start_time + offset_x;
x1 = end_time + offset_x;
y0 = start_height + offset_y;
y1 = end_height + offset_y;
//size of the arrow
l = sqrt(pow(x1-x0,2)+pow(y1-y0,2));
//calculate angle beetween arrow and horizontal axe
cosa = (x1-x0)/l;
sina = (y1-y0)/l;
alpha = acos(cosa);
if(sina<0) alpha*= -1;
_current = _arrows[value].first;
_current->add(x0, y0);
_current->add(x1, y1);
_current = _arrows[value].second;
_current->add(x1, y1);
_links.push_back(alpha);
_links.push_back(l);
_links.push_back(x1);
_links.push_back(y1);
}
void Render_alternate::end_draw_arrows(){
//coordinates that we use for draw the head all arrows when parameter arrows_shape is triangle, we will change the angle and scale of using the modelview matrix
_draw_arrow = false;
_arrows3.add(0,0,1,1,1);
_arrows3.add(-1.2, -0.4, 1, 1, 1);
_arrows3.add(-1.2, 0.4, 1, 1, 1);
//send datas to vbo
_arrows.config(_glsl);
_arrows2.config(_glsl);
std::map<EntityValue*, std::pair<Vbo*, Vbo*> >::iterator it = _arrows.begin();
while(it != _arrows.end()){
std::cout << it->first->get_name().get_name() << std::endl;
it->second.first->config(_glsl);
it->second.second->config(_glsl);
it++;
}
//_arrows.config(_glsl);
//_arrows2.config(_glsl);
_arrows3.config(_glsl);
_draw_arrow = false;
cout << "end_draw_arrows " << _links.size() << endl;
}
......@@ -1047,6 +1084,31 @@ void Render_alternate::change_event_color(std::string event, Element_col r, Elem
it++;
}
}
void Render_alternate::change_link_color(std::string link, Element_col r, Element_col g, Element_col b){
std::cout << "change_link_color" << " " << link << std::endl;
std::map<EntityValue*, Shader*>::iterator it;
it = _arrows_shaders.begin();
while(it != _arrows_shaders.end()){
//std::cout << it->first->get_name().get_name() << std::endl;
//assert(it->first); // TODO: check why busy state exists and uncomment this assert
if(it->first && (it->first->get_name() == link)){
std::cout << "xd lol" << std::endl;
Color *c = new Color(r, g, b);
it->first->set_used_color(c);
Shader* s = it->second;
delete s;
s = new Shader(_glsl, r, g, b, false);
s->charger();
break;
}
else if(it->first)
std::cout << it->first->get_name().get_name() << std::endl;
it++;
}
}
void Render_alternate::change_visible(std::string entity, bool visible){
std::map<EntityValue*, Shader*>::iterator it;
it = _states_shaders.begin();
......@@ -1077,6 +1139,21 @@ std::map<EntityValue*, Shader*>::iterator it;
}
}
void Render_alternate::change_link_visible(std::string link, bool visible){
std::map<EntityValue*, Shader*>::iterator it;
it = _arrows_shaders.begin();
while(it != _arrows_shaders.end()){
//std::cout << it->first->get_name().get_name() << std::endl;
//assert(it->first); // TODO: check why busy state exists and uncomment this assert
if(it->first && (it->first->get_name() == link)){
it->first->set_visible(visible);
break;
}
it++;
}
}
void Render_alternate::reload_states(){
std::map<EntityValue*, Shader*>::iterator it;
......@@ -1110,4 +1187,19 @@ void Render_alternate::reload_states(){
}
it++;
}
it = _arrows_shaders.begin();
while(it != _arrows_shaders.end()){
if(it->first){
it->first->reload_file_color();
it->first->set_visible(true);
Shader* s = it->second;
delete s;
s = new Shader(_glsl, it->first->get_used_color()->get_red(),
it->first->get_used_color()->get_green(),
it->first->get_used_color()->get_blue(),
false);
s->charger();
}
it++;
}
}
......@@ -116,8 +116,8 @@ private:
//Vbo _states;
//Vbo _events;
//Vbo _events2;
Vbo _arrows;
Vbo _arrows2;
//Vbo _arrows;
//Vbo _arrows2;
Vbo _arrows3;
Vbo _counters;
Vbo _ruler;
......@@ -126,11 +126,12 @@ private:
GLuint _textureID;
std::map<EntityValue*, Vbo*> _states;
std::map<EntityValue*, Shader*> _states_shaders;
std::map<EntityValue*, bool> _states_visible;
//first element of the pair contains the points, second contains the lines
std::map<EntityValue*, std::pair<Vbo*, Vbo*> > _events;
std::map<EntityValue*, Shader*> _events_shaders;
std::map<EntityValue*, bool> _events_visible;
//first element of the pair contains the line of the arrow, second contains the position of the head
std::map<EntityValue*, std::pair<Vbo*, Vbo*> > _arrows;
std::map<EntityValue*, Shader*> _arrows_shaders;
/*!
* \brief Offset of the vertical helper line
*/
......@@ -285,7 +286,7 @@ void start_draw_arrows();
*
* This function stores all the information of the arrow to display it each time the render area need to be updated.
*/
void draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height,const Element_col red, const Element_col green, const Element_col blue);
void draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height,const Element_col red, const Element_col green, const Element_col blue, EntityValue *value);
/*!
* \brief Closes the arrow display list.
......@@ -561,10 +562,14 @@ public slots:
void change_event_color(std::string event, Element_col r, Element_col g, Element_col b);
void change_link_color(std::string link, Element_col r, Element_col g, Element_col b);
void change_visible(std::string entity, bool visible);
void change_event_visible(std::string event, bool visible);
void change_link_visible(std::string link, bool visible);
/*!
* \brief reload state color from trace file
*/
......
......@@ -230,7 +230,7 @@ void Render_svg::end_draw_states(){
void Render_svg::start_draw_arrows(){
}
void Render_svg::draw_arrow(const Element_pos , const Element_pos , const Element_pos , const Element_pos, const Element_col, const Element_col, const Element_col){
void Render_svg::draw_arrow(const Element_pos , const Element_pos , const Element_pos , const Element_pos, const Element_col, const Element_col, const Element_col, EntityValue*){
}
void Render_svg::end_draw_arrows(){
......
......@@ -157,7 +157,7 @@ public:
*
* This function stores all the information of the arrow to display it each time the render area need to be updated.
*/
void draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height, const Element_col r, const Element_col g, const Element_col b);
void draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height, const Element_col r, const Element_col g, const Element_col b, EntityValue *value);
/*!
* \brief Closes the arrow display list.
......
......@@ -462,8 +462,10 @@ public:
link = *it;
bool display=false;
EntityValue *value = link->get_value();
const Color *color = value->get_used_color();
draw_link(draw_object, link, color, value);
/*bool display=false;
color=NULL;
if(!Session::get_use_palette("link_types")) display = true;
else{
......@@ -472,7 +474,7 @@ public:
color = lt->get_color(link->get_type()->get_name().to_string());
if(color) display=true;
*/
/*for(std::list<std::string>::const_iterator it2= link_types->get_->begin();
it2!= link_types->end();
it2++ ){
......@@ -483,8 +485,8 @@ public:
}
} */
}
}
//}
/*}
if(display &&
link_is_in_set(link,set_container,interval)){
......@@ -495,13 +497,14 @@ public:
!link->get_type()->get_extra_fields()->empty() &&
((field = link->get_type()->get_extra_fields()->find(std::string("Color"))) != link->get_type()->get_extra_fields()->end()))
/* Call the object link drawing function with the link color */
color = (const Color *)(*field).second;
/* color = (const Color *)(*field).second;
draw_link(draw_object, link, color );
}
}/* end for */
}//end for
}/* end while (!_stack_states.empty()) */
}//end for
}/* end while (!_stack_states.empty()) */
}
draw_object->end_draw_arrows();
draw_object->start_draw_counter();
......@@ -580,7 +583,7 @@ public:
* \param color The link color
*/
template<class T>
inline void draw_link(T *draw_object, const Link *link, const Color* color)
inline void draw_link(T *draw_object, const Link *link, const Color* color, EntityValue *value)
{
double starttime = link->get_start_time().get_value();
double endtime = link->get_end_time().get_value();
......@@ -593,9 +596,9 @@ public:
Element_pos y2 = (dstpos + 0.5 * dstsize);//*(_container_height+_container_v_space);
if (color != NULL)
draw_object->draw_arrow(starttime, endtime, y1, y2, color->get_red(), color->get_green(), color->get_blue());
draw_object->draw_arrow(starttime, endtime, y1, y2, color->get_red(), color->get_green(), color->get_blue(), value);
else/* Draw white link */
draw_object->draw_arrow(starttime, endtime, y1, y2, 1.0, 1.0, 1.0);
draw_object->draw_arrow(starttime, endtime, y1, y2, 1.0, 1.0, 1.0, value);
}
/*
......
......@@ -74,7 +74,7 @@ const LinkType *Link::get_type() const {
return _type;
}
const EntityValue *Link::get_value() const {
EntityValue *Link::get_value() const {
return _value;
}
......
......@@ -97,7 +97,7 @@ public:
* \brief Get the value of the link
* \return Pointer to the Entityvalue or NULL if it has no value
*/
const EntityValue *get_value() const;
EntityValue *get_value() const;
/*!
* \fn get_source() const
......
......@@ -329,7 +329,7 @@ void Trace::reset_state(Date &time, StateType *type, Container *container, map<s
void Trace::new_event(Date &time, EventType *type, Container *container, map<string, Value *> &opt) {
if (container && type) {
EntityValue *EV = search_entity_value( (type->get_name()).to_String(), type );
EntityValue *EV = search_entity_value( (type->get_name()).to_String(), type );
container->new_event(time, type, EV, opt);
}
......@@ -370,15 +370,16 @@ void Trace::sub_variable(Date &time, VariableType *type, Container *container, D
delete_opt(opt);
}
void Trace::start_link(Date &time, LinkType *type, Container *ancestor, Container *source, EntityValue *value, String key, map<string, Value *> &opt) {
void Trace::start_link(Date &time, LinkType *type, Container *ancestor, Container *source, /*EntityValue *value, */String key, map<string, Value *> &opt) {
EntityValue* EV = search_entity_value( (type->get_name()).to_String(), type );
if (ancestor && type && source)
ancestor->start_link(time, type, source, value, key, opt);
ancestor->start_link(time, type, source, EV, key, opt);
if (time > _max_date)
_max_date = time;
}
void Trace::end_link(Date &time, LinkType *type, Container *ancestor, Container *destination, EntityValue * /*value*/, String key, map<string, Value *> &opt) {
void Trace::end_link(Date &time, LinkType *type, Container *ancestor, Container *destination, /*EntityValue *value, */String key, map<string, Value *> &opt) {
if (ancestor && type && destination)
ancestor->end_link(time, destination, key, opt);
......
......@@ -281,7 +281,7 @@ public :
* \param key Key to match the end of the link
* \param opt Extra fields
*/
void start_link(Date &time, LinkType *type, Container *ancestor, Container *source, EntityValue *value, String key, std::map<std::string, Value *> &opt);
void start_link(Date &time, LinkType *type, Container *ancestor, Container *source, /*EntityValue *value, */String key, std::map<std::string, Value *> &opt);
/*!
* \brief End a link identified by key
......@@ -293,7 +293,7 @@ public :
* \param key Key to match the Start of the link
* \param opt Extra fields
*/
void end_link(Date &time, LinkType *type, Container *ancestor, Container *destination, EntityValue *value, String key, std::map<std::string, Value *> &opt);
void end_link(Date &time, LinkType *type, Container *ancestor, Container *destination, /*EntityValue *value, */String key, std::map<std::string, Value *> &opt);
/*!
* \fn finish()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment