File indexing completed on 2025-02-02 04:11:30

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "search_result.hpp"
0008 #include <QVBoxLayout>
0009 #include <QHBoxLayout>
0010 #include <QLabel>
0011 #include <QSpacerItem>
0012 #include <QIcon>
0013 #include <QPushButton>
0014 #include <QToolButton>
0015 #include <QDesktopServices>
0016 #include <QPainter>
0017 #include <KLocalizedString>
0018 
0019 glaxnimate::gui::LottieFilesResultItem::LottieFilesResultItem(LottieFilesResult res, QWidget* parent)
0020 : QWidget(parent), data(std::move(res))
0021 {
0022     QVBoxLayout* lay = new QVBoxLayout(this);
0023 
0024     QLabel* name = new QLabel(data.name, this);
0025     name->setAlignment(Qt::AlignCenter);
0026     name->setWordWrap(true);
0027     name->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred);
0028     QFont name_font = name->font();
0029     name_font.setBold(true);
0030     name->setFont(name_font);
0031     lay->addWidget(name);
0032 
0033     QLabel* by = new QLabel(i18n("by %1", data.author_username), this);
0034     by->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
0035     by->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred);
0036     QFont by_font = by->font();
0037     by_font.setPointSizeF(by_font.pointSizeF() * 0.6);
0038     by->setFont(by_font);
0039     lay->addWidget(by);
0040 
0041     spacer = new QSpacerItem(image_size.width(), image_size.height(), QSizePolicy::Preferred, QSizePolicy::Preferred);
0042     lay->addItem(spacer);
0043 
0044     auto stats = new QHBoxLayout();
0045     lay->addLayout(stats);
0046 
0047     auto likes_icon = new QLabel(this);
0048     likes_icon->setPixmap(QIcon::fromTheme("emblem-favorite-symbolic").pixmap(32));
0049     likes_icon->setToolTip(i18n("Likes"));
0050     stats->addWidget(likes_icon);
0051     auto likes_num = new QLabel(QString::number(data.likes), this);
0052     stats->addWidget(likes_num);
0053 
0054     stats->addSpacerItem(new QSpacerItem(1, 0, QSizePolicy::Expanding));
0055 
0056     auto comments_icon = new QLabel(this);
0057     comments_icon->setPixmap(QIcon::fromTheme("comment-symbolic").pixmap(32));
0058     comments_icon->setToolTip(i18n("Comments"));
0059     stats->addWidget(comments_icon);
0060     auto comments_num = new QLabel(QString::number(data.comments), this);
0061     stats->addWidget(comments_num);
0062 
0063     auto buttons = new QHBoxLayout();
0064     lay->addLayout(buttons);
0065 
0066     auto view = new QToolButton(this);
0067     view->setText(i18n("View on LottieFiles..."));
0068     view->setToolTip(view->text());
0069     view->setIcon(QIcon::fromTheme("internet-web-browser"));
0070     buttons->addWidget(view);
0071     connect(view, &QToolButton::clicked, this, [this]{QDesktopServices::openUrl(data.url);});
0072 
0073     auto open = new QToolButton(this);
0074     open->setText(i18n("Open"));
0075     open->setToolTip(open->text());
0076     open->setIcon(QIcon::fromTheme("document-open"));
0077     buttons->addWidget(open);
0078     connect(open, &QToolButton::clicked, this, [this]{Q_EMIT selected_open(data.name, data.lottie);});
0079 
0080     auto import = new QToolButton(this);
0081     import->setText(i18n("Import"));
0082     import->setToolTip(import->text());
0083     import->setIcon(QIcon::fromTheme("document-import"));
0084     buttons->addWidget(import);
0085     connect(import, &QToolButton::clicked, this, [this]{Q_EMIT selected_import(data.name, data.lottie);});
0086 
0087     preview = QIcon::fromTheme("application-x-partial-download").pixmap(image_size).toImage();
0088 
0089     setFocusPolicy(Qt::ClickFocus);
0090 }
0091 
0092 void glaxnimate::gui::LottieFilesResultItem::set_image_size(const QSize& size)
0093 {
0094     image_size = size;
0095     spacer->changeSize(size.width(), size.height(), QSizePolicy::Fixed, QSizePolicy::Fixed);
0096 }
0097 
0098 void glaxnimate::gui::LottieFilesResultItem::mousePressEvent(QMouseEvent* event)
0099 {
0100     QWidget::mousePressEvent(event);
0101 
0102     Q_EMIT selected(data.name, data.lottie);
0103 }
0104 
0105 void glaxnimate::gui::LottieFilesResultItem::mouseDoubleClickEvent(QMouseEvent* event)
0106 {
0107     QWidget::mouseDoubleClickEvent(event);
0108 
0109     Q_EMIT selected_import(data.name, data.lottie);
0110 }
0111 
0112 void glaxnimate::gui::LottieFilesResultItem::paintEvent(QPaintEvent*)
0113 {
0114     auto bg = hasFocus() ? this->palette().highlight() : QBrush(Qt::NoBrush);
0115     QPainter painter(this);
0116     painter.fillRect(QRect(QPoint(0, 0), size()), bg);
0117 
0118     QRectF area = spacer->geometry();
0119 
0120     if ( preview.width() == 0 || preview.height() == 0 || area.width() == 0 || area.height() == 0 )
0121         return;
0122 
0123     qreal scalex = qreal(area.width()) / preview.width();
0124     qreal scaley = qreal(area.height()) / preview.height();
0125     qreal scale = qMin(scalex, scaley);
0126     QSizeF target_size{
0127         preview.width() * scale,
0128         preview.height() * scale
0129     };
0130     QRectF target(
0131         QPointF{
0132             area.center().x() - target_size.width() / 2,
0133             area.center().y() - target_size.height() / 2,
0134         },
0135         target_size
0136     );
0137     painter.drawImage(target, preview);
0138 }
0139