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 }