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 }