void CL_ListViewHeader_Impl::on_render(CL_GraphicContext &gc, const CL_Rect &update_rect) { CL_Rect rect = listview_header->get_geometry(); part_component.render_box(gc, rect.get_size(), update_rect); // draw listview column headers and backgrounds text_height = font.get_text_size(gc, "l").height; CL_ListViewColumnHeader col = first_column; while (!col.is_null()) { CL_GUIThemePart &part = col.impl->part; CL_Rect &crect = col.impl->rect; if (display_mode != listview_mode_details) crect.right = rect.right; part.render_box(gc, crect, update_rect); CL_Rect content_rect = part.get_content_box(crect); part.render_text(gc, col.get_caption(), content_rect, update_rect); col = col.get_next_sibling(); if (display_mode != listview_mode_details) break; } }
void CL_ListViewLayoutIcons::update_shown_items_grid(CL_Font &font, CL_ListViewItem doc_item) { CL_GraphicContext &gc = listview->get_gc(); shown_items.clear(); row_counter = 0; CL_ListViewItem item = doc_item.get_first_child(); int x = rect_view.left; int y = rect_view.top - scroll_y; int skip_items = (scroll_y/size_cell.height) * max_grid_cols_visible; int skip_rows = skip_items/max_grid_cols_visible; y += skip_rows * size_cell.height; int skip_item_counter = 0; while (item.is_item()) { if (skip_item_counter < skip_items) { item = item.get_next_sibling(); skip_item_counter++; } ListViewShownItem si; si.valid = true; si.item = item; CL_Rect rect_cell(x, y, x+size_cell.width, y+size_cell.height); si.rect_cell.push_back(rect_cell); rect_cell.shrink(rect_cell_shrink.left, rect_cell_shrink.top, rect_cell_shrink.right, rect_cell_shrink.bottom); // part_cell.get_content_box(si.rect_cell); CL_Rect rect_cell_content = rect_cell; si.rect_icon = get_icon_rect(rect_cell_content, item, rect_cell_content.left); const CL_StringRef &text = si.item.get_column(header->get_first_column().get_column_id()).get_text(); CL_Size text_size = font.get_text_size(gc, text); CL_Rect text_rect; text_rect.left = rect_cell_content.get_center().x - text_size.width/2; text_rect.top = rect_cell_content.bottom - text_size.height; text_rect.set_size(text_size); si.descent = font.get_font_metrics().get_descent(); si.rect_text.push_back(text_rect); shown_items.push_back(si); x += size_cell.width; if (x + size_cell.width > rect_view.right) { row_counter++; if (row_counter > (max_rows_visible+1)) break; y += size_cell.height; x = rect_view.left; } item = item.get_next_sibling(); } valid = true; }
void CL_ListViewLayoutIcons::create_parts() { part_row = CL_GUIThemePart(listview, "row"); part_opener = CL_GUIThemePart(listview, "row_opener"); part_cell = CL_GUIThemePart(listview, "cell"); part_cell.set_state("icons", true); part_cell.set_state(CssStr::normal, true); part_row.set_state(CssStr::normal, true); size_icon.width = part_cell.get_property_int(prop_icon_width); size_icon.height = part_cell.get_property_int(prop_icon_height); CL_Font font = part_cell.get_font(); height_text = font.get_text_size(gc, "l").height; size_cell = part_cell.get_preferred_size(); height_row = size_cell.height; max_rows_visible = rect_view.get_height() / size_cell.width; max_grid_cols_visible = rect_view.get_width() / size_cell.height; lineedit_textrect_offset.left = part_cell.get_property_int(CssStr::lineedit_offset_left); lineedit_textrect_offset.top = part_cell.get_property_int(CssStr::lineedit_offset_top); lineedit_textrect_offset.bottom = part_cell.get_property_int(CssStr::lineedit_offset_bottom); lineedit_textrect_offset.right = part_cell.get_property_int(CssStr::lineedit_offset_right); }
CL_SpanLayout_Impl::TextSizeResult CL_SpanLayout_Impl::find_text_size(CL_GraphicContext &gc, const TextBlock &block, unsigned int object_index) { CL_Font font = objects[object_index].font; if (layout_cache.object_index != object_index) { layout_cache.object_index = object_index; layout_cache.metrics = font.get_font_metrics(); } TextSizeResult result; result.start = block.start; int pos = block.start; int x_position = 0; while (pos != block.end) { int end = cl_min(objects[object_index].end, block.end); CL_StringRef subtext = text.substr(pos, end-pos); CL_Size text_size = font.get_text_size(gc, subtext); result.width += text_size.width; result.height = cl_max(result.height, (int)(layout_cache.metrics.get_height()+layout_cache.metrics.get_external_leading())/*text_size.height*/); result.ascender = cl_max(result.ascender, (int)layout_cache.metrics.get_ascent()); result.descender = cl_max(result.descender, (int)layout_cache.metrics.get_descent()); LineSegment segment; segment.type = object_text; segment.start = pos; segment.end = end; segment.font = objects[object_index].font; segment.color = objects[object_index].color; segment.id = objects[object_index].id; segment.x_position = x_position; segment.width = text_size.width; segment.ascender = (int)layout_cache.metrics.get_ascent(); segment.descender = (int)layout_cache.metrics.get_descent(); x_position += text_size.width; result.segments.push_back(segment); pos = end; if (pos == objects[object_index].end) { object_index++; result.objects_traversed++; if (object_index < objects.size()) { layout_cache.object_index = object_index; font = objects[object_index].font; layout_cache.metrics = font.get_font_metrics(); } } } result.end = pos; return result; }
//Zeichnet das Menü void Menu::draw() { CL_Font fontSmall; CL_Font fontBig; CL_Rect rectangle; std::stringstream sstream; std::string outputString; CL_Quadf textureQuad; CL_Rectf textureRectangle; CL_GraphicContext graphicContext; int space = 30; CL_Size textSize; int xPosition; //Ist die Menübreite gesetzt, wird der Anfang in x-Richtung //berechnet, damit das Menü zentriert ist if(menuWidth == -1) xPosition = 0; else xPosition = (viewPort.get_width() - menuWidth) / 2; graphicContext = world->get_gc(); //Schriften setzen fontSmall = CL_Font(graphicContext, "Comic Sans MS", 10); fontBig = CL_Font(graphicContext, "Comic Sans MS", 20); //Die unterschiedlichen Turmtypen durchgehen for(unsigned int i = 0; i < towerTypes.size(); i++) { //Ein Rechteck für den Rahmen eines Baufeldes definieren rectangle = CL_Rect( i*menuHeight + xPosition, viewPort.get_height() - menuHeight, (i+1)*menuHeight + xPosition, viewPort.get_height()-1); //Den Rahmen des Baufeldes zeichnen CL_Draw::box(graphicContext, rectangle, CL_Colorf::white); //Ein Rechteck für die Anzeige der Turmtextur innerhalb des Baufeldes definieren textureRectangle = CL_Rectf( i * menuHeight + ((menuHeight - menuTowerLength) / 2.0f) + xPosition, viewPort.get_height() - menuHeight + 5.0f, CL_Sizex<float>((float)menuTowerLength, (float)menuTowerLength)); textureQuad = CL_Quadf(textureRectangle); //Turmtextur zeichnen CL_Draw::texture(graphicContext, towerTypes[i]->texture, textureRectangle); //Nummer (=Shortcut auf Tastatur) des Baufeldes in der linken oberen Ecke zeichnen sstream << (i+1); sstream >> outputString; sstream.clear(); fontSmall.draw_text(graphicContext, rectangle.left + 5, rectangle.top + 10, outputString,CL_Colorf::white); //Kosten des Turmes unterhalb der Textur und zentriert im Baufeld ausgeben sstream << towerTypes[i]->price; sstream >> outputString; sstream.clear(); textSize = fontSmall.get_text_size(graphicContext, outputString); fontSmall.draw_text(graphicContext, ((menuHeight - textSize.width) / 2) + i * menuHeight + xPosition, viewPort.get_height() - textSize.height/2, outputString, CL_Colorf::white); } //x-Position weitersetzen für nächsten Menüeintrag xPosition += towerTypes.size()*menuHeight + space; //Geldanzeige sstream << world->getMoney(); sstream >> outputString; sstream.clear(); textSize = fontBig.get_text_size(world->get_gc(), outputString); Menu::drawMenuItem(outputString, menuCoinsLength, coinsTexture, fontBig, menuHeight/2, xPosition); xPosition += menuCoinsLength + textSize.width + space; //Zeitanzeige sstream << world->getCountdown(); sstream >> outputString; sstream.clear(); outputString = "Next Wave:\n" + outputString; textSize = fontBig.get_text_size(graphicContext, outputString); Menu::drawMenuItem(outputString, menuTimeLength, clockTexture, fontBig, menuHeight/2 - 10, xPosition); xPosition += menuTimeLength + textSize.width + space; //Lebensanzeige sstream << world->getLifes(); sstream >> outputString; sstream.clear(); Menu::drawMenuItem(outputString, menuLifeLength, heartTexture, fontBig, menuHeight/2, xPosition); //Beim ersten Aufruf wird die Menübreite errechnet if(menuWidth == -1) { textSize = fontBig.get_text_size(graphicContext, outputString); menuWidth = xPosition + menuLifeLength + textSize.width; } }
CL_Size CL_GUIThemePart::get_text_size( CL_GraphicContext &gc, const CL_StringRef &str ) const { CL_Font font = get_font(); return font.get_text_size(gc, str); }