Browse Source

Add copy comment functionality to the torrent list's context menu

PR #19846.
Closes #18890.
master
thalieht 1 year ago committed by GitHub
parent
commit
30d9978c97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      src/gui/transferlistwidget.cpp
  2. 1
      src/gui/transferlistwidget.h
  3. 1
      src/webui/api/serialize/serialize_torrent.cpp
  4. 1
      src/webui/api/serialize/serialize_torrent.h
  5. 1
      src/webui/www/private/index.html
  6. 2
      src/webui/www/private/scripts/client.js
  7. 16
      src/webui/www/private/scripts/mocha-init.js

15
src/gui/transferlistwidget.cpp

@ -574,6 +574,18 @@ void TransferListWidget::copySelectedIDs() const
qApp->clipboard()->setText(torrentIDs.join(u'\n')); qApp->clipboard()->setText(torrentIDs.join(u'\n'));
} }
void TransferListWidget::copySelectedComments() const
{
QStringList torrentComments;
for (const BitTorrent::Torrent *torrent : asConst(getSelectedTorrents()))
{
if (!torrent->comment().isEmpty())
torrentComments << torrent->comment();
}
qApp->clipboard()->setText(torrentComments.join(u"\n---------\n"_s));
}
void TransferListWidget::hideQueuePosColumn(bool hide) void TransferListWidget::hideQueuePosColumn(bool hide)
{ {
setColumnHidden(TransferListModel::TR_QUEUE_POSITION, hide); setColumnHidden(TransferListModel::TR_QUEUE_POSITION, hide);
@ -986,6 +998,8 @@ void TransferListWidget::displayListMenu()
connect(actionCopyMagnetLink, &QAction::triggered, this, &TransferListWidget::copySelectedMagnetURIs); connect(actionCopyMagnetLink, &QAction::triggered, this, &TransferListWidget::copySelectedMagnetURIs);
auto *actionCopyID = new QAction(UIThemeManager::instance()->getIcon(u"help-about"_s, u"edit-copy"_s), tr("Torrent &ID"), listMenu); auto *actionCopyID = new QAction(UIThemeManager::instance()->getIcon(u"help-about"_s, u"edit-copy"_s), tr("Torrent &ID"), listMenu);
connect(actionCopyID, &QAction::triggered, this, &TransferListWidget::copySelectedIDs); connect(actionCopyID, &QAction::triggered, this, &TransferListWidget::copySelectedIDs);
auto *actionCopyComment = new QAction(UIThemeManager::instance()->getIcon(u"edit-copy"_s), tr("&Comment"), listMenu);
connect(actionCopyComment, &QAction::triggered, this, &TransferListWidget::copySelectedComments);
auto *actionCopyName = new QAction(UIThemeManager::instance()->getIcon(u"name"_s, u"edit-copy"_s), tr("&Name"), listMenu); auto *actionCopyName = new QAction(UIThemeManager::instance()->getIcon(u"name"_s, u"edit-copy"_s), tr("&Name"), listMenu);
connect(actionCopyName, &QAction::triggered, this, &TransferListWidget::copySelectedNames); connect(actionCopyName, &QAction::triggered, this, &TransferListWidget::copySelectedNames);
auto *actionCopyHash1 = new QAction(UIThemeManager::instance()->getIcon(u"hash"_s, u"edit-copy"_s), tr("Info &hash v1"), listMenu); auto *actionCopyHash1 = new QAction(UIThemeManager::instance()->getIcon(u"hash"_s, u"edit-copy"_s), tr("Info &hash v1"), listMenu);
@ -1277,6 +1291,7 @@ void TransferListWidget::displayListMenu()
actionCopyHash2->setEnabled(hasInfohashV2); actionCopyHash2->setEnabled(hasInfohashV2);
copySubMenu->addAction(actionCopyMagnetLink); copySubMenu->addAction(actionCopyMagnetLink);
copySubMenu->addAction(actionCopyID); copySubMenu->addAction(actionCopyID);
copySubMenu->addAction(actionCopyComment);
actionExportTorrent->setToolTip(tr("Exported torrent is not necessarily the same as the imported")); actionExportTorrent->setToolTip(tr("Exported torrent is not necessarily the same as the imported"));
listMenu->addAction(actionExportTorrent); listMenu->addAction(actionExportTorrent);

1
src/gui/transferlistwidget.h

@ -86,6 +86,7 @@ public slots:
void copySelectedNames() const; void copySelectedNames() const;
void copySelectedInfohashes(CopyInfohashPolicy policy) const; void copySelectedInfohashes(CopyInfohashPolicy policy) const;
void copySelectedIDs() const; void copySelectedIDs() const;
void copySelectedComments() const;
void openSelectedTorrentsFolder() const; void openSelectedTorrentsFolder() const;
void recheckSelectedTorrents(); void recheckSelectedTorrents();
void reannounceSelectedTorrents(); void reannounceSelectedTorrents();

1
src/webui/api/serialize/serialize_torrent.cpp

@ -160,6 +160,7 @@ QVariantMap serialize(const BitTorrent::Torrent &torrent)
{KEY_TORRENT_LAST_ACTIVITY_TIME, getLastActivityTime()}, {KEY_TORRENT_LAST_ACTIVITY_TIME, getLastActivityTime()},
{KEY_TORRENT_AVAILABILITY, torrent.distributedCopies()}, {KEY_TORRENT_AVAILABILITY, torrent.distributedCopies()},
{KEY_TORRENT_REANNOUNCE, torrent.nextAnnounce()}, {KEY_TORRENT_REANNOUNCE, torrent.nextAnnounce()},
{KEY_TORRENT_COMMENT, torrent.comment()},
{KEY_TORRENT_TOTAL_SIZE, torrent.totalSize()} {KEY_TORRENT_TOTAL_SIZE, torrent.totalSize()}
}; };

