/*
 * Copyright (C) 2009, Shawn Rutledge <shawn.t.rutledge@gmail.com>
 * Copyright (C) 2009, Pino Toscano <pino@kde.org>
 * Copyright (C) 2020, Albert Astals Cid <aacid@kde.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 */

#include "thumbnails.h"

#include <poppler-qt5.h>

#include <QtWidgets/QListWidget>

static const int PageRole = Qt::UserRole + 1;

ThumbnailsDock::ThumbnailsDock(QWidget *parent) : AbstractInfoDock(parent)
{
    m_list = new QListWidget(this);
    setWidget(m_list);
    setWindowTitle(tr("Thumbnails"));
    m_list->setViewMode(QListView::ListMode);
    m_list->setMovement(QListView::Static);
    m_list->setVerticalScrollMode(QListView::ScrollPerPixel);
    connect(m_list, &QListWidget::itemActivated, this, &ThumbnailsDock::slotItemActivated);
}

ThumbnailsDock::~ThumbnailsDock() { }

void ThumbnailsDock::fillInfo()
{
    const int num = document()->numPages();
    QSize maxSize;
    for (int i = 0; i < num; ++i) {
        const Poppler::Page *page = document()->page(i);
        const QImage image = page ? page->thumbnail() : QImage();
        if (!image.isNull()) {
            QListWidgetItem *item = new QListWidgetItem();
            item->setText(QString::number(i + 1));
            item->setData(Qt::DecorationRole, QPixmap::fromImage(image));
            item->setData(PageRole, i);
            m_list->addItem(item);
            maxSize.setWidth(qMax(maxSize.width(), image.width()));
            maxSize.setHeight(qMax(maxSize.height(), image.height()));
        }
        delete page;
    }
    if (num > 0) {
        m_list->setGridSize(maxSize);
        m_list->setIconSize(maxSize);
    }
}

void ThumbnailsDock::documentClosed()
{
    m_list->clear();
    AbstractInfoDock::documentClosed();
}

void ThumbnailsDock::slotItemActivated(QListWidgetItem *item)
{
    if (!item) {
        return;
    }

    setPage(item->data(PageRole).toInt());
}
