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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
#include "systemfiledialog.h"
#include <QFileInfo>
#include <QFileDialog>
#include <QStandardPaths>
#include "preferences.h"
SystemFileDialog::SystemFileDialog():
QObject(),
m_dialog(nullptr)
{}
SystemFileDialog::~SystemFileDialog()
{
if(m_dialog) {
m_dialog->deleteLater();
}
}
void SystemFileDialog::beginOpenFiles(StandardLocation openLocation, const QStringList &nameFilters)
{
beginOpen(openLocation, QFileDialog::AcceptOpen, QFileDialog::ExistingFiles, nameFilters);
}
void SystemFileDialog::beginOpenFile(StandardLocation openLocation, const QStringList &nameFilters)
{
beginOpen(openLocation, QFileDialog::AcceptOpen, QFileDialog::ExistingFile, nameFilters);
}
void SystemFileDialog::beginOpenDir(StandardLocation openLocation)
{
beginOpen(openLocation, QFileDialog::AcceptOpen, QFileDialog::Directory);
}
void SystemFileDialog::beginSaveFile(StandardLocation openLocation, const QStringList &nameFilters, const QString &defaultFileName)
{
beginOpen(openLocation, QFileDialog::AcceptSave, QFileDialog::AnyFile, nameFilters, defaultFileName);
}
void SystemFileDialog::beginSaveDir(StandardLocation openLocation)
{
beginOpen(openLocation, QFileDialog::AcceptOpen, QFileDialog::Directory);
}
void SystemFileDialog::close()
{
if(m_dialog && m_dialog->isVisible()) {
m_dialog->reject();
}
}
bool SystemFileDialog::isOpen() const
{
return m_dialog;
}
QUrl SystemFileDialog::fileUrl() const
{
return fileUrls().isEmpty() ? QUrl() : fileUrls().at(0);
}
QList<QUrl> SystemFileDialog::fileUrls() const
{
return m_dialog ? m_dialog->selectedUrls() : QList<QUrl>();
}
QString SystemFileDialog::selectedNameFilter() const
{
return m_dialog ? m_dialog->selectedNameFilter() : QString();
}
void SystemFileDialog::onFileDialogAccepted()
{
emit accepted();
}
void SystemFileDialog::onFileDialogFinished()
{
const auto lastFolderPath = m_dialog->directory().absolutePath();
globalPrefs->setLastFolderUrl(QUrl::fromLocalFile(lastFolderPath));
emit finished();
}
QUrl SystemFileDialog::standardLocationPath(StandardLocation location)
{
if(location == LastLocation) {
const auto lastFolderUrl = globalPrefs->lastFolderUrl();
if(!QFileInfo::exists(lastFolderUrl.toLocalFile())) {
return QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
} else {
return lastFolderUrl;
}
} else if(location == HomeLocation) {
return QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
} else if(location == DownloadsLocation) {
return QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation));
} else if(location == PicturesLocation) {
return QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
} else if(location == DocumentsLocation) {
return QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
} else {
return QUrl();
}
}
void SystemFileDialog::beginOpen(StandardLocation openLocation, int acceptMode, int fileMode, const QStringList &nameFilters, const QString &defaultFileName)
{
if(m_dialog) {
m_dialog->deleteLater();
}
m_dialog = new QFileDialog();
connect(m_dialog, &QFileDialog::accepted, this, &SystemFileDialog::onFileDialogAccepted);
connect(m_dialog, &QFileDialog::finished, this, &SystemFileDialog::onFileDialogFinished);
connect(this, &SystemFileDialog::finished, this, [=]() {
disconnect();
});
m_dialog->setFileMode(static_cast<QFileDialog::FileMode>(fileMode));
m_dialog->setAcceptMode(static_cast<QFileDialog::AcceptMode>(acceptMode));
m_dialog->setDirectoryUrl(standardLocationPath(openLocation));
#ifndef Q_OS_WINDOWS
// This code crashes on Windows for some reason
m_dialog->setOption(QFileDialog::ShowDirsOnly, fileMode == QFileDialog::Directory);
#endif
if(!defaultFileName.isEmpty()) {
m_dialog->selectFile(defaultFileName);
}
if(!nameFilters.isEmpty()) {
m_dialog->setNameFilters(nameFilters);
}
m_dialog->exec();
}
|