Krita Source Code Documentation
Loading...
Searching...
No Matches
KisPreviewFileDialog.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2020 Halla Rempt <halla@valdyas.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7
8#include <QSplitter>
9#include <QLabel>
10#include <QFileIconProvider>
11#include <QDebug>
12#include <QToolButton>
13#include <QHBoxLayout>
14
15#include <kconfiggroup.h>
16#include <ksharedconfig.h>
17#include <klocalizedstring.h>
18#include <kis_icon_utils.h>
19
21
23 : QFileIconProvider()
24 , m_devicePixelRatioF(devicePixelRatioF)
25{
26}
27
28QIcon KisFileIconProvider::icon(const QFileIconProvider::IconType type) const
29{
30 return QFileIconProvider::icon(type);
31}
32
33QIcon KisFileIconProvider::icon(const QFileInfo &fi) const
34{
35 QIcon icon;
36 if (KisPreviewFileDialog::s_iconCreator && KisPreviewFileDialog::s_iconCreator->createFileIcon(fi.filePath(), icon, m_devicePixelRatioF, QSize(512, 512))) {
37 return icon;
38 }
39 return QFileIconProvider::icon(fi);
40}
41
42KisPreviewFileDialog::KisPreviewFileDialog(QWidget *parent, const QString &caption, const QString &directory, const QString &filter)
43 : QFileDialog(parent, caption, directory, filter)
44{
45 KConfigGroup group = KSharedConfig::openConfig()->group("KisPreviewFileDialog");
46 if (group.readEntry("show_thumbnails", false)) {
47 m_iconProvider = new KisFileIconProvider(devicePixelRatioF());
48 }
49
50 m_preview = new QLabel(i18n("Preview"), this);
51 m_preview->setAlignment(Qt::AlignCenter);
52 m_preview->setMinimumWidth(256);
53
54 m_previewToggle = new QToolButton(this);
55 m_previewToggle->setCheckable(true);
56 m_previewToggle->setChecked(group.readEntry("show_preview", true));
57 m_previewToggle->setIcon(KisIconUtils::loadIcon("preview"));
58 m_previewToggle->setToolTip(i18n("Toggle Preview"));
59 connect(m_previewToggle, SIGNAL(toggled(bool)), SLOT(previewToggled(bool)));
60
61 connect(this, SIGNAL(currentChanged(const QString&)), this, SLOT(onCurrentChanged(const QString&)));
62}
63
65{
66 QSplitter *splitter = findChild<QSplitter *>();
67 if (splitter) {
68 splitter->addWidget(m_preview);
69 resize(width() + m_preview->width(), height());
70 }
71
72 QHBoxLayout *layout = findChild<QHBoxLayout *>();
73 if (layout) {
74 layout->addWidget(m_previewToggle);
75 }
76
77 KConfigGroup group = KSharedConfig::openConfig()->group("File Dialogs");
78 if (group.readEntry("show_thumbnails", false)) {
79 setIconProvider(m_iconProvider);
80 }
81}
82
84{
85 // Generate the preview only if we're not using the native dialog.
86 // In AppImages, the platform plugins are inaccessible,
87 // so we check the existence of a widget layout instead.
88 if ((testOption(QFileDialog::DontUseNativeDialog) || layout()) && m_preview) {
89 QIcon icon;
90 if (s_iconCreator && s_iconCreator->createFileIcon(path, icon, devicePixelRatioF(), QSize(512, 512))) {
91 auto pixmap = icon.pixmap(m_preview->width(), m_preview->height());
92 pixmap.setDevicePixelRatio(devicePixelRatioF());
93 m_preview->setPixmap(pixmap);
94 }
95 else {
96 m_preview->setText(i18n("No Preview"));
97 }
98 }
99}
100
102{
103 KConfigGroup group = KSharedConfig::openConfig()->group("KisPreviewFileDialog");
104 group.writeEntry("show_preview", showPreview);
105 m_preview->setVisible(showPreview);
106}
107
108
112
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
virtual bool createFileIcon(QString path, QIcon &icon, qreal devicePixelRatioF, QSize iconSize)=0
KisFileIconProvider(qreal devicePixelRatioF)
QIcon icon(const QFileIconProvider::IconType type) const override
static KisAbstractFileIconCreator * s_iconCreator
void previewToggled(bool showPreview)
KisPreviewFileDialog(QWidget *parent=nullptr, const QString &caption=QString(), const QString &directory=QString(), const QString &filter=QString())
void onCurrentChanged(const QString &path)
KisFileIconProvider * m_iconProvider
QIcon loadIcon(const QString &name)