void AbsoluteLayout::onDraw(Canvas *c) { // draw all views in this ViewGroup std::list<View*>* views = this->getViews(); for(std::list<View*>::iterator it = views->begin(); it != views->end(); it++) { // create canvas for view Canvas canvas_view((*it)->getPreferredWidth(), (*it)->getPreferredHeight()); // render the view (*it)->onDraw(&canvas_view); // draw view's canvas on this layout's canvas c->drawCanvas(&canvas_view, (*it)->getPosX(), (*it)->getPosY()); } }
TEST(container_view_test, drawing_a_container_with_views_draws_the_views) { terminalpp::ui::models::default_image_model model00; terminalpp::ui::models::default_image_model model10; terminalpp::ui::models::default_image_model model20; terminalpp::ui::models::default_image_model model01; terminalpp::ui::models::default_image_model model11; terminalpp::ui::models::default_image_model model21; model00.set_content({{'0'}}); model10.set_content({{'1'}}); model20.set_content({{'2'}}); model01.set_content({{'3'}}); model11.set_content({{'4'}}); model21.set_content({{'5'}}); terminalpp::ui::models::container_model container_model{ terminalpp::ui::models::default_container_model{}}; container_model.set_layout(terminalpp::ui::layouts::grid_layout({3, 2})); container_model.add(terminalpp::ui::views::image_view{model00}, {}); container_model.add(terminalpp::ui::views::image_view{model10}, {}); container_model.add(terminalpp::ui::views::image_view{model20}, {}); container_model.add(terminalpp::ui::views::image_view{model01}, {}); container_model.add(terminalpp::ui::views::image_view{model11}, {}); container_model.add(terminalpp::ui::views::image_view{model21}, {}); terminalpp::ui::views::container_view container_view{ container_model}; terminalpp::ui::view view{container_view}; view.set_size({3, 2}); terminalpp::canvas canvas({3, 2}); terminalpp::canvas_view canvas_view(canvas); terminalpp::ui::draw_context dc{ terminalpp::ui::views::default_draw_context{canvas_view}}; view.draw(dc, {{}, canvas.size()}); ASSERT_EQ(terminalpp::element{'0'}, canvas[0][0]); ASSERT_EQ(terminalpp::element{'1'}, canvas[1][0]); ASSERT_EQ(terminalpp::element{'2'}, canvas[2][0]); ASSERT_EQ(terminalpp::element{'3'}, canvas[0][1]); ASSERT_EQ(terminalpp::element{'4'}, canvas[1][1]); ASSERT_EQ(terminalpp::element{'5'}, canvas[2][1]); }
TEST(container_view_test, drawing_a_container_with_no_views_draws_nothing) { terminalpp::ui::view view{ terminalpp::ui::views::container_view{}}; view.set_size({3, 2}); terminalpp::canvas canvas({3, 2}); terminalpp::canvas_view canvas_view(canvas); terminalpp::ui::draw_context dc{ terminalpp::ui::views::default_draw_context{canvas_view}}; view.draw(dc, {{}, canvas.size()}); auto blank_element = terminalpp::element(); ASSERT_EQ(blank_element, canvas[0][0]); ASSERT_EQ(blank_element, canvas[1][0]); ASSERT_EQ(blank_element, canvas[2][0]); ASSERT_EQ(blank_element, canvas[0][1]); ASSERT_EQ(blank_element, canvas[1][1]); ASSERT_EQ(blank_element, canvas[2][1]); }