diff --git a/src/gui/torrentcreatordialog.cpp b/src/gui/torrentcreatordialog.cpp index 536a29cda..591786fc0 100644 --- a/src/gui/torrentcreatordialog.cpp +++ b/src/gui/torrentcreatordialog.cpp @@ -44,6 +44,18 @@ #define SETTINGS_KEY(name) u"TorrentCreator/" name +namespace +{ + // When the root file/directory of the created torrent is a symlink, we want to keep the symlink name in the torrent. + // On Windows, however, QFileDialog::DontResolveSymlinks disables shortcuts (.lnk files) expansion, making it impossible to pick a file if its path contains a shortcut. + // As of NTFS symlinks, they don't seem to be resolved anyways. +#ifndef Q_OS_WIN + const QFileDialog::Options FILE_DIALOG_OPTIONS {QFileDialog::DontResolveSymlinks}; +#else + const QFileDialog::Options FILE_DIALOG_OPTIONS {}; +#endif +} + TorrentCreatorDialog::TorrentCreatorDialog(QWidget *parent, const Path &defaultPath) : QDialog(parent) , m_ui(new Ui::TorrentCreatorDialog) @@ -106,14 +118,15 @@ void TorrentCreatorDialog::updateInputPath(const Path &path) void TorrentCreatorDialog::onAddFolderButtonClicked() { const QString oldPath = m_ui->textInputPath->text(); - const Path path {QFileDialog::getExistingDirectory(this, tr("Select folder"), oldPath)}; + const Path path {QFileDialog::getExistingDirectory(this, tr("Select folder") + , oldPath, (QFileDialog::ShowDirsOnly | FILE_DIALOG_OPTIONS))}; updateInputPath(path); } void TorrentCreatorDialog::onAddFileButtonClicked() { const QString oldPath = m_ui->textInputPath->text(); - const Path path {QFileDialog::getOpenFileName(this, tr("Select file"), oldPath)}; + const Path path {QFileDialog::getOpenFileName(this, tr("Select file"), oldPath, QString(), nullptr, FILE_DIALOG_OPTIONS)}; updateInputPath(path); } @@ -170,7 +183,12 @@ void TorrentCreatorDialog::dragEnterEvent(QDragEnterEvent *event) // Main function that create a .torrent file void TorrentCreatorDialog::onCreateButtonClicked() { +#ifdef Q_OS_WIN + // Resolve the path in case it contains a shortcut (otherwise, the following usages will consider it invalid) const auto inputPath = Utils::Fs::toCanonicalPath(Path(m_ui->textInputPath->text().trimmed())); +#else + const auto inputPath = Path(m_ui->textInputPath->text().trimmed()); +#endif // test if readable if (!Utils::Fs::isReadable(inputPath))