KIO

executablefileopendialog.cpp
1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2014 Arjun A.K. <arjunak234@gmail.com>
4 SPDX-FileCopyrightText: 2025 Kai Uwe Broulik <kde@broulik.de>
5
6 SPDX-License-Identifier: LGPL-2.0-or-later
7*/
8
9#include "executablefileopendialog_p.h"
10
11#include <QDialogButtonBox>
12#include <QLabel>
13#include <QMimeType>
14#include <QPushButton>
15#include <QShowEvent>
16
17#include <KApplicationTrader>
18#include <KFileItem>
19#include <KIconLoader>
20#include <KLocalizedString>
21#include <KMessageDialog>
22
23#include <KIO/PreviewJob>
24
25ExecutableFileOpenDialog::ExecutableFileOpenDialog(const QUrl &url, const QMimeType &mimeType, ExecutableFileOpenDialog::Mode mode, QWidget *parent)
26 : QDialog(parent)
27{
28 m_ui.setupUi(this);
29
30 std::optional<KFileItem> fileItem;
31
32 if (url.isValid()) {
33 fileItem = KFileItem{url, mimeType.name()};
34
35 m_ui.nameLabel->setText(fileItem->name());
36 m_ui.nameLabel->setToolTip(url.toDisplayString(QUrl::PreferLocalFile));
37 } else {
38 m_ui.nameLabel->hide();
39 }
40
41 m_ui.mimeTypeLabel->setForegroundRole(QPalette::PlaceholderText);
42 // Not using KFileItem::comment() since that also reads the Comment from the .desktop file
43 // which could spoof the user.
44 m_ui.mimeTypeLabel->setText(mimeType.comment());
45 m_ui.mimeTypeLabel->setToolTip(mimeType.name());
46
47 const QSize iconSize{KIconLoader::SizeHuge, KIconLoader::SizeHuge};
48 QIcon icon;
49
50 if (fileItem) {
51 icon = QIcon::fromTheme(fileItem->iconName());
52
53 auto *previewJob = KIO::filePreview({*fileItem}, iconSize);
54 previewJob->setDevicePixelRatio(devicePixelRatioF());
55 connect(previewJob, &KIO::PreviewJob::gotPreview, this, [this](const KFileItem &item, const QPixmap &pixmap) {
56 Q_UNUSED(item);
57 m_ui.iconLabel->setPixmap(pixmap);
58 });
59 }
60
61 if (icon.isNull()) {
62 icon = QIcon::fromTheme(mimeType.iconName());
63 }
64 if (icon.isNull()) {
65 icon = QIcon::fromTheme(QStringLiteral("unknown"));
66 }
67
68 m_ui.iconLabel->setPixmap(icon.pixmap(iconSize, devicePixelRatioF()));
69
70 connect(m_ui.buttonBox, &QDialogButtonBox::rejected, this, &ExecutableFileOpenDialog::reject);
71
72 QPushButton *launchButton = new QPushButton(i18nc("@action:button Launch script", "&Launch"), this);
73 launchButton->setIcon(QIcon::fromTheme(QStringLiteral("system-run")));
74
75 if (mode == OnlyExecute) {
76 connect(launchButton, &QPushButton::clicked, this, &ExecutableFileOpenDialog::executeFile);
77 } else if (mode == OpenAsExecute) {
78 connect(launchButton, &QPushButton::clicked, this, &ExecutableFileOpenDialog::openFile);
79 } else { // mode == OpenOrExecute
80 m_ui.label->setText(i18n("What do you wish to do with this file?"));
81 connect(launchButton, &QPushButton::clicked, this, &ExecutableFileOpenDialog::executeFile);
82
83 QPushButton *openButton = new QPushButton(QIcon::fromTheme(QStringLiteral("document-preview")), i18nc("@action:button", "&Open"), this);
85 openButton->setText(i18nc("@action:button", "&Open with %1", service->name()));
86 const QIcon serviceIcon = QIcon::fromTheme(service->icon());
87 if (!serviceIcon.isNull()) {
88 openButton->setIcon(serviceIcon);
89 }
90 }
91 m_ui.buttonBox->addButton(openButton, QDialogButtonBox::AcceptRole);
92
93 connect(openButton, &QPushButton::clicked, this, &ExecutableFileOpenDialog::openFile);
94 }
95
96 // Add Execute button last so that Open is first in the button box
97 m_ui.buttonBox->addButton(launchButton, QDialogButtonBox::AcceptRole);
98 m_ui.buttonBox->button(QDialogButtonBox::Cancel)->setFocus();
99}
100
101bool ExecutableFileOpenDialog::isDontAskAgainChecked() const
102{
103 return m_ui.dontAgainCheckBox->isChecked();
104}
105
106void ExecutableFileOpenDialog::executeFile()
107{
108 done(ExecuteFile);
109}
110
111void ExecutableFileOpenDialog::openFile()
112{
113 done(OpenFile);
114}
115
116void ExecutableFileOpenDialog::showEvent(QShowEvent *event)
117{
118 if (!event->spontaneous()) {
120 }
121 QDialog::showEvent(event);
122}
123
124#include "moc_executablefileopendialog_p.cpp"
A KFileItem is a generic class to handle a file, local or remote.
Definition kfileitem.h:36
void setDevicePixelRatio(qreal dpr)
Request preview to use the device pixel ratio dpr.
void gotPreview(const KFileItem &item, const QPixmap &preview)
Emitted when a thumbnail picture for item has been successfully retrieved.
static void beep(KMessageDialog::Type type, const QString &text=QString(), QWidget *dialog=nullptr)
QExplicitlySharedDataPointer< KService > Ptr
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
AKONADI_CALENDAR_EXPORT KCalendarCore::Event::Ptr event(const Akonadi::Item &item)
KSERVICE_EXPORT KService::Ptr preferredService(const QString &mimeType)
KCALUTILS_EXPORT QString mimeType()
KIOGUI_EXPORT PreviewJob * filePreview(const KFileItemList &items, const QSize &size, const QStringList *enabledPlugins=nullptr)
Creates a PreviewJob to generate a preview image for the given items.
void clicked(bool checked)
void setIcon(const QIcon &icon)
void setText(const QString &text)
virtual void showEvent(QShowEvent *event) override
QIcon fromTheme(const QString &name)
bool isNull() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
PreferLocalFile
bool isValid() const const
QString toDisplayString(FormattingOptions options) const const
void setupUi(QWidget *widget)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri May 2 2025 12:02:24 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.