diff --git a/deluge/ui/web/js/deluge-all/Deluge.Details.Peers.js b/deluge/ui/web/js/deluge-all/Deluge.Details.Peers.js index d40e4aedc..930c443e6 100644 --- a/deluge/ui/web/js/deluge-all/Deluge.Details.Peers.js +++ b/deluge/ui/web/js/deluge-all/Deluge.Details.Peers.js @@ -34,7 +34,8 @@ Copyright: (function() { function flagRenderer(value) { - return String.format('', value); + if (!value) return ''; + return String.format('', value); } function peerAddressRenderer(value, p, record) { var seed = (record.data['seed'] == 1024) ? 'x-deluge-seed' : 'x-deluge-peer' @@ -44,28 +45,22 @@ Copyright: var progress = (value * 100).toFixed(0); return Deluge.progressBar(progress, this.width - 8, progress + '%'); } - function sort_address(value) { - var d = value.match(/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\:(\d+)/); - return ((((((+d[1])*256)+(+d[2]))*256)+(+d[3]))*256)+(+d[4]); - } Deluge.details.PeersTab = Ext.extend(Ext.grid.GridPanel, { + // fast way to figure out if we have a peer already. + peers: {}, + constructor: function(config) { config = Ext.apply({ title: _('Peers'), cls: 'x-deluge-peers', - store: new Ext.data.SimpleStore({ - fields: [ - {name: 'country'}, - {name: 'address', sortType: sort_address}, - {name: 'client'}, - {name: 'progress', type: 'float'}, - {name: 'downspeed', type: 'int'}, - {name: 'upspeed', type: 'int'}, - {name: 'seed', type: 'int'} - ], - id: 0 + store: new Ext.data.Store({ + reader: new Ext.data.JsonReader({ + idProperty: 'ip', + root: 'peers', + + }, Deluge.data.Peer) }), columns: [{ header: ' ', @@ -78,7 +73,7 @@ Copyright: width: 125, sortable: true, renderer: peerAddressRenderer, - dataIndex: 'address' + dataIndex: 'ip' }, { header: 'Client', width: 125, @@ -96,13 +91,13 @@ Copyright: width: 100, sortable: true, renderer: fspeed, - dataIndex: 'downspeed' + dataIndex: 'down_speed' }, { header: 'Up Speed', width: 100, sortable: true, renderer: fspeed, - dataIndex: 'upspeed' + dataIndex: 'up_speed' }], stripeRows: true, deferredRender:false, @@ -111,12 +106,9 @@ Copyright: Deluge.details.PeersTab.superclass.constructor.call(this, config); }, - onRender: function(ct, position) { - Deluge.details.PeersTab.superclass.onRender.call(this, ct, position); - }, - clear: function() { - this.getStore().loadData([]); + this.getStore().removeAll(); + this.peers = {}; }, update: function(torrentId) { @@ -128,11 +120,34 @@ Copyright: onRequestComplete: function(torrent, options) { if (!torrent) return; - var peers = new Array(); + + var store = this.getStore(); + var newPeers = []; + var addresses = {}; + + // Go through the peers updating and creating peer records Ext.each(torrent.peers, function(peer) { - peers.push([peer.country, peer.ip, peer.client, peer.progress, peer.down_speed, peer.up_speed, peer.seed]); + if (this.peers[peer.ip]) { + } else { + this.peers[peer.ip] = 1; + newPeers.push(new Deluge.data.Peer(peer, peer.ip)); + } + addresses[peer.ip] = 1; }, this); - this.getStore().loadData(peers); + store.add(newPeers); + + // Remove any peers that shouldn't be left in the store + store.each(function(record) { + if (!addresses[record.id]) { + store.remove(record); + delete this.peers[record.id]; + } + }, this); + store.commitChanges(); + + var sortState = store.getSortState(); + if (!sortState) return; + store.sort(sortState.field, sortState.direction); } }); deluge.details.add(new Deluge.details.PeersTab());