File indexing completed on 2024-05-12 17:07:44

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 "notificationthumbnailer.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 <KProtocolManager>
0025 #include <KSharedConfig>
0026 #include <KUrlMimeData>
0027 
0028 #include <KIO/OpenFileManagerWindowJob>
0029 
0030 NotificationThumbnailer::NotificationThumbnailer(QObject *parent)
0031     : QObject(parent)
0032 {
0033 }
0034 
0035 NotificationThumbnailer::~NotificationThumbnailer() = default;
0036 
0037 void NotificationThumbnailer::classBegin()
0038 {
0039 }
0040 
0041 void NotificationThumbnailer::componentComplete()
0042 {
0043     m_inited = true;
0044     generatePreview();
0045 }
0046 
0047 QUrl NotificationThumbnailer::url() const
0048 {
0049     return m_url;
0050 }
0051 
0052 void NotificationThumbnailer::setUrl(const QUrl &url)
0053 {
0054     if (m_url != url) {
0055         m_url = url;
0056         Q_EMIT urlChanged();
0057 
0058         generatePreview();
0059     }
0060 }
0061 
0062 QSize NotificationThumbnailer::size() const
0063 {
0064     return m_size;
0065 }
0066 
0067 void NotificationThumbnailer::setSize(const QSize &size)
0068 {
0069     if (m_size != size) {
0070         m_size = size;
0071         Q_EMIT sizeChanged();
0072 
0073         generatePreview();
0074     }
0075 }
0076 
0077 bool NotificationThumbnailer::busy() const
0078 {
0079     return m_busy;
0080 }
0081 
0082 bool NotificationThumbnailer::hasPreview() const
0083 {
0084     return !m_pixmap.isNull();
0085 }
0086 
0087 QPixmap NotificationThumbnailer::pixmap() const
0088 {
0089     return m_pixmap;
0090 }
0091 
0092 QSize NotificationThumbnailer::pixmapSize() const
0093 {
0094     return m_pixmap.size();
0095 }
0096 
0097 QString NotificationThumbnailer::iconName() const
0098 {
0099     return m_iconName;
0100 }
0101 
0102 bool NotificationThumbnailer::menuVisible() const
0103 {
0104     return m_menuVisible;
0105 }
0106 
0107 void NotificationThumbnailer::generatePreview()
0108 {
0109     if (!m_inited) {
0110         return;
0111     }
0112 
0113     if (!m_url.isValid() || !m_url.isLocalFile() || !m_size.isValid() || m_size.isEmpty()) {
0114         return;
0115     }
0116 
0117     auto maxSize = qMax(m_size.width(), m_size.height());
0118 
0119     KConfigGroup previewSettings(KSharedConfig::openConfig(QStringLiteral("dolphinrc")), "PreviewSettings");
0120     const QStringList enabledPlugins = previewSettings.readEntry("Plugins", KIO::PreviewJob::defaultPlugins());
0121 
0122     KIO::PreviewJob *job = KIO::filePreview(KFileItemList({KFileItem(m_url)}), QSize(maxSize, maxSize), &enabledPlugins);
0123     job->setScaleType(KIO::PreviewJob::Scaled);
0124     job->setIgnoreMaximumSize(true);
0125 
0126     connect(job, &KIO::PreviewJob::gotPreview, this, [this](const KFileItem &item, const QPixmap &preview) {
0127         Q_UNUSED(item);
0128         m_pixmap = preview;
0129         Q_EMIT pixmapChanged();
0130 
0131         if (!m_iconName.isEmpty()) {
0132             m_iconName.clear();
0133             Q_EMIT iconNameChanged();
0134         }
0135     });
0136 
0137     connect(job, &KIO::PreviewJob::failed, this, [this](const KFileItem &item) {
0138         m_pixmap = QPixmap();
0139         Q_EMIT pixmapChanged();
0140 
0141         const QString &iconName = item.determineMimeType().iconName();
0142         if (m_iconName != iconName) {
0143             m_iconName = iconName;
0144             Q_EMIT iconNameChanged();
0145         }
0146     });
0147 
0148     connect(job, &KJob::result, this, [this] {
0149         m_busy = false;
0150         Q_EMIT busyChanged();
0151     });
0152 
0153     m_busy = true;
0154     Q_EMIT busyChanged();
0155 
0156     job->start();
0157 }