1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
/*
SPDX-FileCopyrightText: 2020-2026 Laurent Montel <montel@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "savefileutils.h"
#include "textaddonswidgets_debug.h"
#include <KLocalizedString>
#include <KMessageBox>
#include <KRecentDirs>
#include <QFileDialog>
#include <QMimeDatabase>
#include <QStandardPaths>
#include <QUrl>
#include <KFileWidget>
using namespace Qt::Literals::StringLiterals;
using namespace TextAddonsWidgets;
QString SaveFileUtils::querySaveFileName(QWidget *parent, const QString &title, const QUrl &fileToSave)
{
QString fileClass;
const QUrl startUrl = KFileWidget::getStartUrl(QUrl(u"kfiledialog:///saveattachment"_s), fileClass);
const auto info = QFileInfo(fileToSave.path());
auto fileName = info.fileName();
if (fileToSave.isLocalFile() && info.exists() && info.suffix().isEmpty()) {
// guess a proper file suffix if none is given
[&]() {
QFile file(info.absoluteFilePath());
if (!file.open(QIODevice::ReadOnly)) {
return;
}
const QMimeDatabase mimeDb;
const auto mime = mimeDb.mimeTypeForFileNameAndData(fileName, &file);
if (!mime.isValid()) {
return;
}
const auto suffix = mime.preferredSuffix();
if (!suffix.isEmpty()) {
fileName += u'.' + suffix;
}
}();
}
QUrl localUrl;
localUrl.setPath(startUrl.path() + u'/' + fileName);
const QString fileStr = QFileDialog::getSaveFileName(parent, title, localUrl.toString());
if (!fileClass.isEmpty() && !fileStr.isEmpty()) {
KRecentDirs::add(fileClass, fileStr);
}
return fileStr;
}
void SaveFileUtils::saveFile(QWidget *parentWidget, const QString &filePath, const QString &title)
{
const auto file = SaveFileUtils::querySaveFileName(parentWidget, title, QUrl::fromLocalFile(filePath));
if (!file.isEmpty()) {
if (QFile::exists(file) && !QFile::remove(file)) { // copy() doesn't overwrite
qCWarning(TEXTADDONSWIDGETS_LOG) << "Impossible to remove : " << file;
}
QFile sourceFile(filePath);
if (!sourceFile.copy(file)) {
KMessageBox::error(parentWidget, sourceFile.errorString(), i18nc("@title:window", "Error saving file"));
}
}
}
|