void help_text_area::down_one_line() { adjust_last_row(); last_row_.clear(); curr_loc_.second += curr_row_height_ + (curr_row_height_ == min_row_height_ ? 0 : 2); curr_row_height_ = min_row_height_; contents_height_ = std::max<int>(curr_loc_.second + curr_row_height_, contents_height_); curr_loc_.first = get_min_x(curr_loc_.second, curr_row_height_); }
void help_text_area::add_img_item(const std::string& path, const std::string& alignment, const bool floating, const bool box) { surface surf(image::get_image(path)); if (surf.null()) return; ALIGNMENT align = str_to_align(alignment); if (align == HERE && floating) { WRN_DP << "Floating image with align HERE, aligning left." << std::endl; align = LEFT; } const int width = surf->w + (box ? box_width * 2 : 0); int xpos; int ypos = curr_loc_.second; int text_width = inner_location().w; switch (align) { case HERE: xpos = curr_loc_.first; break; case LEFT: default: xpos = 0; break; case MIDDLE: xpos = text_width / 2 - width / 2 - (box ? box_width : 0); break; case RIGHT: xpos = text_width - width - (box ? box_width * 2 : 0); break; } if (curr_loc_.first != get_min_x(curr_loc_.second, curr_row_height_) && (xpos < curr_loc_.first || xpos + width > text_width)) { down_one_line(); add_img_item(path, alignment, floating, box); } else { if (!floating) { curr_loc_.first = xpos; } else { ypos = get_y_for_floating_img(width, xpos, ypos); } add_item(item(surf, xpos, ypos, floating, box, align)); } }
void QCanvas::xor_with_line(QColor color,QColor background,bool time_sleep) { if (obj_lines.isEmpty()) return; size_t min_x = get_min_x().x(); size_t max_x = get_max_x().x(); size_t line_x = (min_x+max_x)/2; if( min_x == SIZE_MAX || max_x == SIZE_MAX) return; QImage im = pix->toImage(); Clear_canvas(); for(size_t i = 0; i<obj_lines.size(); ++i) { QPointF S = obj_lines.value(i).S; QPointF F = obj_lines.value(i).F; if(S.y() > F.y()) std::swap(S,F); for(size_t j = S.y(); j<F.y(); ++j) { size_t x = func(S,F,j); size_t y = j; while(x < line_x) { if(enabled_pix(color,QPointF(x,y))) im.setPixel(x,y,background.rgb()); else im.setPixel(x,y,color.rgb()); x++; } if(x == line_x) { if(enabled_pix(color,QPointF(x,y))) im.setPixel(x,y,background.rgb()); else im.setPixel(x,y,color.rgb()); } while (x > line_x) { if(enabled_pix(color,QPointF(x,y))) im.setPixel(x,y,background.rgb()); else im.setPixel(x,y,color.rgb()); x--; } pix->convertFromImage(im); for(size_t j = 0; j<i+1; ++j) Add_lines(obj_lines.value(j).S,obj_lines.value(j).F,Qt::black); this->setPixmap(*pix); } if(time_sleep) { QTime dieTime= QTime::currentTime().addSecs(1); while (QTime::currentTime() < dieTime) QCoreApplication::processEvents(QEventLoop::AllEvents, 10); } } draw_all_save_obj(); }
void help_text_area::add_text_item(const std::string& text, const std::string& ref_dst, bool broken_link, int _font_size, bool bold, bool italic, SDL_Color text_color ) { const int font_size = _font_size < 0 ? normal_font_size : _font_size; if (text.empty()) return; const int remaining_width = get_remaining_width(); size_t first_word_start = text.find_first_not_of(" "); if (first_word_start == std::string::npos) { first_word_start = 0; } if (text[first_word_start] == '\n') { down_one_line(); std::string rest_text = text; rest_text.erase(0, first_word_start + 1); add_text_item(rest_text, ref_dst, broken_link, _font_size, bold, italic, text_color); return; } const std::string first_word = get_first_word(text); int state = ref_dst == "" ? 0 : TTF_STYLE_UNDERLINE; state |= bold ? TTF_STYLE_BOLD : 0; state |= italic ? TTF_STYLE_ITALIC : 0; if (curr_loc_.first != get_min_x(curr_loc_.second, curr_row_height_) && remaining_width < font::line_width(first_word, font_size, state)) { // The first word does not fit, and we are not at the start of // the line. Move down. down_one_line(); std::string s = remove_first_space(text); add_text_item(s, ref_dst, broken_link, _font_size, bold, italic, text_color); } else { std::vector<std::string> parts = split_in_width(text, font_size, remaining_width); std::string first_part = parts.front(); // Always override the color if we have a cross reference. SDL_Color color; if(ref_dst.empty()) color = text_color; else if(broken_link) color = font::BAD_COLOR; else color = font::YELLOW_COLOR; surface surf(font::get_rendered_text(first_part, font_size, color, state)); if (!surf.null()) add_item(item(surf, curr_loc_.first, curr_loc_.second, first_part, ref_dst)); if (parts.size() > 1) { std::string& s = parts.back(); const std::string first_word_before = get_first_word(s); const std::string first_word_after = get_first_word(remove_first_space(s)); if (get_remaining_width() >= font::line_width(first_word_after, font_size, state) && get_remaining_width() < font::line_width(first_word_before, font_size, state)) { // If the removal of the space made this word fit, we // must move down a line, otherwise it will be drawn // without a space at the end of the line. s = remove_first_space(s); down_one_line(); } else if (!(font::line_width(first_word_before, font_size, state) < get_remaining_width())) { s = remove_first_space(s); } add_text_item(s, ref_dst, broken_link, _font_size, bold, italic, text_color); } } }