1
src/webui/api/serialize/serialize_torrent.h

@ -91,5 +91,6 @@ inline const QString KEY_TORRENT_TIME_ACTIVE = u"time_active"_s;
inline const QString KEY_TORRENT_SEEDING_TIME = u"seeding_time"_s; inline const QString KEY_TORRENT_SEEDING_TIME = u"seeding_time"_s;
inline const QString KEY_TORRENT_AVAILABILITY = u"availability"_s; inline const QString KEY_TORRENT_AVAILABILITY = u"availability"_s;
inline const QString KEY_TORRENT_REANNOUNCE = u"reannounce"_s; inline const QString KEY_TORRENT_REANNOUNCE = u"reannounce"_s;
inline const QString KEY_TORRENT_COMMENT = u"comment"_s;
QVariantMap serialize(const BitTorrent::Torrent &torrent); QVariantMap serialize(const BitTorrent::Torrent &torrent);

1
src/webui/www/private/index.html

@ -180,6 +180,7 @@
<li><a href="#" id="copyInfohash2" class="copyToClipboard"><img src="images/hash.svg" alt="QBT_TR(Info hash v2)QBT_TR[CONTEXT=TransferListWidget]" /> QBT_TR(Info hash v2)QBT_TR[CONTEXT=TransferListWidget]</a></li> <li><a href="#" id="copyInfohash2" class="copyToClipboard"><img src="images/hash.svg" alt="QBT_TR(Info hash v2)QBT_TR[CONTEXT=TransferListWidget]" /> QBT_TR(Info hash v2)QBT_TR[CONTEXT=TransferListWidget]</a></li>
<li><a href="#" id="copyMagnetLink" class="copyToClipboard"><img src="images/torrent-magnet.svg" alt="QBT_TR(Magnet link)QBT_TR[CONTEXT=TransferListWidget]" /> QBT_TR(Magnet link)QBT_TR[CONTEXT=TransferListWidget]</a></li> <li><a href="#" id="copyMagnetLink" class="copyToClipboard"><img src="images/torrent-magnet.svg" alt="QBT_TR(Magnet link)QBT_TR[CONTEXT=TransferListWidget]" /> QBT_TR(Magnet link)QBT_TR[CONTEXT=TransferListWidget]</a></li>
<li><a href="#" id="copyID" class="copyToClipboard"><img src="images/help-about.svg" alt="QBT_TR(Torrent ID)QBT_TR[CONTEXT=TransferListWidget]" /> QBT_TR(Torrent ID)QBT_TR[CONTEXT=TransferListWidget]</a></li> <li><a href="#" id="copyID" class="copyToClipboard"><img src="images/help-about.svg" alt="QBT_TR(Torrent ID)QBT_TR[CONTEXT=TransferListWidget]" /> QBT_TR(Torrent ID)QBT_TR[CONTEXT=TransferListWidget]</a></li>
<li><a href="#" id="copyComment" class="copyToClipboard"><img src="images/edit-copy.svg" alt="QBT_TR(Comment)QBT_TR[CONTEXT=TransferListWidget]" /> QBT_TR(Comment)QBT_TR[CONTEXT=TransferListWidget]</a></li>
</ul> </ul>
</li> </li>
<li> <li>

2
src/webui/www/private/scripts/client.js

@ -1528,6 +1528,8 @@ function setupCopyEventHandler() {
return copyMagnetLinkFN(); return copyMagnetLinkFN();
case "copyID": case "copyID":
return copyIdFN(); return copyIdFN();
case "copyComment":
return copyCommentFN();
default: default:
return ""; return "";
} }

16
src/webui/www/private/scripts/mocha-init.js

@ -89,6 +89,7 @@ let copyNameFN = function() {};
let copyInfohashFN = function(policy) {}; let copyInfohashFN = function(policy) {};
let copyMagnetLinkFN = function() {}; let copyMagnetLinkFN = function() {};
let copyIdFN = function() {}; let copyIdFN = function() {};
let copyCommentFN = function() {};
let setQueuePositionFN = function() {}; let setQueuePositionFN = function() {};
let exportTorrentFN = function() {}; let exportTorrentFN = function() {};
@ -1005,6 +1006,21 @@ const initializeWindows = function() {
return torrentsTable.selectedRowsIds().join("\n"); return torrentsTable.selectedRowsIds().join("\n");
}; };
copyCommentFN = function() {
const selectedRows = torrentsTable.selectedRowsIds();
const comments = [];
if (selectedRows.length > 0) {
const rows = torrentsTable.getFilteredAndSortedRows();
for (let i = 0; i < selectedRows.length; ++i) {
const hash = selectedRows[i];
const comment = rows[hash].full_data.comment;
if (comment && (comment !== ""))
comments.push(comment);
}
}
return comments.join("\n---------\n");
};
exportTorrentFN = async function() { exportTorrentFN = async function() {
const hashes = torrentsTable.selectedRowsIds(); const hashes = torrentsTable.selectedRowsIds();
for (const hash of hashes) { for (const hash of hashes) {

Loading…
Cancel
Save