From b2b7d02c0156c592859b289b9289209b4397b722 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Sat, 31 Oct 2020 01:49:15 +0800 Subject: [PATCH] Allow adding torrents using "Paste" key sequence Closes #13685. --- src/gui/mainwindow.cpp | 43 ++++++++++++++++++++++++++++++++++++++---- src/gui/mainwindow.h | 1 + 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index c3b729eb5..026ffd333 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -30,11 +30,13 @@ #include +#include #include #include #include #include #include +#include #include #include #include @@ -129,6 +131,14 @@ namespace { return SettingsStorage::instance(); } + + bool isTorrentLink(const QString &str) + { + return str.startsWith(QLatin1String("magnet:"), Qt::CaseInsensitive) + || str.endsWith(QLatin1String(C_TORRENT_FILE_EXTENSION), Qt::CaseInsensitive) + || (!str.startsWith(QLatin1String("file:"), Qt::CaseInsensitive) + && Net::DownloadManager::hasSupportedScheme(str)); + } } MainWindow::MainWindow(QWidget *parent) @@ -1134,6 +1144,34 @@ void MainWindow::showEvent(QShowEvent *e) } } +void MainWindow::keyPressEvent(QKeyEvent *event) +{ + if (event->matches(QKeySequence::Paste)) { + const QMimeData *mimeData {QGuiApplication::clipboard()->mimeData()}; + + if (mimeData->hasText()) { + const bool useTorrentAdditionDialog {AddNewTorrentDialog::isEnabled()}; + const QStringList lines {mimeData->text().split('\n', QString::SkipEmptyParts)}; + + for (QString line : lines) { + line = line.trimmed(); + + if (!isTorrentLink(line)) + continue; + + if (useTorrentAdditionDialog) + AddNewTorrentDialog::show(line, this); + else + BitTorrent::Session::instance()->addTorrent(line); + } + + return; + } + } + + QMainWindow::keyPressEvent(event); +} + // Called when we close the program void MainWindow::closeEvent(QCloseEvent *e) { @@ -1288,10 +1326,7 @@ void MainWindow::dropEvent(QDropEvent *event) // differentiate ".torrent" files/links & magnet links from others QStringList torrentFiles, otherFiles; for (const QString &file : asConst(files)) { - const bool isTorrentLink = (file.startsWith("magnet:", Qt::CaseInsensitive) - || file.endsWith(C_TORRENT_FILE_EXTENSION, Qt::CaseInsensitive) - || Net::DownloadManager::hasSupportedScheme(file)); - if (isTorrentLink) + if (isTorrentLink(file)) torrentFiles << file; else otherFiles << file; diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index 529e26025..4485de688 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -213,6 +213,7 @@ private: void dragEnterEvent(QDragEnterEvent *event) override; void closeEvent(QCloseEvent *) override; void showEvent(QShowEvent *) override; + void keyPressEvent(QKeyEvent *event) override; bool event(QEvent *e) override; void displayRSSTab(bool enable); void displaySearchTab(bool enable);