void tcontrol::request_reduce_width(const unsigned maximum_width) { assert(config_); if(!label_.empty() && can_wrap()) { tpoint size = get_best_text_size( tpoint(0,0), tpoint(maximum_width - config_->text_extra_width, 0)); size.x += config_->text_extra_width; size.y += config_->text_extra_height; set_layout_size(size); DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' maximum_width " << maximum_width << " result " << size << ".\n"; } else { DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' failed; either no label or wrapping not allowed.\n"; } }
void styled_widget::request_reduce_width(const unsigned maximum_width) { assert(config_); if(!label_.empty() && can_wrap()) { point size = get_best_text_size( point(), point(maximum_width - config_->text_extra_width, 0)); size.x += config_->text_extra_width; size.y += config_->text_extra_height; set_layout_size(size); DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' maximum_width " << maximum_width << " result " << size << ".\n"; } else if(label_.empty()) { point size = get_best_size(); point min_size = get_config_minimum_size(); size.x = std::min(size.x, std::max<int>(maximum_width, min_size.x)); set_layout_size(size); DBG_GUI_L << LOG_HEADER << " styled_widget " << id() << " maximum_width " << maximum_width << " result " << size << ".\n"; } else { DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' failed; either no label or wrapping not allowed.\n"; } }
tpoint tcontrol::calculate_best_size() const { assert(config_); if(label_.empty()) { DBG_GUI_L << LOG_HEADER << " empty label return default.\n"; return get_config_default_size(); } const tpoint minimum = get_config_default_size(); tpoint maximum = get_config_maximum_size(); if (!maximum.x) { maximum.x = settings::screen_width; } if (!maximum.y) { maximum.y = settings::screen_height; } maximum.x -= config_->text_extra_width; if (text_maximum_width_ && maximum.x > text_maximum_width_) { maximum.x = text_maximum_width_; } /** * @todo The value send should subtract the border size * and read it after calculation to get the proper result. */ tpoint result = get_best_text_size(minimum, maximum); DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' result " << result << ".\n"; return result; }
void styled_widget::impl_draw_background(surface& frame_buffer, int x_offset, int y_offset) { DBG_GUI_D << LOG_HEADER << " label '" << debug_truncate(label_) << "' size " << get_rectangle() << ".\n"; get_canvas(get_state()).blit(frame_buffer, calculate_blitting_rectangle(x_offset, y_offset)); }
tpoint tcontrol::calculate_best_size() const { assert(config_); if(label_.empty()) { DBG_GUI_L << LOG_HEADER << " empty label return default.\n"; return get_config_default_size(); } const tpoint minimum = get_config_default_size(); const tpoint maximum = get_config_maximum_size(); /** * @todo The value send should subtract the border size * and read it after calculation to get the proper result. */ tpoint result = get_best_text_size(minimum, maximum); DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' result " << result << ".\n"; return result; }
tpoint tcontrol::calculate_best_size() const { assert(config_); tpoint result(config_->default_width, config_->default_height); if(! label_.empty()) { // If no label text set we use the predefined value. /** * @todo The value send should subtract the border size * and readd it after calculation to get the proper result. */ result = get_best_text_size(result); } DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' result " << result << ".\n"; return result; }
point styled_widget::get_best_text_size(point minimum_size, point maximum_size) const { log_scope2(log_gui_layout, LOG_SCOPE_HEADER); assert(!label_.empty()); const point border(config_->text_extra_width, config_->text_extra_height); point size = minimum_size - border; renderer_.set_link_aware(get_link_aware()) .set_link_color(get_link_color()); renderer_.set_text(label_, use_markup_); renderer_.set_family_class(config_->text_font_family); renderer_.set_font_size(config_->text_font_size); renderer_.set_font_style(config_->text_font_style); renderer_.set_alignment(text_alignment_); // Try with the minimum wanted size. const int maximum_width = text_maximum_width_ != 0 ? text_maximum_width_ : maximum_size.x; renderer_.set_maximum_width(maximum_width); if(can_wrap()) { renderer_.set_ellipse_mode(PANGO_ELLIPSIZE_NONE); } renderer_.set_characters_per_line(get_characters_per_line()); if(get_characters_per_line() != 0 && !can_wrap()) { WRN_GUI_L << LOG_HEADER << " Limited the number of characters per line, " << "but wrapping is not set, output may not be as expected.\n"; } DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' status: " << " minimum_size " << minimum_size << " maximum_size " << maximum_size << " text_maximum_width_ " << text_maximum_width_ << " can_wrap " << can_wrap() << " characters_per_line " << get_characters_per_line() << " truncated " << renderer_.is_truncated() << " renderer size " << renderer_.get_size() << ".\n"; // If doesn't fit try the maximum. if(renderer_.is_truncated() && !can_wrap()) { // FIXME if maximum size is defined we should look at that // but also we don't adjust for the extra text space yet!!! maximum_size = point(config_->max_width, config_->max_height); renderer_.set_maximum_width(maximum_size.x ? maximum_size.x - border.x : -1); } size = renderer_.get_size() + border; if(size.x < minimum_size.x) { size.x = minimum_size.x; } if(size.y < minimum_size.y) { size.y = minimum_size.y; } DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' result " << size << ".\n"; return size; }