diff options
author | AmusedNetwork <joseph@bywater.xyz> | 2020-11-07 16:52:57 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-11-10 09:54:18 +0100 |
commit | eac0344ef08cb249a90a0495b24235ea8bfb1315 (patch) | |
tree | 66cec2487e4f6477bfad238727cb2ab01184bf72 /Libraries/LibGUI | |
parent | 1041ab88ca8fd4b0385bcb9a2123d6eae9ad7c35 (diff) | |
download | serenity-eac0344ef08cb249a90a0495b24235ea8bfb1315.zip |
LibGUI: Limit the height of item text in IconView
Set the max height of the text_rect to be the height difference
between two icons. Calculate the number of text lines that can be
displayed in this height, and display only that many.
Diffstat (limited to 'Libraries/LibGUI')
-rw-r--r-- | Libraries/LibGUI/IconView.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/Libraries/LibGUI/IconView.cpp b/Libraries/LibGUI/IconView.cpp index 9c4255d5f2..c116520697 100644 --- a/Libraries/LibGUI/IconView.cpp +++ b/Libraries/LibGUI/IconView.cpp @@ -523,17 +523,22 @@ void IconView::paint_event(PaintEvent& event) auto font = font_for_index(item_data.index); - painter.fill_rect(item_data.text_rect, background_color); + Gfx::IntRect text_rect = item_data.text_rect; + auto icon_translation = translation.y() - 12; + text_rect.set_height(text_rect.height() > icon_translation ? icon_translation : text_rect.height()); + + painter.fill_rect(text_rect, background_color); if (is_focused() && item_data.index == cursor_index()) { - painter.draw_rect(item_data.text_rect, widget_background_color); - painter.draw_focus_rect(item_data.text_rect, palette().focus_outline()); + painter.draw_rect(text_rect, widget_background_color); + painter.draw_focus_rect(text_rect, palette().focus_outline()); } if (!item_data.wrapped_text_lines.is_empty()) { // Item text would not fit in the item text rect, let's break it up into lines.. const auto& lines = item_data.wrapped_text_lines; - for (size_t line_index = 0; line_index < lines.size(); ++line_index) { + size_t number_of_text_lines = min((size_t)icon_translation / font->glyph_height(), lines.size()); + for (size_t line_index = 0; line_index < number_of_text_lines; ++line_index) { Gfx::IntRect line_rect; line_rect.set_width(item_data.text_rect.width()); line_rect.set_height(font->glyph_height()); @@ -541,6 +546,10 @@ void IconView::paint_event(PaintEvent& event) line_rect.set_y(2 + item_data.text_rect.y() + line_index * font->glyph_height()); line_rect.inflate(6, 0); + // Shrink the line_rect on the last line to apply elision if there are more lines. + if (number_of_text_lines - 1 == line_index && lines.size() > number_of_text_lines) + line_rect.inflate(-(6 + 2 * font->max_glyph_width()), 0); + draw_item_text(painter, item_data.index, item_data.selected, line_rect, lines[line_index], font, Gfx::TextAlignment::Center, Gfx::TextElision::Right); } } else { |