Browse Source

Set torrent location from webui context menu (addresses #6815) (#7062)

* Add option to set torrent location from webui context menu (addresses #6815)

* Update debug messages

* Use logger

* Remove redundant curly braces

* Remove message

* Use log message from transferlistwidget

* Use QDir

* Remove unused import

* Check if newLocation is an empty string
adaptive-webui-19844
Tom Piccirello 7 years ago committed by Mike Tzou
parent
commit
07a85a1018
  1. 26
      src/webui/webapplication.cpp
  2. 1
      src/webui/webapplication.h
  3. 1
      src/webui/webui.qrc
  4. 3
      src/webui/www/private/index.html
  5. 2
      src/webui/www/public/newcategory.html
  6. 127
      src/webui/www/public/scripts/mocha-init.js
  7. 55
      src/webui/www/public/setlocation.html
  8. 26
      src/webui/www/public/transferlist.html

26
src/webui/webapplication.cpp

@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
#include <vector>
#include "base/iconprovider.h"
#include "base/logger.h"
#include "base/utils/misc.h"
#include "base/utils/fs.h"
#include "base/utils/string.h"
@ -117,6 +118,7 @@ QMap<QString, QMap<QString, WebApplication::Action> > WebApplication::initialize @@ -117,6 +118,7 @@ QMap<QString, QMap<QString, WebApplication::Action> > WebApplication::initialize
ADD_ACTION(command, decreasePrio);
ADD_ACTION(command, topPrio);
ADD_ACTION(command, bottomPrio);
ADD_ACTION(command, setLocation);
ADD_ACTION(command, recheck);
ADD_ACTION(command, setCategory);
ADD_ACTION(command, addCategory);
@ -774,6 +776,30 @@ void WebApplication::action_command_bottomPrio() @@ -774,6 +776,30 @@ void WebApplication::action_command_bottomPrio()
BitTorrent::Session::instance()->bottomTorrentsPriority(hashes);
}
void WebApplication::action_command_setLocation()
{
CHECK_URI(0);
CHECK_PARAMETERS("hashes" << "location");
QStringList hashes = request().posts["hashes"].split("|");
QString newLocation = request().posts["location"].trimmed();
// check location exists
if (newLocation.isEmpty() || !QDir(newLocation).exists())
return;
foreach (const QString &hash, hashes) {
BitTorrent::TorrentHandle *const torrent = BitTorrent::Session::instance()->findTorrent(hash);
if (torrent) {
// get old location
const QString oldLocation = torrent->savePath();
Logger::instance()->addMessage(tr("WebUI Set location: moving \"%1\", from \"%2\" to \"%3\"").arg(torrent->name()).arg(torrent->savePath()).arg(newLocation));
torrent->move(Utils::Fs::expandPathAbs(newLocation));
}
}
}
void WebApplication::action_command_recheck()
{
CHECK_URI(0);

1
src/webui/webapplication.h

@ -90,6 +90,7 @@ private: @@ -90,6 +90,7 @@ private:
void action_command_decreasePrio();
void action_command_topPrio();
void action_command_bottomPrio();
void action_command_setLocation();
void action_command_recheck();
void action_command_setCategory();
void action_command_addCategory();

1
src/webui/webui.qrc

@ -41,5 +41,6 @@ @@ -41,5 +41,6 @@
<file>www/public/upload.html</file>
<file>www/public/uploadlimit.html</file>
<file>www/public/newcategory.html</file>
<file>www/public/setlocation.html</file>
</qresource>
</RCC>

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

@ -108,6 +108,9 @@ @@ -108,6 +108,9 @@
<li><a href="#ForceStart"><img src="theme/media-seek-forward" alt="QBT_TR(Force Resume)QBT_TR[CONTEXT=TransferListWidget]"/> QBT_TR(Force Resume)QBT_TR[CONTEXT=TransferListWidget]</a></li>
<li class="separator"><a href="#Delete"><img src="theme/list-remove" alt="QBT_TR(Delete)QBT_TR[CONTEXT=TransferListWidget]"/> QBT_TR(Delete)QBT_TR[CONTEXT=TransferListWidget]</a></li>
<li class="separator">
<a href="#SetLocation"><img src="theme/inode-directory" alt="QBT_TR(Set location...)QBT_TR[CONTEXT=TransferListWidget]"/> QBT_TR(Set location...)QBT_TR[CONTEXT=TransferListWidget]</a>
</li>
<li>
<a href="#Category" class="arrow-right"><img src="theme/view-categories" alt="QBT_TR(Category)QBT_TR[CONTEXT=TransferListWidget]"/> QBT_TR(Category)QBT_TR[CONTEXT=TransferListWidget]</a>
<ul id="contextCategoryList" class="scrollableMenu"></ul>
</li>

2
src/webui/www/public/newcategory.html

@ -65,7 +65,7 @@ @@ -65,7 +65,7 @@
<div style="padding: 10px 10px 0px 10px;">
<p style="font-weight: bold;">QBT_TR(Category)QBT_TR[CONTEXT=TransferListWidget]:</p>
<input type="text" id="newCategory" value="" maxlength="100" style="width: 220px;"/>
<div style="text-align: center;">
<div style="text-align: center; padding-top: 10px;">
<input type="button" value="QBT_TR(Add)QBT_TR[CONTEXT=HttpServer]" id="newCategoryButton"/>
</div>
</div>

127
src/webui/www/public/scripts/mocha-init.js

@ -119,14 +119,14 @@ initializeWindows = function() { @@ -119,14 +119,14 @@ initializeWindows = function() {
};
uploadLimitFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hash = h[0];
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
var hash = hashes[0];
new MochaUI.Window({
id: 'uploadLimitPage',
title: "QBT_TR(Torrent Upload Speed Limiting)QBT_TR[CONTEXT=TransferListWidget]",
loadMethod: 'iframe',
contentURL: 'uploadlimit.html?hashes=' + h.join("|"),
contentURL: 'uploadlimit.html?hashes=' + hashes.join("|"),
scrollbars: false,
resizable: false,
maximizable: false,
@ -139,13 +139,13 @@ initializeWindows = function() { @@ -139,13 +139,13 @@ initializeWindows = function() {
};
toggleSequentialDownloadFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new Request({
url: 'command/toggleSequentialDownload',
method: 'post',
data: {
hashes: h.join("|")
hashes: hashes.join("|")
}
}).send();
updateMainData();
@ -153,13 +153,13 @@ initializeWindows = function() { @@ -153,13 +153,13 @@ initializeWindows = function() {
};
toggleFirstLastPiecePrioFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new Request({
url: 'command/toggleFirstLastPiecePrio',
method: 'post',
data: {
hashes: h.join("|")
hashes: hashes.join("|")
}
}).send();
updateMainData();
@ -167,14 +167,14 @@ initializeWindows = function() { @@ -167,14 +167,14 @@ initializeWindows = function() {
};
setSuperSeedingFN = function(val) {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new Request({
url: 'command/setSuperSeeding',
method: 'post',
data: {
value: val,
hashes: h.join("|")
hashes: hashes.join("|")
}
}).send();
updateMainData();
@ -182,14 +182,14 @@ initializeWindows = function() { @@ -182,14 +182,14 @@ initializeWindows = function() {
};
setForceStartFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new Request({
url: 'command/setForceStart',
method: 'post',
data: {
value: 'true',
hashes: h.join("|")
hashes: hashes.join("|")
}
}).send();
updateMainData();
@ -228,14 +228,14 @@ initializeWindows = function() { @@ -228,14 +228,14 @@ initializeWindows = function() {
};
downloadLimitFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hash = h[0];
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
var hash = hashes[0];
new MochaUI.Window({
id: 'downloadLimitPage',
title: "QBT_TR(Torrent Download Speed Limiting)QBT_TR[CONTEXT=TransferListWidget]",
loadMethod: 'iframe',
contentURL: 'downloadlimit.html?hashes=' + h.join("|"),
contentURL: 'downloadlimit.html?hashes=' + hashes.join("|"),
scrollbars: false,
resizable: false,
maximizable: false,
@ -248,13 +248,13 @@ initializeWindows = function() { @@ -248,13 +248,13 @@ initializeWindows = function() {
};
deleteFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new MochaUI.Window({
id: 'confirmDeletionPage',
title: "QBT_TR(Deletion confirmation)QBT_TR[CONTEXT=confirmDeletionDlg]",
loadMethod: 'iframe',
contentURL: 'confirmdeletion.html?hashes=' + h.join("|"),
contentURL: 'confirmdeletion.html?hashes=' + hashes.join("|"),
scrollbars: false,
resizable: false,
maximizable: false,
@ -272,9 +272,9 @@ initializeWindows = function() { @@ -272,9 +272,9 @@ initializeWindows = function() {
});
pauseFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
h.each(function(hash, index) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
hashes.each(function(hash, index) {
new Request({
url: 'command/pause',
method: 'post',
@ -288,9 +288,9 @@ initializeWindows = function() { @@ -288,9 +288,9 @@ initializeWindows = function() {
};
startFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
h.each(function(hash, index) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
hashes.each(function(hash, index) {
new Request({
url: 'command/resume',
method: 'post',
@ -304,9 +304,9 @@ initializeWindows = function() { @@ -304,9 +304,9 @@ initializeWindows = function() {
};
recheckFN = function() {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
h.each(function(hash, index) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
hashes.each(function(hash, index) {
new Request({
url: 'command/recheck',
method: 'post',
@ -319,14 +319,33 @@ initializeWindows = function() { @@ -319,14 +319,33 @@ initializeWindows = function() {
}
};
setLocationFN = function() {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new MochaUI.Window({
id: 'setLocationPage',
title: "QBT_TR(Set location)QBT_TR[CONTEXT=TransferListWidget]",
loadMethod: 'iframe',
contentURL: 'setlocation.html?hashes=' + hashes.join('|'),
scrollbars: false,
resizable: false,
maximizable: false,
paddingVertical: 0,
paddingHorizontal: 0,
width: 250,
height: 100
});
}
};
torrentNewCategoryFN = function () {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new MochaUI.Window({
id: 'newCategoryPage',
title: "QBT_TR(New Category)QBT_TR[CONTEXT=TransferListWidget]",
loadMethod: 'iframe',
contentURL: 'newcategory.html?hashes=' + h.join('|'),
contentURL: 'newcategory.html?hashes=' + hashes.join('|'),
scrollbars: false,
resizable: false,
maximizable: false,
@ -340,15 +359,15 @@ initializeWindows = function() { @@ -340,15 +359,15 @@ initializeWindows = function() {
torrentSetCategoryFN = function (categoryHash) {
var categoryName = '';
if (categoryHash !== 0)
if (categoryHash != 0)
categoryName = category_list[categoryHash].name;
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new Request({
url: 'command/setCategory',
method: 'post',
data: {
hashes: h.join("|"),
hashes: hashes.join("|"),
category: categoryName
}
}).send();
@ -401,9 +420,9 @@ initializeWindows = function() { @@ -401,9 +420,9 @@ initializeWindows = function() {
};
startTorrentsByCategoryFN = function (categoryHash) {
var h = torrentsTable.getFilteredTorrentsHashes('all', categoryHash);
if (h.length) {
h.each(function (hash, index) {
var hashes = torrentsTable.getFilteredTorrentsHashes('all', categoryHash);
if (hashes.length) {
hashes.each(function (hash, index) {
new Request({
url: 'command/resume',
method: 'post',
@ -417,9 +436,9 @@ initializeWindows = function() { @@ -417,9 +436,9 @@ initializeWindows = function() {
};
pauseTorrentsByCategoryFN = function (categoryHash) {
var h = torrentsTable.getFilteredTorrentsHashes('all', categoryHash);
if (h.length) {
h.each(function (hash, index) {
var hashes = torrentsTable.getFilteredTorrentsHashes('all', categoryHash);
if (hashes.length) {
hashes.each(function (hash, index) {
new Request({
url: 'command/pause',
method: 'post',
@ -433,13 +452,13 @@ initializeWindows = function() { @@ -433,13 +452,13 @@ initializeWindows = function() {
};
deleteTorrentsByCategoryFN = function (categoryHash) {
var h = torrentsTable.getFilteredTorrentsHashes('all', categoryHash);
if (h.length) {
var hashes = torrentsTable.getFilteredTorrentsHashes('all', categoryHash);
if (hashes.length) {
new MochaUI.Window({
id: 'confirmDeletionPage',
title: "QBT_TR(Deletion confirmation)QBT_TR[CONTEXT=confirmDeletionDlg]",
loadMethod: 'iframe',
contentURL: 'confirmdeletion.html?hashes=' + h.join("|"),
contentURL: 'confirmdeletion.html?hashes=' + hashes.join("|"),
scrollbars: false,
resizable: false,
maximizable: false,
@ -494,9 +513,9 @@ initializeWindows = function() { @@ -494,9 +513,9 @@ initializeWindows = function() {
['pause', 'resume', 'recheck'].each(function(item) {
addClickEvent(item, function(e) {
new Event(e).stop();
var h = torrentsTable.selectedRowsIds();
if (h.length) {
h.each(function(hash, index) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
hashes.each(function(hash, index) {
new Request({
url: 'command/' + item,
method: 'post',
@ -518,13 +537,13 @@ initializeWindows = function() { @@ -518,13 +537,13 @@ initializeWindows = function() {
});
setPriorityFN = function(cmd) {
var h = torrentsTable.selectedRowsIds();
if (h.length) {
var hashes = torrentsTable.selectedRowsIds();
if (hashes.length) {
new Request({
url: 'command/' + cmd,
method: 'post',
data: {
hashes: h.join("|")
hashes: hashes.join("|")
}
}).send();
updateMainData();

55
src/webui/www/public/setlocation.html

@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>QBT_TR(Set location)QBT_TR[CONTEXT=TransferListWidget]</title>
<link rel="stylesheet" href="css/style.css" type="text/css" />
<script type="text/javascript" src="scripts/mootools-1.2-core-yc.js" charset="utf-8"></script>
<script type="text/javascript" src="scripts/mootools-1.2-more.js" charset="utf-8"></script>
<script type="text/javascript">
var setLocationKeyboardEvents = new Keyboard({
defaultEventType: 'keydown',
events: {
'enter': function (event) {
$('setLocationButton').click();
event.preventDefault();
}
}
});
setLocationKeyboardEvents.activate();
window.addEvent('domready', function() {
$('setLocation').focus();
$('setLocationButton').addEvent('click', function(e) {
new Event(e).stop();
// check field
var location = $('setLocation').value.trim();
if (location === null || location === "")
return false;
var hashesList = new URI().getData('hashes');
new Request({
url: 'command/setLocation',
method: 'post',
data: {
hashes: hashesList,
location: location
},
onComplete: function () {
window.parent.closeWindows();
}
}).send();
});
});
</script>
</head>
<body>
<div style="padding: 10px 10px 0px 10px;">
<p style="font-weight: bold;">QBT_TR(Location)QBT_TR[CONTEXT=TransferListWidget]:</p>
<input type="text" id="setLocation" value="" maxlength="100" style="width: 220px;"/>
<div style="text-align: center; padding-top: 10px;">
<input type="button" value="QBT_TR(Save)QBT_TR[CONTEXT=HttpServer]" id="setLocationButton"/>
</div>
</div>
</body>
</html>

26
src/webui/www/public/transferlist.html

@ -22,9 +22,6 @@ @@ -22,9 +22,6 @@
targets : '.torrentsTableContextMenuTarget',
menu : 'torrentsTableMenu',
actions : {
Delete : function (element, ref) {
deleteFN();
},
Start : function (element, ref) {
startFN();
},
@ -34,6 +31,15 @@ @@ -34,6 +31,15 @@
ForceStart : function (element, ref) {
setForceStartFN();
},
Delete : function (element, ref) {
deleteFN();
},
SetLocation : function (element, ref) {
setLocationFN();
},
prioTop : function (element, ref) {
setPriorityFN('topPrio');
},
@ -46,21 +52,25 @@ @@ -46,21 +52,25 @@
prioBottom : function (element, ref) {
setPriorityFN('bottomPrio');
},
ForceRecheck : function (element, ref) {
recheckFN();
DownloadLimit : function (element, ref) {
downloadLimitFN();
},
UploadLimit : function (element, ref) {
uploadLimitFN();
},
DownloadLimit : function (element, ref) {
downloadLimitFN();
},
SequentialDownload : function (element, ref) {
toggleSequentialDownloadFN();
},
FirstLastPiecePrio : function (element, ref) {
toggleFirstLastPiecePrioFN();
},
ForceRecheck : function (element, ref) {
recheckFN();
},
SuperSeeding : function (element, ref) {
setSuperSeedingFN(!ref.getItemChecked('SuperSeeding'));
}

Loading…
Cancel
Save