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 }