- fixed redrawing bug

git-svn-id: svn://svn.gna.org/svn/sgpemv2/trunk@1014 3ecf2c5c-341e-0410-92b4-d18e462d057c
This commit is contained in:
paolo 2006-09-05 23:49:55 +00:00
parent 3e35ed278f
commit 51ce976d65
2 changed files with 48 additions and 30 deletions

View File

@ -94,6 +94,8 @@ SimulationWidget::SimulationWidget(Simulation& simulation)
_running_process_gradient = 0;
_blocked_process_gradient = 0;
_partial_redraw = false;
_last_drawn = 0;
}
@ -111,14 +113,18 @@ SimulationWidget::update(const Simulation& /* changed_simulation */ )
{
// Force redraw
//count_elements();
resize_redraw();
// nedd redraw only last
_partial_redraw = true;
// resize_redraw();
}
void
SimulationWidget::update(const History& /* changed_history */ )
{
// Force redraw
//count_elements();
_last_drawn = 0;
_partial_redraw = false;
count_elements();
resize_redraw();
}
@ -143,35 +149,17 @@ void
SimulationWidget::draw_widget(cairo_t* ctx)
{
if(_n_proc<1) // nothing to draw
{
cairo_move_to(ctx, 10.0, 10.0);
cairo_show_text(ctx, "Simulation Widget: nothing to draw...");
return;
}
draw_names(ctx);
draw_grid(ctx);
draw_bars(ctx);
}
/*
// top margin in y units
_yu_top_margin = 1.0;
// left margin in x units
_xu_left_margin = 1.0;
// left margin in x units
_xu_left_graph_margin = 11.0;
// bar spacing in y units
_yu_process_bar_spacing = 1.0;
// process bar height in y units
_yu_process_bar_height = 1.0;
// thread bar spacing in y units
_yu_thread_bar_spacing = 0.2;
// thread bar height in y units
_yu_thread_bar_height = 0.6;
*/
void
SimulationWidget::draw_names(cairo_t* ctx)
@ -276,9 +264,13 @@ SimulationWidget::draw_grid(cairo_t* ctx)
// - draw left VER line
cairo_move_to(ctx, left_graph_margin, top_margin);
cairo_rel_line_to(ctx, 0, graph_height);
// - draw right VER line
cairo_move_to(ctx, left_graph_margin + graph_width, top_margin);
cairo_rel_line_to(ctx, 0, graph_height);
if(_simulation->get_state()==Simulation::state_stopped)
{
// - draw right VER line
cairo_move_to(ctx, left_graph_margin + graph_width, top_margin);
cairo_rel_line_to(ctx, 0, graph_height);
}
cairo_stroke(ctx);
// draw and write time line
@ -323,13 +315,24 @@ SimulationWidget::draw_bars(cairo_t* ctx)
const double thread_bar_height = _yu_thread_bar_height * _y_unit;
const double process_height = (_yu_process_bar_height + 2*_yu_process_bar_spacing) * _y_unit;
const double thread_height = (2.0*_yu_thread_bar_spacing+_yu_thread_bar_height) * _y_unit;
unsigned int from_time;
// const double graph_width = (2.0 + hist_front) * _x_unit;
// const double graph_height = _n_proc * process_height + (_show_threads?_n_thr:0) * thread_height;
make_gradients();
for(unsigned int t=1; t<=hist_front; t++)
if(_partial_redraw && _last_drawn>0)
{
from_time = _last_drawn;
}
else
{
from_time = 1;
}
std::cout << " SimulationWidget::draw_bars from:" << from_time << " to:" << hist_front << std::endl;
for(unsigned int t=from_time; t<=hist_front; t++)
{
// draw schedulables bars
double xpos = left_graph_margin + t * _x_unit; // left start of first process
@ -361,7 +364,9 @@ SimulationWidget::draw_bars(cairo_t* ctx)
} // ~ if(_show_threads)
ypos += process_bar_spacing; // white row after bar
} // ~ while(proc_iter!=processes.end())
} // ~ for(int t=0; t<=hist_size; t++)
} // ~ for(int t=0; t<=hist_front; t++)
_last_drawn = hist_front;
_partial_redraw = false;
}
void
@ -646,7 +651,7 @@ SimulationWidget::calc_drawing_size(cairo_t* ctx, size_t& width, size_t& height)
_y_unit=extents.height;
// left margin, labels, graph
width = (size_t)((_xu_left_graph_margin + _xu_left_graph_margin + 3.0 + pos) * _x_unit);
width = (size_t)((_xu_left_graph_margin + 3.0 + pos) * _x_unit);
// top margin,
height = (size_t)((_yu_top_margin + (_yu_process_bar_spacing*2.0+_yu_process_bar_height) * _n_proc + 3.0) * _y_unit);
if(_show_threads)

View File

@ -122,6 +122,19 @@ namespace sgpem
cairo_pattern_t* _ready_process_gradient;
cairo_pattern_t* _running_process_gradient;
cairo_pattern_t* _blocked_process_gradient;
/**
* Used to redraw partially the widget.
* If the redraw come from Simulation update this flag is true
* and are redrawn only the last time tics.
* If the redraw is needed by History update or resize this flag is false.
*/
bool _partial_redraw;
/**
* Last time tic drawn.
*/
unsigned int _last_drawn;
};
} //~ namespace sgpem