File indexing completed on 2024-05-12 05:37:08

0001 /*
0002     SPDX-FileCopyrightText: 2016 Kai Uwe Broulik <kde@privat.broulik.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "thumbnailer.h"
0008 
0009 #include <KIO/PreviewJob>
0010 
0011 #include <QApplication>
0012 #include <QClipboard>
0013 #include <QIcon>
0014 #include <QMenu>
0015 #include <QMimeData>
0016 #include <QQuickItem>
0017 #include <QQuickWindow>
0018 #include <QTimer>
0019 
0020 #include <KConfigGroup>
0021 #include <KFileItemListProperties>
0022 #include <KLocalizedString>
0023 #include <KPropertiesDialog>
0024 #include <KSharedConfig>
0025 #include <KUrlMimeData>
0026 
0027 #include <KIO/OpenFileManagerWindowJob>
0028 
0029 using namespace Qt::StringLiterals;
0030 
0031 Thumbnailer::Thumbnailer(QObject *parent)
0032     : QObject(parent)
0033 {
0034 }
0035 
0036 Thumbnailer::~Thumbnailer() = default;
0037 
0038 void Thumbnailer::classBegin()
0039 {
0040 }
0041 
0042 void Thumbnailer::componentComplete()
0043 {
0044     m_inited = true;
0045     generatePreview();
0046 }
0047 
0048 QUrl Thumbnailer::url() const
0049 {
0050     return m_url;
0051 }
0052 
0053 void Thumbnailer::setUrl(const QUrl &url)
0054 {
0055     if (m_url != url) {
0056         m_url = url;
0057         Q_EMIT urlChanged();
0058 
0059         generatePreview();
0060     }
0061 }
0062 
0063 QSize Thumbnailer::size() const
0064 {
0065     return m_size;
0066 }
0067 
0068 void Thumbnailer::setSize(const QSize &size)
0069 {
0070     if (m_size != size) {
0071         m_size = size;
0072         Q_EMIT sizeChanged();
0073 
0074         generatePreview();
0075     }
0076 }
0077 
0078 bool Thumbnailer::busy() const
0079 {
0080     return m_busy;
0081 }
0082 
0083 bool Thumbnailer::hasPreview() const
0084 {
0085     return !m_pixmap.isNull();
0086 }
0087 
0088 QPixmap Thumbnailer::pixmap() const
0089 {
0090     return m_pixmap;
0091 }
0092 
0093 QSize Thumbnailer::pixmapSize() const
0094 {
0095     return m_pixmap.size();
0096 }
0097 
0098 QString Thumbnailer::iconName() const
0099 {
0100     return m_iconName;
0101 }
0102 
0103 bool Thumbnailer::menuVisible() const
0104 {
0105     return m_menuVisible;
0106 }
0107 
0108 void Thumbnailer::generatePreview()
0109 {
0110     if (!m_inited) {
0111         return;
0112     }
0113 
0114     if (!m_url.isValid() || !m_url.isLocalFile() || !m_size.isValid() || m_size.isEmpty()) {
0115         return;
0116     }
0117 
0118     auto maxSize = qMax(m_size.width(), m_size.height());
0119 
0120     KConfigGroup previewSettings(KSharedConfig::openConfig(QStringLiteral("dolphinrc")), u"PreviewSettings"_s);
0121     const QStringList enabledPlugins = previewSettings.readEntry("Plugins", KIO::PreviewJob::defaultPlugins());
0122 
0123     KIO::PreviewJob *job = KIO::filePreview(KFileItemList({KFileItem(m_url)}), QSize(maxSize, maxSize), &enabledPlugins);
0124     job->setScaleType(KIO::PreviewJob::Scaled);
0125     job->setIgnoreMaximumSize(true);
0126 
0127     connect(job, &KIO::PreviewJob::gotPreview, this, [this](const KFileItem &item, const QPixmap &preview) {
0128         Q_UNUSED(item);
0129         m_pixmap = preview;
0130         Q_EMIT pixmapChanged();
0131 
0132         if (!m_iconName.isEmpty()) {
0133             m_iconName.clear();
0134             Q_EMIT iconNameChanged();
0135         }
0136     });
0137 
0138     connect(job, &KIO::PreviewJob::failed, this, [this](const KFileItem &item) {
0139         m_pixmap = QPixmap();
0140         Q_EMIT pixmapChanged();
0141 
0142         const QString &iconName = item.determineMimeType().iconName();
0143         if (m_iconName != iconName) {
0144             m_iconName = iconName;
0145             Q_EMIT iconNameChanged();
0146         }
0147     });
0148 
0149     connect(job, &KJob::result, this, [this] {
0150         m_busy = false;
0151         Q_EMIT busyChanged();
0152     });
0153 
0154     m_busy = true;
0155     Q_EMIT busyChanged();
0156 
0157     job->start();
0158 }