Changeset 8485


Ignore:
Timestamp:
May 22, 2009, 10:45:09 PM (12 years ago)
Author:
kjg
Message:

(trunk web) speed improvments

Location:
trunk/web/javascript
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/web/javascript/torrent.js

    r8427 r8485  
    2525         */
    2626        initialize: function(controller, data) {
     27                this._id            = data.id;
     28                this._is_private    = data.isPrivate;
     29                this._hashString    = data.hashString;
     30                this._date          = data.addedDate;
     31                this._size          = data.totalSize;
     32                this._tracker       = data.announceURL;
     33                this._comment       = data.comment;
     34                this._creator       = data.creator;
     35                this._creator_date  = data.dateCreated;
     36                this._sizeWhenDone  = data.sizeWhenDone;
     37                this._name          = data.name;
     38                this._name_lc       = this._name.toLowerCase( );
     39
     40
    2741                // Create a new <li> element
    2842                var element = $('<li/>');
     
    89103                // insert the element
    90104                $('#torrent_list').append(this._element);
    91                 this.initializeTorrentFilesInspectorGroup(data.files.length);
    92                
    93                 for (var i = 0; i < data.files.length; i++) {
    94                         var file = data.files[i];
    95                         file.index    = i;
    96                         file.torrent  = this;
    97                         file.priority = data.priorities[i];
    98                         file.wanted   = data.wanted[i];
    99                         var torrentFile = new TorrentFile(file);
    100                         this._files.push(torrentFile);
    101                         this._fileList.append(
    102                                 torrentFile.element().addClass(i % 2 ? 'even' : 'odd').addClass('inspector_torrent_file_list_entry')
    103                         );
    104                 }
    105                
     105
     106                this._files = [];
     107                this.initializeTorrentFilesInspectorGroup();
     108                if(data.files){
     109                        if(data.files.length == 1)
     110                                this._fileList.addClass('single_file');
     111                        for (var i = 0; i < data.files.length; i++) {
     112                                var file = data.files[i];
     113                                file.index      = i;
     114                                file.torrent    = this;
     115                                file.priority   = data.fileStats[i].priority;
     116                                file.wanted     = data.fileStats[i].wanted;
     117                                var torrentFile = new TorrentFile(file);
     118                                this._files.push(torrentFile);
     119                                this._fileList.append(
     120                                        torrentFile.element().addClass(i % 2 ? 'even' : 'odd').addClass('inspector_torrent_file_list_entry')
     121                                );
     122                        }
     123                }
     124
    106125                // Update all the labels etc
    107126                this.refresh(data);
     
    109128       
    110129        initializeTorrentFilesInspectorGroup: function(length) {
    111                 this._files = [];
    112130        this._fileList = $('<ul/>').addClass('inspector_torrent_file_list').addClass('inspector_group').hide();
    113         if(length == 1)
    114             this._fileList.addClass('single_file');
    115131        $('#inspector_file_list').append(this._fileList);
    116132        },
     
    279295         */
    280296        refreshData: function(data) {
    281                 // These variables never change after the inital load
    282                 if (data.isPrivate)     this._is_private    = data.isPrivate;
    283                 if (data.hashString)    this._hashString    = data.hashString;
    284                 if (data.addedDate)     this._date          = data.addedDate;
    285                 if (data.totalSize)     this._size          = data.totalSize;
    286                 if (data.announceURL)   this._tracker       = data.announceURL;
    287                 if (data.comment)       this._comment       = data.comment;
    288                 if (data.creator)       this._creator       = data.creator;
    289                 if (data.dateCreated)   this._creator_date  = data.dateCreated;
    290                 if (data.sizeWhenDone)  this._sizeWhenDone  = data.sizeWhenDone;
    291                 if (data.path)          this._torrent_file  = data.path;//FIXME
    292                 if (data.name) {
    293                         this._name = data.name;
    294                         this._name_lc = this._name.toLowerCase( );
    295                 }
    296                
    297                 // Set the regularly-changing torrent variables
    298                 this._id                    = data.id;
    299297                this._completed             = data.haveUnchecked + data.haveValid;
    300298                this._verified              = data.haveValid;
     
    315313                this._state                 = data.status;
    316314               
    317                 if (data.files) {
    318                         for (var i = 0; i < data.files.length; i++) {
    319                                 var file_data      = data.files[i];
    320                                 if (data.priorities) { file_data.priority = data.priorities[i]; }
    321                                 if (data.wanted)     { file_data.wanted   = data.wanted[i]; }
     315                if (data.fileStats) {
     316                        for (var i = 0; i < data.fileStats.length; i++) {
     317                                var file_data      = {};
     318                                file_data.priority = data.fileStats[i].priority;
     319                                file_data.wanted   = data.fileStats[i].wanted;
     320                                file_data.bytesCompleted = data.fileStats[i].bytesCompleted;
    322321                                this._files[i].readAttributes(file_data);
    323322                        }
     323                }
     324        },
     325
     326        refreshFileData: function(data) {
     327                for (var i = 0; i < data.fileStats.length; i++) {
     328                        var file_data      = {};
     329                        file_data.priority = data.fileStats[i].priority;
     330                        file_data.wanted   = data.fileStats[i].wanted;
     331                        file_data.bytesCompleted = data.fileStats[i].bytesCompleted;
     332                        this._files[i].readAttributes(file_data);
     333                        this._files[i].refreshHTML();
    324334                }
    325335        },
  • trunk/web/javascript/transmission.js

    r8428 r8485  
    4545               
    4646                // Set up user events
    47                 $('#pause_all_link').bind('click', this.stopAllClicked );
     47                var tr = this;
     48                $('#pause_all_link').bind('click', function(){ tr.stopAllClicked(); });
    4849                $('#resume_all_link').bind('click', this.startAllClicked);
    4950                $('#pause_selected_link').bind('click', this.stopSelectedClicked );
     
    6566                } else {
    6667                        $(document).bind('keydown',  this.keyDown);
    67                         $('#torrent_container').bind('click', this.deselectAll);
     68                        $('#torrent_container').bind('click', function(){ tr.deselectAll( true ); });
    6869                        $('#open_link').bind('click', this.openTorrentClicked);
    6970                        $('#filter_toggle_link').bind('click', this.toggleFilterClicked);
     
    8485               
    8586                // Get preferences & torrents from the daemon
     87                var tr = this;
    8688                this.remote.loadDaemonPrefs( );
    87                 this.remote.loadTorrents( true );
     89                this.initalizeAllTorrents();
     90
    8891                this.togglePeriodicRefresh( true );
    8992        },
     
    657660         */
    658661        togglePeriodicRefresh: function(state) {
     662                var tr = this;
    659663                if (state && this._periodic_refresh == null) {
    660664                        // sanity check
     
    662666                             this[Prefs._RefreshRate] = 5;
    663667                        remote = this.remote;
    664                         this._periodic_refresh = setInterval(this.periodicRefresh, this[Prefs._RefreshRate] * 1000 );
     668                        this._periodic_refresh = setInterval(function(){ tr.refreshTorrents(); }, this[Prefs._RefreshRate] * 1000 );
    665669                } else {
    666670                        clearInterval(this._periodic_refresh);
    667671                        this._periodic_refresh = null;
    668672                }
    669         },
    670        
    671         periodicRefresh: function() {
    672                 // Note: 'this' != 'transmission instance' since it is being called by setInterval
    673                 if (!transmission._periodicRefreshIterations)
    674                         transmission._periodicRefreshIterations = 0;
    675                
    676                 remote.loadTorrents(transmission._periodicRefreshIterations++ % 10 == 0);
    677673        },
    678674       
     
    10951091        },
    10961092
    1097         updateTorrentsData: function( torrent_list ) {
     1093        refreshTorrents: function() {
    10981094                var tr = this;
    1099                 jQuery.each( torrent_list, function() {
     1095                this.remote.getUpdatedDataFor('recently-active', function(active, removed){ tr.updateTorrentsData(active, removed); });
     1096        },
     1097
     1098        updateTorrentsData: function( active, removed_ids ) {
     1099                var tr = this;
     1100                var new_torrent_ids = [];
     1101                var refresh_files_for = [];
     1102                jQuery.each( active, function() {
    11001103                        var t = Torrent.lookup(tr._torrents, this.id);
    1101                         if (t) t.refresh(this);
     1104                        if (t){
     1105                    t.refresh(this);
     1106                    if(t.isSelected())
     1107                      refresh_files_for.push(t.id());
     1108                  }
     1109                  else
     1110                    new_torrent_ids.push(this.id);
    11021111                } );
    1103         },
    1104        
    1105         /*
    1106          * Process got some new torrent data from the server
    1107          */
    1108         updateAllTorrents: function( torrent_list ) {
    1109                 var torrent_data;
    1110                 var new_torrents = [];
    1111                 var torrent_ids = [];
    1112                 var handled = [];
    1113                
    1114                 // refresh existing torrents
    1115                 this.updateTorrentsData( torrent_list );
    1116                
    1117                 // partition existing and new torrents
    1118                
    1119                 for( var i=0, len=torrent_list.length; i<len; ++i ) {
    1120                         var data = torrent_list[i];
    1121                         var t = Torrent.lookup( this._torrents, data.id );
    1122                         if( !t )
    1123                                 new_torrents.push( data );
    1124                         else {
    1125                                 handled.push( t );
     1112
     1113                tr.remote.loadTorrentFiles( refresh_files_for );
     1114
     1115                if(new_torrent_ids.length > 0)
     1116                        tr.remote.getInitialDataFor(new_torrent_ids, function(torrents){ tr.addTorrents(torrents) } );
     1117
     1118                var removedAny = tr.deleteTorrents(removed_ids);
     1119
     1120                if( ( new_torrent_ids.length != 0 ) || removedAny ) {
     1121                        tr.hideiPhoneAddressbar();
     1122                        tr.deselectAll( true );
     1123                }
     1124
     1125                this.refilter();
     1126        },
     1127
     1128        updateTorrentsFileData: function( torrents ){
     1129                var tr = this;
     1130                jQuery.each( torrents, function() {
     1131                        var t = Torrent.lookup(tr._torrents, this.id);
     1132                        if (t)
     1133                    t.refreshFileData(this);
     1134                } );
     1135        },
     1136
     1137        initalizeAllTorrents: function(){
     1138                var tr = this;
     1139                this.remote.getInitialDataFor( null ,function(torrents) { tr.addTorrents(torrents); } );
     1140        },
     1141
     1142        addTorrents: function( new_torrents ){
     1143                var tr = this;
     1144
     1145                $.each( new_torrents, function(){
     1146                        var torrent = this;
     1147                        tr._torrents.push( new Torrent( tr, torrent ) );
     1148                });
     1149
     1150                this.refilter();
     1151        },
     1152
     1153        deleteTorrents: function(torrent_ids){
     1154                if(typeof torrent_ids == 'undefined')
     1155                        return false;
     1156                var tr = this;
     1157                var removedAny = false;
     1158                $.each( torrent_ids, function(index, id){
     1159                        var torrent = Torrent.lookup(tr._torrents, id);
     1160
     1161                        if(torrent) {
     1162                                removedAny = true;
     1163                                var e = torrent.element();
     1164                                if( e ) {
     1165                                        var row_index = tr.getTorrentIndex(tr._rows, torrent);
     1166                                        delete e._torrent; //remove circular refernce to help IE garbage collect
     1167                                        tr._rows.splice(row_index, 1)
     1168                                        e.remove();
     1169                                }
     1170
     1171                                var pos = Torrent.indexOf( tr._torrents, torrent.id( ) );
     1172                                torrent.hideFileList();
     1173                                tr._torrents.splice( pos, 1 );
    11261174                        }
    1127                 }
    1128                
    1129                 // Add any torrents that aren't already being displayed
    1130                 // if file data is available
    1131                 if( new_torrents.length ) {
    1132                         if (data.files) {
    1133                                 for( var i=0, len=new_torrents.length; i<len; ++i ) {
    1134                                         var t = new Torrent( this, new_torrents[i] );
    1135                                         this._torrents.push( t );
    1136                                         handled.push( t );
    1137                                 }
    1138                                 this._torrents.sort( Torrent.compareById );
    1139                         } else {
    1140                                 // There are new torrents available
    1141                                 // pick them up on the next refresh
    1142                                 this.scheduleFileRefresh();
    1143                         }
    1144                 }
    1145                
    1146                 // Remove any torrents that weren't in the refresh list
    1147                 var removedAny = false;
    1148                 handled.sort( Torrent.compareById ); // for Torrent.indexOf
    1149                 var allTorrents = this._torrents.clone();
    1150                 for( var i=0, len=allTorrents.length; i<len; ++i ) {
    1151                         var t = allTorrents[i];
    1152                         if( Torrent.indexOf( handled, t.id() ) == -1 ) {
    1153                                 var pos = Torrent.indexOf( this._torrents, t.id( ) );
    1154                                 var e = this._torrents[pos].element();
    1155                                 if( e ) {
    1156                                         delete e._torrent;
    1157                                         e.hide( );
    1158                                 }
    1159                                 t.hideFileList();
    1160                                 this._torrents.splice( pos, 1 );
    1161                                 removedAny = true;
    1162                         }
    1163                 }
    1164                
    1165                 if( ( new_torrents.length != 0 ) || removedAny ) {
    1166                         this.hideiPhoneAddressbar();
    1167                         this.deselectAll( true );
    1168                 }
    1169                
    1170                 // FIXME: not sure if this is possible in RPC
    1171                 // Update the disk space remaining
    1172                 //var disk_space_msg = 'Free Space: '
    1173                 //+ Math.formatBytes(data.free_space_bytes)
    1174                 //+ ' (' + data.free_space_percent + '% )';
    1175                 //setInnerHTML( $('div#disk_space_container')[0], disk_space_msg );
    1176                
    1177                 this.refilter( );
     1175                });
     1176
     1177                return removedAny;
    11781178        },
    11791179
     
    12521252                                args.iframe = true;
    12531253                                args.success = function( data ) {
    1254                                         tr.remote.loadTorrents( true );
     1254                                        tr.refreshTorrents();
    12551255                                        tr.togglePeriodicRefresh( true );
    12561256                                };
  • trunk/web/javascript/transmission.remote.js

    r8359 r8485  
    9797        },
    9898
    99         loadTorrents: function(update_files) {
    100                 var tr = this._controller;
     99        getInitialDataFor: function(torrent_ids, callback) {
    101100                var o = {
    102101                        method: 'torrent-get',
    103                         arguments: { fields: [
    104                                 'addedDate', 'announceURL', 'comment', 'creator',
     102                        arguments: {
     103                        fields: [ 'addedDate', 'announceURL', 'comment', 'creator',
    105104                                'dateCreated', 'downloadedEver', 'error', 'errorString',
    106105                                'eta', 'hashString', 'haveUnchecked', 'haveValid', 'id',
     
    108107                                'peersConnected', 'peersGettingFromUs', 'peersSendingToUs',
    109108                                'rateDownload', 'rateUpload', 'seeders', 'sizeWhenDone',
    110                                 'status', 'swarmSpeed', 'totalSize', 'uploadedEver' ]
    111                         }
    112                 };
    113                 if (update_files) {
    114                         o.arguments.fields.push('files');
    115                         o.arguments.fields.push('wanted');
    116                         o.arguments.fields.push('priorities');
    117                 }
    118                 this.sendRequest( o, function(data) {
    119                         tr.updateAllTorrents( data.arguments.torrents );
    120                 } );
    121         },
    122        
     109                                'status', 'swarmSpeed', 'totalSize', 'uploadedEver', 'files', 'fileStats' ]
     110                        }
     111                };
     112
     113                if(torrent_ids)
     114                        o.arguments.ids = torrent_ids;
     115
     116                this.sendRequest( o, function(data){ callback(data.arguments.torrents)} );
     117        },
     118
     119        getUpdatedDataFor: function(torrent_ids, callback) {
     120                var o = {
     121                        method: 'torrent-get',
     122                        arguments: {
     123                                'ids': torrent_ids,
     124                                fields: [  'id', 'downloadedEver', 'error', 'errorString',
     125                                        'eta', 'haveUnchecked', 'haveValid', 'leechers', 'leftUntilDone',
     126                                        'peersConnected', 'peersGettingFromUs', 'peersSendingToUs',
     127                                        'rateDownload', 'rateUpload', 'seeders',
     128                                        'status', 'swarmSpeed', 'uploadedEver' ]
     129                        }
     130                };
     131
     132                this.sendRequest( o, function(data){ callback(data.arguments.torrents, data.arguments.removed)} );
     133        },
     134
    123135        loadTorrentFiles: function( torrent_ids ) {
    124136                var tr = this._controller;
    125137                this.sendRequest( {
    126138                        method: 'torrent-get',
    127                         arguments: { fields: [ 'files', 'wanted', 'priorities'] },
    128                         ids: torrent_ids
     139                        arguments: { fields: [ 'id', 'fileStats'], ids: torrent_ids },
    129140                }, function(data) {
    130                         tr.updateTorrentsData( data.arguments.torrents );
     141                        tr.updateTorrentsFileData( data.arguments.torrents );
    131142                } );
    132143        },
     
    155166                                o.arguments.ids.push( torrents[i].id() );
    156167                this.sendRequest( o, function( ) {
    157                         remote.loadTorrents();
     168                        remote._controller.refreshTorrents();
    158169                } );
    159170        },
     
    182193                                o.arguments.ids.push( torrents[i].id() );
    183194                this.sendRequest( o, function( ) {
    184                         remote.loadTorrents();
     195                        remote._controller.refreshTorrents();
    185196                } );
    186197        },
     
    199210               
    200211                this.sendRequest(o, function() {
    201                         remote.loadTorrents();
     212                        remote._controller.refreshTorrents();
    202213                } );
    203214        },
Note: See TracChangeset for help on using the changeset viewer.