KIO

kencodingfiledialog.cpp
1// -*- c++ -*-
2/*
3 This file is part of the KDE libraries
4 SPDX-FileCopyrightText: 2003 Joseph Wenninger <jowenn@kde.org>
5 SPDX-FileCopyrightText: 2003 Andras Mantia <amantia@freemail.hu>
6 SPDX-FileCopyrightText: 2013 Teo Mrnjavac <teo@kde.org>
7
8 SPDX-License-Identifier: LGPL-2.0-or-later
9*/
10
11#include "kencodingfiledialog.h"
12
13#include "kfilewidget.h"
14
15#include <defaults-kfile.h>
16
17#include <KConfigGroup>
18#include <KLocalizedString>
19#include <KSharedConfig>
20#include <KWindowConfig>
21#include <krecentdocument.h>
22
23#include <QBoxLayout>
24#include <QComboBox>
25#include <QPushButton>
26#include <QStringDecoder>
27
28struct KEncodingFileDialogPrivate {
29 KEncodingFileDialogPrivate()
30 : cfgGroup(KSharedConfig::openConfig(), ConfigGroup)
31 {
32 }
33
34 QComboBox *encoding;
35 KFileWidget *w;
36 KConfigGroup cfgGroup;
37};
38
39KEncodingFileDialog::KEncodingFileDialog(const QUrl &startDir,
40 const QString &encoding,
41 const QString &filter,
42 const QString &title,
44 QWidget *parent)
45 : QDialog(parent, Qt::Dialog)
46 , d(new KEncodingFileDialogPrivate)
47{
48 d->w = new KFileWidget(startDir, this);
49 d->w->setFilters(KFileFilter::fromFilterString(filter));
50 if (type == QFileDialog::AcceptOpen) {
51 d->w->setOperationMode(KFileWidget::Opening);
52 } else {
53 d->w->setOperationMode(KFileWidget::Saving);
54 }
55
56 setWindowTitle(title);
57 // ops->clearHistory();
58
60
61 QBoxLayout *mainLayout = new QVBoxLayout(this);
62 mainLayout->addWidget(d->w);
63
64 d->w->okButton()->show();
65 connect(d->w->okButton(), &QAbstractButton::clicked, this, &KEncodingFileDialog::slotOk);
66 d->w->cancelButton()->show();
67 connect(d->w->cancelButton(), &QAbstractButton::clicked, this, &KEncodingFileDialog::slotCancel);
68 connect(d->w, &KFileWidget::accepted, this, &KEncodingFileDialog::accept);
69
70 d->encoding = new QComboBox(this);
71 d->w->setCustomWidget(i18n("Encoding:"), d->encoding);
72
73 d->encoding->clear();
74 QByteArray sEncoding = encoding.toUtf8();
75 const auto systemEncoding = QStringDecoder(QStringDecoder::System).name();
76 if (sEncoding.isEmpty() || sEncoding == "System") {
77 sEncoding = systemEncoding;
78 }
79
80 auto encodings = QStringDecoder::availableCodecs();
81 std::sort(encodings.begin(), encodings.end(), [](auto &a, auto &b) {
82 return (a.compare(b, Qt::CaseInsensitive) < 0);
83 });
84
85 int insert = 0;
86 int system = 0;
87 bool foundRequested = false;
88 for (const auto &encoding : encodings) {
89 d->encoding->addItem(encoding);
90 const auto codecName = QStringDecoder(encoding.toUtf8().constData()).name();
91 if ((codecName == sEncoding) || (encoding.toUtf8() == sEncoding)) {
92 d->encoding->setCurrentIndex(insert);
93 foundRequested = true;
94 }
95
96 if ((codecName == systemEncoding) || (encoding.toUtf8() == systemEncoding)) {
97 system = insert;
98 }
99 insert++;
100 }
101
102 if (!foundRequested) {
103 d->encoding->setCurrentIndex(system);
104 }
105}
106
107KEncodingFileDialog::~KEncodingFileDialog() = default;
108
109QString KEncodingFileDialog::selectedEncoding() const
110{
111 if (d->encoding) {
112 return d->encoding->currentText();
113 } else {
114 return QString();
115 }
116}
117
118KEncodingFileDialog::Result
119KEncodingFileDialog::getOpenFileNameAndEncoding(const QString &encoding, const QUrl &startDir, const QString &filter, QWidget *parent, const QString &title)
120{
121 KEncodingFileDialog dlg(startDir, encoding, filter, title.isNull() ? i18n("Open") : title, QFileDialog::AcceptOpen, parent);
122
123 dlg.d->w->setMode(KFile::File | KFile::LocalOnly);
124 dlg.exec();
125
126 Result res;
127 res.fileNames << dlg.d->w->selectedFile();
128 res.encoding = dlg.selectedEncoding();
129 return res;
130}
131
132KEncodingFileDialog::Result
133KEncodingFileDialog::getOpenFileNamesAndEncoding(const QString &encoding, const QUrl &startDir, const QString &filter, QWidget *parent, const QString &title)
134{
135 KEncodingFileDialog dlg(startDir, encoding, filter, title.isNull() ? i18n("Open") : title, QFileDialog::AcceptOpen, parent);
136 dlg.d->w->setMode(KFile::Files | KFile::LocalOnly);
137 dlg.exec();
138
139 Result res;
140 res.fileNames = dlg.d->w->selectedFiles();
141 res.encoding = dlg.selectedEncoding();
142 return res;
143}
144
145KEncodingFileDialog::Result
146KEncodingFileDialog::getOpenUrlAndEncoding(const QString &encoding, const QUrl &startDir, const QString &filter, QWidget *parent, const QString &title)
147{
148 KEncodingFileDialog dlg(startDir, encoding, filter, title.isNull() ? i18n("Open") : title, QFileDialog::AcceptOpen, parent);
149
150 dlg.d->w->setMode(KFile::File);
151 dlg.exec();
152
153 Result res;
154 res.URLs << dlg.d->w->selectedUrl();
155 res.encoding = dlg.selectedEncoding();
156 return res;
157}
158
159KEncodingFileDialog::Result
160KEncodingFileDialog::getOpenUrlsAndEncoding(const QString &encoding, const QUrl &startDir, const QString &filter, QWidget *parent, const QString &title)
161{
162 KEncodingFileDialog dlg(startDir, encoding, filter, title.isNull() ? i18n("Open") : title, QFileDialog::AcceptOpen, parent);
163
164 dlg.d->w->setMode(KFile::Files);
165 dlg.exec();
166
167 Result res;
168 res.URLs = dlg.d->w->selectedUrls();
169 res.encoding = dlg.selectedEncoding();
170 return res;
171}
172
173KEncodingFileDialog::Result
174KEncodingFileDialog::getSaveFileNameAndEncoding(const QString &encoding, const QUrl &dir, const QString &filter, QWidget *parent, const QString &title)
175{
176 KEncodingFileDialog dlg(dir, encoding, filter, title.isNull() ? i18n("Save As") : title, QFileDialog::AcceptSave, parent);
177 dlg.d->w->setMode(KFile::File);
178 dlg.exec();
179
180 QString filename = dlg.d->w->selectedFile();
181 if (!filename.isEmpty()) {
183 }
184
185 Result res;
186 res.fileNames << filename;
187 res.encoding = dlg.selectedEncoding();
188 return res;
189}
190
191KEncodingFileDialog::Result
192KEncodingFileDialog::getSaveUrlAndEncoding(const QString &encoding, const QUrl &dir, const QString &filter, QWidget *parent, const QString &title)
193{
194 KEncodingFileDialog dlg(dir, encoding, filter, title.isNull() ? i18n("Save As") : title, QFileDialog::AcceptSave, parent);
195 dlg.d->w->setMode(KFile::File);
196
197 Result res;
198 if (dlg.exec() == QDialog::Accepted) {
199 QUrl url = dlg.d->w->selectedUrl();
200 if (url.isValid()) {
202 }
203 res.URLs << url;
204 res.encoding = dlg.selectedEncoding();
205 }
206 return res;
207}
208
209QSize KEncodingFileDialog::sizeHint() const
210{
211 return d->w->dialogSizeHint();
212}
213
214void KEncodingFileDialog::hideEvent(QHideEvent *e)
215{
217
219}
220
221void KEncodingFileDialog::accept()
222{
223 d->w->accept();
225}
226
227void KEncodingFileDialog::slotOk()
228{
229 d->w->slotOk();
230}
231
232void KEncodingFileDialog::slotCancel()
233{
234 d->w->slotCancel();
235 reject();
236}
237
238#include "moc_kencodingfiledialog.cpp"
static KIOFILEWIDGETS_EXPORT Result getOpenFileNamesAndEncoding(const QString &encoding=QString(), const QUrl &startDir=QUrl(), const QString &filter=QString(), QWidget *parent=nullptr, const QString &title=QString())
Creates a modal file dialog and returns the selected encoding and the selected filenames or an empty ...
static KIOFILEWIDGETS_EXPORT Result getOpenUrlAndEncoding(const QString &encoding=QString(), const QUrl &startDir=QUrl(), const QString &filter=QString(), QWidget *parent=nullptr, const QString &title=QString())
Creates a modal file dialog and returns the selected encoding and URL or an empty string if none was ...
static KIOFILEWIDGETS_EXPORT Result getOpenFileNameAndEncoding(const QString &encoding=QString(), const QUrl &startDir=QUrl(), const QString &filter=QString(), QWidget *parent=nullptr, const QString &title=QString())
Creates a modal file dialog and return the selected filename or an empty string if none was chosen ad...
static KIOFILEWIDGETS_EXPORT Result getOpenUrlsAndEncoding(const QString &encoding=QString(), const QUrl &startDir=QUrl(), const QString &filter=QString(), QWidget *parent=nullptr, const QString &title=QString())
Creates a modal file dialog and returns the selected encoding URLs or an empty list if none was chose...
static KIOFILEWIDGETS_EXPORT Result getSaveUrlAndEncoding(const QString &encoding=QString(), const QUrl &startDir=QUrl(), const QString &filter=QString(), QWidget *parent=nullptr, const QString &title=QString())
Creates a modal file dialog and returns the selected encoding and filename or an empty string if none...
static KIOFILEWIDGETS_EXPORT Result getSaveFileNameAndEncoding(const QString &encoding=QString(), const QUrl &startDir=QUrl(), const QString &filter=QString(), QWidget *parent=nullptr, const QString &title=QString())
Creates a modal file dialog and returns the selected encoding and filename or an empty string if none...
File selector widget.
Definition kfilewidget.h:49
void accepted()
Emitted by slotOk() (directly or asynchronously) once everything has been done.
static void add(const QUrl &url)
Add a new item to the Recent Document menu.
QString i18n(const char *text, const TYPE &arg...)
QWindow * windowHandle(QObject *job)
KGuiItem insert()
KCONFIGGUI_EXPORT void saveWindowSize(const QWindow *window, KConfigGroup &config, KConfigGroup::WriteConfigFlags options=KConfigGroup::Normal)
KCONFIGGUI_EXPORT void restoreWindowSize(QWindow *window, const KConfigGroup &config)
void clicked(bool checked)
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
const char * constData() const const
bool isEmpty() const const
virtual void accept()
virtual int exec()
virtual void reject()
QObject * parent() const const
bool isEmpty() const const
bool isNull() const const
QByteArray toUtf8() const const
const char * name() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QUrl fromLocalFile(const QString &localFile)
bool isValid() const const
QWidget(QWidget *parent, Qt::WindowFlags f)
virtual void hideEvent(QHideEvent *event)
QWindow * windowHandle() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 11 2025 11:51:43 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.