diff --git a/src/simulation_widget.cc b/src/simulation_widget.cc index 3594a1c..3a16a70 100644 --- a/src/simulation_widget.cc +++ b/src/simulation_widget.cc @@ -36,9 +36,9 @@ using namespace sgpem; SimulationWidget::SimulationWidget(Simulation& simulation) : Glib::ObjectBase("sgpem_SimulationWidget"), - CairoWidget(), SimulationObserver(), HistoryObserver(), + CairoWidget(), _simulation(&simulation), _x_unit(10), _y_unit(10), _n_proc(0), _n_thr(0) @@ -69,24 +69,31 @@ SimulationWidget::SimulationWidget(Simulation& simulation) _xu_left_graph_margin = 11.0; /** - * bar spacing in y units + * process bar spacing in y units */ _yu_process_bar_spacing = 1.0; /** * process bar height in y units */ - _yu_process_bar_height = 1.0; + _yu_process_bar_height = 2.0; /** * thread bar spacing in y units */ - _yu_thread_bar_spacing = 0.4; + _yu_thread_bar_spacing = 0.5; /** * thread bar height in y units */ - _yu_thread_bar_height = 0.2; + _yu_thread_bar_height = 1.0; + + + + _ready_process_gradient = 0; + _running_process_gradient = 0; + _blocked_process_gradient = 0; + } @@ -100,7 +107,7 @@ SimulationWidget::~SimulationWidget() } void -SimulationWidget::update(const Simulation& changed_simulation) +SimulationWidget::update(const Simulation& /* changed_simulation */ ) { // Force redraw //count_elements(); @@ -108,7 +115,7 @@ SimulationWidget::update(const Simulation& changed_simulation) } void -SimulationWidget::update(const History& changed_history) +SimulationWidget::update(const History& /* changed_history */ ) { // Force redraw //count_elements(); @@ -176,12 +183,12 @@ SimulationWidget::draw_names(cairo_t* ctx) const History& hist = _simulation->get_history(); const double top_margin = _yu_top_margin * _y_unit; const double left_margin = _x_unit; - const double left_graph_margin = _xu_left_graph_margin * _x_unit; + // const double left_graph_margin = _xu_left_graph_margin * _x_unit; const double process_bar_spacing = _yu_process_bar_spacing * _y_unit; const double process_bar_height = _yu_process_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; - const double graph_height = _n_proc * process_height + (_show_threads?_n_thr:0) * thread_height; + // const double graph_height = _n_proc * process_height + (_show_threads?_n_thr:0) * thread_height; // set a rectangular clip region to cut long names // - set the rectangle @@ -193,7 +200,7 @@ SimulationWidget::draw_names(cairo_t* ctx) cairo_clip(ctx); */ // draw schedulables names - double ypos = top_margin + _y_unit; // margin + text height + double ypos = top_margin + _y_unit / 2.0; // margin + half of text height const Environment::Processes& processes = hist.get_last_environment().get_processes(); Environment::Processes::const_iterator proc_iter = processes.begin(); // - draw processes names @@ -201,10 +208,10 @@ SimulationWidget::draw_names(cairo_t* ctx) { Process* p = (*proc_iter); proc_iter++; - ypos += process_bar_spacing; // white row before text + ypos += process_bar_spacing + process_bar_height/2.0; // white row before text cairo_move_to(ctx, left_margin, ypos); cairo_show_text(ctx,p->get_name().c_str()); - ypos += process_bar_height; // height of process bar + ypos += process_bar_height/2.0; // height of process bar if(_show_threads) { const std::vector& tvect = p->get_threads(); @@ -213,9 +220,10 @@ SimulationWidget::draw_names(cairo_t* ctx) { Thread* t = (*thr_iter); thr_iter++; + ypos += thread_height/2.0; cairo_move_to(ctx, left_margin+_x_unit, ypos); cairo_show_text(ctx,t->get_name().c_str()); - ypos += thread_height; // height of thread bar + ypos += thread_height/2.0; // height of thread bar } // ~ while(thr_iter!=tvect.end()) } // ~ if(_show_threads) ypos += process_bar_spacing; // white row after text @@ -232,10 +240,10 @@ SimulationWidget::draw_grid(cairo_t* ctx) //const int hist_size = hist.get_size(); const unsigned int hist_front = hist.get_front(); const double top_margin = _yu_top_margin * _y_unit; - const double left_margin = _x_unit; + // const double left_margin = _x_unit; const double left_graph_margin = _xu_left_graph_margin * _x_unit; - const double process_bar_spacing = _yu_process_bar_spacing * _y_unit; - const double process_bar_height = _yu_process_bar_height * _y_unit; + // const double process_bar_spacing = _yu_process_bar_spacing * _y_unit; + // const double process_bar_height = _yu_process_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; const double graph_width = (2.0 + hist_front) * _x_unit; @@ -282,7 +290,7 @@ SimulationWidget::draw_grid(cairo_t* ctx) top_margin + graph_height + 2.0 * _y_unit); cairo_show_text(ctx,"T"); - for(int t=0; t<=hist_front; t++) + for(unsigned int t=0; t<=hist_front; t++) { cairo_move_to(ctx, left_graph_margin + (t+1)*_x_unit, top_margin + graph_height); @@ -307,7 +315,7 @@ SimulationWidget::draw_bars(cairo_t* ctx) const History& hist = _simulation->get_history(); const unsigned int hist_front = hist.get_front(); const double top_margin = _yu_top_margin * _y_unit; - const double left_margin = _x_unit; + // const double left_margin = _x_unit; const double left_graph_margin = _xu_left_graph_margin * _x_unit; const double process_bar_spacing = _yu_process_bar_spacing * _y_unit; const double process_bar_height = _yu_process_bar_height * _y_unit; @@ -315,11 +323,13 @@ 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; - 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; + // 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; - for(int t=1; t<=hist_front; t++) + make_gradients(); + + for(unsigned int t=1; t<=hist_front; t++) { // draw schedulables bars double xpos = left_graph_margin + t * _x_unit; // left start of first process @@ -358,17 +368,52 @@ void SimulationWidget::draw_instant_rect(cairo_t* ctx, double x, double y, double w, double h, Schedulable::state state) { + + +// _ready_process_gradient = cairo_pattern_create_linear(0, 0, 0, _yu_process_bar_height * _y_unit); +// _running_process_gradient = cairo_pattern_create_linear(0, 0, 0, _yu_process_bar_height * _y_unit); +// _blocked_process_gradient = cairo_pattern_create_linear(0, 0, 0, _yu_process_bar_height * _y_unit); + + cairo_matrix_t matrix; + switch(state) { case Schedulable::state_running: - cairo_set_source_rgb(ctx, 0, 1, 0); + // cairo_set_source_rgb(ctx, 0, 1, 0); + cairo_save(ctx); + cairo_set_source(ctx, _running_process_gradient); + // cairo_matrix_init_scale(&matrix, 1.0, y); + // cairo_matrix_translate(&matrix, 0, -y); + cairo_matrix_init_translate(&matrix, 0, -y); + cairo_pattern_set_matrix (_running_process_gradient, &matrix); + cairo_rectangle(ctx, x, y, w, h); + cairo_fill(ctx); + cairo_restore(ctx); break; + case Schedulable::state_ready: - cairo_set_source_rgb(ctx, 1, 1, 0); + // cairo_set_source_rgb(ctx, 1, 1, 0); + cairo_save(ctx); + cairo_set_source(ctx, _ready_process_gradient); + cairo_matrix_init_translate(&matrix, 0, -y); + // cairo_matrix_scale(&matrix, 1.0, y); + cairo_pattern_set_matrix (_ready_process_gradient, &matrix); + cairo_rectangle(ctx, x, y, w, h); + cairo_fill(ctx); + cairo_restore(ctx); break; + case Schedulable::state_blocked: - cairo_set_source_rgb(ctx, 1, 0, 0); + // cairo_set_source_rgb(ctx, 1, 0, 0); + cairo_save(ctx); + cairo_set_source(ctx, _blocked_process_gradient); + cairo_matrix_init_translate(&matrix, 0, -y); + cairo_pattern_set_matrix (_blocked_process_gradient, &matrix); + cairo_rectangle(ctx, x, y, w, h); + cairo_fill(ctx); + cairo_restore(ctx); break; + case Schedulable::state_future: return; // don't draw break; @@ -377,8 +422,6 @@ SimulationWidget::draw_instant_rect(cairo_t* ctx, double x, double y, // cairo_set_source_rgb(ctx, 0, 0, 0); break; } // ~ switch(state) - cairo_rectangle(ctx, x, y, w, h); - cairo_fill(ctx); } // OLD - START *************** @@ -585,12 +628,12 @@ SimulationWidget::draw_widget(cairo_t* ctx) void SimulationWidget::calc_drawing_size(cairo_t* ctx, size_t& width, size_t& height) { - std::cout << "Simulation widget BEFORE calc_drawing_size width=" << width << " height=" << height << std::endl; + // std::cout << "Simulation widget BEFORE calc_drawing_size width=" << width << " height=" << height << std::endl; if(!_simulation) return; const History& hist = _simulation->get_history(); - const Environment::Processes& processes = hist.get_last_environment().get_processes(); + // const Environment::Processes& processes = hist.get_last_environment().get_processes(); int pos = _simulation->get_history().get_front(); cairo_text_extents_t extents; @@ -603,14 +646,18 @@ SimulationWidget::calc_drawing_size(cairo_t* ctx, size_t& width, size_t& height) _y_unit=extents.height; // left margin, labels, graph - width = (1.0 + 11.0 + 3.0 + pos) * _x_unit; - height = (1.0 + 3.0 * _n_proc + 3.0) * _y_unit; + width = (size_t)((_xu_left_graph_margin + _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) - height += _n_thr * _y_unit; + height += (size_t) (_n_thr * (_yu_thread_bar_spacing*2.0+_yu_thread_bar_height) * _y_unit); - std::cout << "Simulation widget AFTER calc_drawing_size width=" << width << " height=" << height << std::endl; + // std::cout << "Simulation widget AFTER calc_drawing_size width=" << width << " height=" << height << std::endl; } + + + void SimulationWidget::count_elements() { @@ -635,3 +682,24 @@ SimulationWidget::count_elements() std::cout << " _n_proc=" << _n_proc << " _n_thr=" << _n_thr << std::endl; // count_elements(); } + +void +SimulationWidget::make_gradients() +{ + + _ready_process_gradient = cairo_pattern_create_linear(0, 0, 0, _yu_process_bar_height * _y_unit); + // yellow + cairo_pattern_add_color_stop_rgba(_ready_process_gradient, 0.00, 1.0, 1.0, 0.5, 0.7); + cairo_pattern_add_color_stop_rgba(_ready_process_gradient, 1.00, 1.0, 1.0, 0.0, 1.0); + + _running_process_gradient = cairo_pattern_create_linear(0, 0, 0, _yu_process_bar_height * _y_unit); + // green + cairo_pattern_add_color_stop_rgba(_running_process_gradient, 0.00, 0.5, 1.0, 0.5, 0.7); + cairo_pattern_add_color_stop_rgba(_running_process_gradient, 1.00, 0.0, 1.0, 0.0, 1.0); + + _blocked_process_gradient = cairo_pattern_create_linear(0, 0, 0, _yu_process_bar_height * _y_unit); + // blue + cairo_pattern_add_color_stop_rgba(_blocked_process_gradient, 0.00, 0.5, 0.5, 1.0, 0.7); + cairo_pattern_add_color_stop_rgba(_blocked_process_gradient, 1.00, 0.0, 0.0, 1.0, 1.0); +} + diff --git a/src/simulation_widget.hh b/src/simulation_widget.hh index c8e3d6d..bf63712 100644 --- a/src/simulation_widget.hh +++ b/src/simulation_widget.hh @@ -56,16 +56,34 @@ namespace sgpem void draw_bars(cairo_t* ctx); void draw_instant_rect(cairo_t* ctx, double x, double y, double w, double h, sgpem::Schedulable::state state); + void make_gradients(); private: - int _x_unit; - int _y_unit; Simulation* _simulation; bool _show_threads; + + /** + drawing x unit + */ + double _x_unit; + + /** + drawing y unit + */ + double _y_unit; + + /** + actual number of processes + */ int _n_proc; + + /** + actual number of threads + */ int _n_thr; + /** * top margin in y units */ @@ -101,6 +119,9 @@ namespace sgpem */ double _yu_thread_bar_height; + cairo_pattern_t* _ready_process_gradient; + cairo_pattern_t* _running_process_gradient; + cairo_pattern_t* _blocked_process_gradient; }; } //~ namespace sgpem diff --git a/src/testsuite/test-holt_widget.cc b/src/testsuite/test-holt_widget.cc index 36638fe..5a8280b 100644 --- a/src/testsuite/test-holt_widget.cc +++ b/src/testsuite/test-holt_widget.cc @@ -467,7 +467,9 @@ void MainWindow::on_buttons_radio_clicked() _holt_widget.set_scaling_mode(CairoWidget::scaling_all); } _simulation_widget.resize_redraw(); + _simulation_widget.set_size_request (20, 20); _holt_widget.resize_redraw(); + _holt_widget.set_size_request (20, 20); }