/* * Copyright (c) 2024, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #include "ThumbnailsListView.h" #include "PDFViewerWidget.h" #include #include #include #include void ThumbnailsListView::paint_list_item(GUI::Painter& painter, int row_index, int painted_item_index) { bool is_selected_row = selection().contains_row(row_index); int y = painted_item_index * item_height(); bool row_is_visible = y > vertical_scrollbar().value() - item_height() && y < vertical_scrollbar().value() + visible_content_rect().height() + item_height(); Color background_color = is_selected_row ? palette().selection() : Gfx::Color::Transparent; Gfx::IntRect row_rect(0, y, content_width(), item_height()); painter.fill_rect(row_rect, background_color); auto index = model()->index(row_index, 0); auto data = index.data(); auto font = font_for_index(index); if (data.is_bitmap() && row_is_visible) { NonnullRefPtr bitmap = data.as_bitmap(); if (bitmap->width() == 1) { auto pdf_viewer_widget = static_cast(this->window()->main_widget()); bitmap = pdf_viewer_widget->update_thumbnail_for_page(row_index); } auto bitmap_x = (content_width() / 2) - (bitmap->width() / 2); auto bitmap_y = y + (item_height() / 2) - (bitmap->height() / 2) - 4; Gfx::Point bitmap_location(bitmap_x, bitmap_y); Gfx::IntRect bitmap_outline_rect(bitmap_x, bitmap_y, bitmap->width(), bitmap->height()); painter.blit(bitmap_location, bitmap, bitmap->rect()); painter.draw_rect(bitmap_outline_rect, Gfx::Color::Black); auto text_rect = row_rect; text_rect.translate_by(horizontal_padding(), -4); text_rect.set_width(text_rect.width() - horizontal_padding() * 2); auto text_alignment = index.data(GUI::ModelRole::TextAlignment).to_text_alignment(Gfx::TextAlignment::CenterLeft); draw_item_text(painter, index, is_selected_row, text_rect, String::formatted("{}", row_index + 1).value().to_byte_string(), font, text_alignment, Gfx::TextElision::None); } } void ThumbnailsListView::select_list_item(int row_index) { if (!(row_index >= 0)) return; set_selection(model()->index(row_index)); scroll_into_view(model()->index(row_index), false, true); }