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