diff --git a/Changelog b/Changelog index e0de258cd..baf552391 100644 --- a/Changelog +++ b/Changelog @@ -33,6 +33,7 @@ - FEATURE: Include DHT traffic in the rate limiter (libtorrent >= v0.15 only) - FEATURE: Support for bitcomet padding files (libtorrent >= v0.15 only) - FEATURE: Option to skip file checking and start seeding immediately in torrent addition dialog (Stephanos Antaris) (libtorrent >= v0.15 only) + - WEB UI: Removed Web UI to match new qBittorrent UI - COSMETIC: Merged download / upload lists - COSMETIC: Torrents can be filtered based on their status - COSMETIC: Torrent properties are now displayed in main window diff --git a/src/eventmanager.cpp b/src/eventmanager.cpp index c7df0791f..2cd74c740 100644 --- a/src/eventmanager.cpp +++ b/src/eventmanager.cpp @@ -58,29 +58,41 @@ void EventManager::modifiedTorrent(QTorrentHandle h) QVariantMap event; if(h.is_paused()) { - event["state"] = QVariant("paused"); + if(h.is_seed()) + event["state"] = QVariant("pausedUP"); + else + event["state"] = QVariant("pausedDL"); } else { if(BTSession->isQueueingEnabled() && h.is_queued()) { - event["state"] = QVariant("queued"); + if(h.is_seed()) + event["state"] = QVariant("queuedUP"); + else + event["state"] = QVariant("queuedDL"); } else { switch(h.state()) { - case torrent_status::finished: - case torrent_status::seeding: - event["state"] = QVariant("seeding"); + case torrent_status::finished: + case torrent_status::seeding: + if(h.upload_payload_rate() > 0) + event["state"] = QVariant("seeding"); + else + event["state"] = QVariant("stalledUP"); break; - case torrent_status::allocating: + case torrent_status::allocating: case torrent_status::checking_files: case torrent_status::queued_for_checking: case torrent_status::checking_resume_data: - event["state"] = QVariant("checking"); + if(h.is_seed()) + event["state"] = QVariant("checkingUP"); + else + event["state"] = QVariant("checkingDL"); break; - case torrent_status::downloading: - case torrent_status::downloading_metadata: + case torrent_status::downloading: + case torrent_status::downloading_metadata: if(h.download_payload_rate() > 0) event["state"] = QVariant("downloading"); else - event["state"] = QVariant("stalled"); + event["state"] = QVariant("stalledDL"); break; default: qDebug("No status, should not happen!!! status is %d", h.state()); @@ -90,14 +102,12 @@ void EventManager::modifiedTorrent(QTorrentHandle h) } event["name"] = QVariant(h.name()); event["size"] = QVariant((qlonglong)h.actual_size()); - if(!h.is_seed()) { - event["progress"] = QVariant(h.progress()); - event["dlspeed"] = QVariant(h.download_payload_rate()); - if(BTSession->isQueueingEnabled()) { - event["priority"] = QVariant(h.queue_position()); - } else { - event["priority"] = -1; - } + event["progress"] = QVariant(h.progress()); + event["dlspeed"] = QVariant(h.download_payload_rate()); + if(BTSession->isQueueingEnabled()) { + event["priority"] = QVariant(h.queue_position()); + } else { + event["priority"] = -1; } event["upspeed"] = QVariant(h.upload_payload_rate()); event["seed"] = QVariant(h.is_seed()); diff --git a/src/webui/css/style.css b/src/webui/css/style.css index e1830fbcf..ac6f3fa41 100644 --- a/src/webui/css/style.css +++ b/src/webui/css/style.css @@ -120,3 +120,22 @@ hr { height:100%; } +#Filters { + width: 120px; + border-right: 1px solid #ccc; + color: #000; +} + +#Filters ul { + list-style-type: none; +} + +#Filters ul img { + padding-right: 2px; + margin-top: 2px; +} + +#Transfers { + vertical-align: top; +} + diff --git a/src/webui/index.html b/src/webui/index.html index 425730cb7..13b5d7a58 100644 --- a/src/webui/index.html +++ b/src/webui/index.html @@ -6,13 +6,11 @@ - - @@ -23,7 +21,7 @@
-

qBittorrent Web User Interface version 1.3.2

+

qBittorrent Web User Interface version 2.0.0

    @@ -73,13 +71,18 @@
-
-
- -
+
+ + + -
-
+ + @@ -94,21 +97,8 @@
+
- - - - - - - - - -
NameSizeUP Speed
-
-
diff --git a/src/webui/scripts/client.js b/src/webui/scripts/client.js index dd119fb94..17650a5bb 100644 --- a/src/webui/scripts/client.js +++ b/src/webui/scripts/client.js @@ -23,7 +23,7 @@ */ myTable = new dynamicTable(); -myTableUP = new dynamicTable(); +ajaxfn = function(){}; window.addEvent('domready', function(){ MochaUI.Desktop = new MochaUI.Desktop(); @@ -32,29 +32,27 @@ window.addEvent('domready', function(){ 'visibility': 'visible' }); initializeWindows(); - // Tabs - myTabs1 = new mootabs('myTabs', { - width: '100%', - height: '100%' - }); myTable.setup('myTable', 3); - myTableUP.setup('myTableUP', -1); var r=0; var waiting=false; var stateToImg = function(state){ switch (state) { - case 'paused': + case 'pausedUP': + case 'pausedDL': return ''; case 'seeding': + case 'stalledUP': return ''; - case 'checking': + case 'checkingUP': + case 'checkingDL': return ''; case 'downloading': return ''; - case 'stalled': + case 'stalledDL': return ''; - case 'queued': + case 'queuedUP': + case 'queuedDL': return ''; default: return ''; @@ -90,33 +88,10 @@ window.addEvent('domready', function(){ $('error_div').set('html', ''); if(events){ // Add new torrents or update them - unfinished_hashes = myTable.getRowIds(); - finished_hashes = myTableUP.getRowIds(); + torrent_hashes = myTable.getRowIds(); events_hashes = new Array(); events.each(function(event){ events_hashes[events_hashes.length] = event.hash; - if(event.seed) { - var row = new Array(); - row.length = 4; - row[0] = stateToImg(event.state); - row[1] = event.name; - row[2] = fsize(event.size); - row[3] = fspeed(event.upspeed); - if(!finished_hashes.contains(event.hash)) { - // New finished torrent - finished_hashes[finished_hashes.length] = event.hash; - myTableUP.insertRow(event.hash, row); - if(unfinished_hashes.contains(event.hash)) { - // Torrent used to be in unfinished list - // Remove it - myTable.removeRow(event.hash); - unfinished_hashes.erase(event.hash); - } - } else { - // Update torrent data - myTableUP.updateRow(event.hash, row); - } - } else { var row = new Array(); row.length = 6; row[0] = stateToImg(event.state); @@ -128,33 +103,21 @@ window.addEvent('domready', function(){ row[6] = event.priority if(row[6] != -1) queueing_enabled = true; - if(!unfinished_hashes.contains(event.hash)) { + if(!torrent_hashes.contains(event.hash)) { // New unfinished torrent - unfinished_hashes[unfinished_hashes.length] = event.hash; + torrent_hashes[torrent_hashes.length] = event.hash; myTable.insertRow(event.hash, row); - if(finished_hashes.contains(event.hash)) { - // Torrent used to be in unfinished list - // Remove it - myTableUP.removeRow(event.hash); - finished_hashes.erase(event.hash); - } } else { // Update torrent data - myTable.updateRow(event.hash, row); + myTable.updateRow(event.hash, row, event.state); } - } }); // Remove deleted torrents - unfinished_hashes.each(function(hash){ + torrent_hashes.each(function(hash){ if(!events_hashes.contains(hash)) { myTable.removeRow(hash); } }); - finished_hashes.each(function(hash){ - if(!events_hashes.contains(hash)) { - myTableUP.removeRow(hash); - } - }); if(queueing_enabled) { $('queueingButtons').removeClass('invisible'); myTable.showPriority(); @@ -171,6 +134,11 @@ window.addEvent('domready', function(){ }; ajaxfn(); // ajaxfn.periodical(5000); +setFilter = function(f) { + myTable.setFilter(f); + ajaxfn(); +} + }); // This runs when a person leaves your page. diff --git a/src/webui/scripts/dynamicTable.js b/src/webui/scripts/dynamicTable.js index 36a7ad469..876260280 100644 --- a/src/webui/scripts/dynamicTable.js +++ b/src/webui/scripts/dynamicTable.js @@ -42,6 +42,7 @@ var dynamicTable = new Class ({ this.cur = new Array(); this.priority_hidden = false; this.progressIndex = progressIndex; + this.filter = 'all'; }, altRow: function() @@ -66,6 +67,10 @@ var dynamicTable = new Class ({ }.bind(this)); this.priority_hidden = true; }, + + setFilter: function(f) { + this.filter = f; + }, showPriority: function(){ if(!this.priority_hidden) return; @@ -77,14 +82,52 @@ var dynamicTable = new Class ({ }.bind(this)); this.priority_hidden = false; }, + + applyFilterOnRow: function(tr, status) { + switch(this.filter) { + case 'all': + tr.removeClass("invisible"); + return; + case 'downloading': + if(status == "downloading" || status == "stalledDL" || status == "checkingDL" || status == "pausedDL" || status == "queuedDL") { + tr.removeClass("invisible"); + } else { + tr.addClass("invisible"); + } + return; + case 'completed': + if(status == "seeding" || status == "stalledUP" || status == "checkingUP" || status == "pausedUP" || status == "queuedUP") { + tr.removeClass("invisible"); + } else { + tr.addClass("invisible"); + } + return; + case 'active': + if(status == "downloading" || status == "seeding") { + tr.removeClass("invisible"); + } else { + tr.addClass("invisible"); + } + return; + case 'inactive': + if(status != "downloading" && status != "seeding") { + tr.removeClass("invisible"); + } else { + tr.addClass("invisible"); + } + return; + } + }, - insertRow: function(id, row){ + insertRow: function(id, row, status){ var tr = this.rows[id]; if($defined(tr)) return; //this.removeRow(id); var tr = new Element('tr'); this.rows[id] = tr; + // Apply filter + this.applyFilterOnRow(tr, status); for(var i=0; i