File indexing completed on 2024-05-12 16:02:29
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Halla Rempt <halla@valdyas.org> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #include "KisPreviewFileDialog.h" 0007 0008 #include <QSplitter> 0009 #include <QLabel> 0010 #include <QFileIconProvider> 0011 #include <QDebug> 0012 #include <QToolButton> 0013 #include <QHBoxLayout> 0014 0015 #include <kconfiggroup.h> 0016 #include <ksharedconfig.h> 0017 #include <klocalizedstring.h> 0018 #include <kis_icon_utils.h> 0019 0020 KisAbstractFileIconCreator *KisPreviewFileDialog::s_iconCreator {0}; 0021 0022 KisFileIconProvider::KisFileIconProvider(qreal devicePixelRatioF) 0023 : QFileIconProvider() 0024 , m_devicePixelRatioF(devicePixelRatioF) 0025 { 0026 } 0027 0028 QIcon KisFileIconProvider::icon(const QFileIconProvider::IconType type) const 0029 { 0030 return QFileIconProvider::icon(type); 0031 } 0032 0033 QIcon KisFileIconProvider::icon(const QFileInfo &fi) const 0034 { 0035 QIcon icon; 0036 if (KisPreviewFileDialog::s_iconCreator && KisPreviewFileDialog::s_iconCreator->createFileIcon(fi.filePath(), icon, m_devicePixelRatioF, QSize(512, 512))) { 0037 return icon; 0038 } 0039 return QFileIconProvider::icon(fi.path()); 0040 } 0041 0042 KisPreviewFileDialog::KisPreviewFileDialog(QWidget *parent, const QString &caption, const QString &directory, const QString &filter) 0043 : QFileDialog(parent, caption, directory, filter) 0044 { 0045 KConfigGroup group = KSharedConfig::openConfig()->group("KisPreviewFileDialog"); 0046 if (group.readEntry("show_thumbnails", false)) { 0047 m_iconProvider = new KisFileIconProvider(devicePixelRatioF()); 0048 } 0049 0050 m_preview = new QLabel(i18n("Preview"), this); 0051 m_preview->setAlignment(Qt::AlignCenter); 0052 m_preview->setMinimumWidth(256); 0053 0054 m_previewToggle = new QToolButton(this); 0055 m_previewToggle->setCheckable(true); 0056 m_previewToggle->setChecked(group.readEntry("show_preview", true)); 0057 m_previewToggle->setIcon(KisIconUtils::loadIcon("preview")); 0058 m_previewToggle->setToolTip(i18n("Toggle Preview")); 0059 connect(m_previewToggle, SIGNAL(toggled(bool)), SLOT(previewToggled(bool))); 0060 0061 connect(this, SIGNAL(currentChanged(const QString&)), this, SLOT(onCurrentChanged(const QString&))); 0062 } 0063 0064 void KisPreviewFileDialog::resetIconProvider() 0065 { 0066 QSplitter *splitter = findChild<QSplitter *>(); 0067 if (splitter) { 0068 splitter->addWidget(m_preview); 0069 resize(width() + m_preview->width(), height()); 0070 } 0071 0072 QHBoxLayout *layout = findChild<QHBoxLayout *>(); 0073 if (layout) { 0074 layout->addWidget(m_previewToggle); 0075 } 0076 0077 KConfigGroup group = KSharedConfig::openConfig()->group("File Dialogs"); 0078 if (group.readEntry("show_thumbnails", false)) { 0079 setIconProvider(m_iconProvider); 0080 } 0081 } 0082 0083 void KisPreviewFileDialog::onCurrentChanged(const QString &path) 0084 { 0085 // Generate the preview only if we're not using the native dialog. 0086 // In AppImages, the platform plugins are inaccessible, 0087 // so we check the existance of a widget layout instead. 0088 if ((testOption(QFileDialog::DontUseNativeDialog) || layout()) && m_preview) { 0089 QIcon icon; 0090 if (s_iconCreator && s_iconCreator->createFileIcon(path, icon, devicePixelRatioF(), QSize(512, 512))) { 0091 auto pixmap = icon.pixmap(m_preview->width(), m_preview->height()); 0092 pixmap.setDevicePixelRatio(devicePixelRatioF()); 0093 m_preview->setPixmap(pixmap); 0094 } 0095 else { 0096 m_preview->setText(i18n("No Preview")); 0097 } 0098 } 0099 } 0100 0101 void KisPreviewFileDialog::previewToggled(bool showPreview) 0102 { 0103 KConfigGroup group = KSharedConfig::openConfig()->group("KisPreviewFileDialog"); 0104 group.writeEntry("show_preview", showPreview); 0105 m_preview->setVisible(showPreview); 0106 } 0107 0108 0109 KisAbstractFileIconCreator::KisAbstractFileIconCreator() 0110 { 0111 } 0112 0113 KisAbstractFileIconCreator::~KisAbstractFileIconCreator() 0114 { 0115 }