Newer
Older
minerva / Userland / Applications / PDFViewer / ThumbnailsListView.cpp
@minerva minerva on 13 Jul 2 KB Initial commit
/*
 * Copyright (c) 2024, the SerenityOS developers.
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include "ThumbnailsListView.h"
#include "PDFViewerWidget.h"
#include <LibGUI/ModelRole.h>
#include <LibGUI/Window.h>
#include <LibGfx/Color.h>
#include <LibGfx/Palette.h>

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<Gfx::Bitmap> bitmap = data.as_bitmap();
        if (bitmap->width() == 1) {
            auto pdf_viewer_widget = static_cast<PDFViewerWidget*>(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);
}