Changeset 8062


Ignore:
Timestamp:
Mar 14, 2009, 9:33:08 PM (13 years ago)
Author:
livings124
Message:

#1435 selective downloading and file prioritization for web ui

Location:
trunk/web
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/web/index.html

    r8050 r8062  
    1515                <script type="text/javascript" src="./javascript/jquery/jquery.transmenu.min.js"></script>
    1616                <script type="text/javascript" src="./javascript/jquery/jquery.contextmenu.min.js"></script>
     17                <script type="text/javascript" src="./javascript/jquery/jquery.tinysort.min.js"></script>
    1718                <script type="text/javascript" src="./javascript/menu.js"></script>
    1819                <script type="text/javascript" src="./javascript/jquery/jquery.form.min.js"></script>
     
    6263                                <div class="inspector_tab selected" id="inspector_tab_info"><a href="#info"><img src="images/buttons/info_general.png" alt="Information"/></a></div>
    6364                                <div class="inspector_tab" id="inspector_tab_activity"><a href="#activity"><img src="images/buttons/info_activity.png" alt="Activity"/></a></div>
     65                                <div class="inspector_tab" id="inspector_tab_files"><a href="#files"><img src="images/buttons/info_files.png" alt="Files"/></a></div>
    6466                        </div>
    6567                       
     
    169171                                </div><!-- class="inspector_group"-->
    170172                        </div><!-- id="inspector_tab_activity_container" -->
     173
     174                        <div style="display:none;" class="inspector_container" id="inspector_tab_files_container">
     175                                <span id="inspector_file_list"></span>
     176                        </div><!-- id="inspector_tab_files_container" -->
     177
    171178                </div>
    172179               
  • trunk/web/javascript/common.js

    r7932 r8062  
    4343
    4444        if ($.browser.safari) {
    45                
    46                 // Fix div height problem - causes scrollbar flash in
    47                 // firefox so have to be safari-specific
    48                 $('#torrent_inspector').css('height', '100%');
    49                
    5045                // Move search field's margin down for the styled input
    5146                $('#torrent_search').css('margin-top', 3);             
     
    8984 * "innerHTML = html" is pretty slow in FF.  Happily a lot of our innerHTML
    9085 * changes are triggered by periodic refreshes on torrents whose state hasn't
    91  * changed sine the last update, so even this simple test helps a lot.
     86 * changed since the last update, so even this simple test helps a lot.
    9287 */
    9388function setInnerHTML( e, html )
  • trunk/web/javascript/torrent.js

    r6809 r8062  
    2424         * Constructor
    2525         */
    26         initialize: function(controller,data)
    27         {
     26        initialize: function(controller, data) {
    2827                // Create a new <li> element
    2928                var element = $('<li/>');
     
    7877                element.append( e );
    7978                element._peer_details_container = e;
    80                        
     79               
    8180                // Set the torrent click observer
    8281                element.bind('click', {element: element}, this.clickTorrent);
     
    9089                // insert the element
    9190                $('#torrent_list').append(this._element);
     91                this.initializeTorrentFilesInspectorGroup();
     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                }
    92105               
    93106                // Update all the labels etc
    94107                this.refresh(data);
    95108        },
    96 
    97 
     109       
     110        initializeTorrentFilesInspectorGroup: function() {
     111                this._files = [];
     112                this._fileList = $('<ul/>').addClass('inspector_torrent_file_list').addClass('inspector_group').hide().
     113                        append($('<li/>').addClass('inspector_group_label').append(
     114                                $('<div/>').append(this.name())
     115                        )
     116                );
     117                $('#inspector_file_list').append(this._fileList);
     118        },
     119       
     120        fileList: function() {
     121                return this._fileList;
     122        },
     123       
    98124        /*--------------------------------------------
    99125         *
     
    132158                if( !this._sizeWhenDone ) return 1.0;
    133159                if( !this._leftUntilDone ) return 1.0;
    134                 return ( this._sizeWhenDone - this._leftUntilDone )
    135                        / this._sizeWhenDone;
     160                return ( this._sizeWhenDone - this._leftUntilDone ) / this._sizeWhenDone;
    136161        },
    137162        getPercentDoneStr: function() {
     
    156181        uploadSpeed: function() { return this._upload_speed; },
    157182        uploadTotal: function() { return this._upload_total; },
    158 
     183        showFileList: function() { if (this.fileList()) return this.fileList().show(); },
     184        hideFileList: function() { if (this.fileList()) return this.fileList().hide(); },
     185       
    159186        /*--------------------------------------------
    160187         *
     
    253280         * Refresh display
    254281         */
    255         refreshData: function(data)
    256         {
     282        refreshData: function(data) {
    257283                // These variables never change after the inital load
    258284                if (data.isPrivate)     this._is_private    = data.isPrivate;
     
    264290                if (data.creator)       this._creator       = data.creator;
    265291                if (data.dateCreated)   this._creator_date  = data.dateCreated;
    266                 if (data.leftUntilDone) this._leftUntilDone = data.leftUntilDone;
    267                 if (data.sizeWhenDone)  this._sizeWhenDone  = data.sizeWhenDone;
     292                if (data.leftUntilDone) this._leftUntilDone = data.leftUntilDone;
     293                if (data.sizeWhenDone)  this._sizeWhenDone  = data.sizeWhenDone;
    268294                if (data.path)          this._torrent_file  = data.path;//FIXME
    269295                if (data.name) {
     
    290316                this._total_seeders         = Math.max( 0, data.seeders );
    291317                this._state                 = data.status;
    292         },
    293 
    294         refreshHTML: function()
    295         {
     318               
     319                if (data.files) {
     320                        for (var i = 0; i < data.files.length; i++) {
     321                                var file_data      = data.files[i];
     322                                if (data.priorities) { file_data.priority = data.priorities[i]; }
     323                                if (data.wanted)     { file_data.wanted   = data.wanted[i]; }
     324                                this._files[i].readAttributes(file_data);
     325                        }
     326                }
     327        },
     328
     329        refreshHTML: function() {
    296330                var progress_details;
    297331                var peer_details;
     
    427461               
    428462                setInnerHTML( root._peer_details_container[0], peer_details );
     463               
     464                // Update individual files within a torrent
     465                jQuery.each(this._files, function () {
     466                        this.refreshHTML();
     467                } );
     468
    429469        },
    430470
     
    588628        return pos >= 0 ? torrents[pos] : null;
    589629};
     630
     631function TorrentFile(file_data) {
     632        this.initialize(file_data);
     633}
     634
     635TorrentFile.prototype = {
     636        initialize: function(file_data) {
     637                this._torrent = file_data.torrent;
     638                var pos = file_data.name.indexOf('/');
     639                if (pos >= 0)
     640                        this.name = file_data.name.substring(pos + 1);
     641                else
     642                        this.name = file_data.name;
     643                this.readAttributes(file_data);
     644               
     645                this._element = $('<li/>').append(
     646                        $('<div/>').addClass('file_wanted_control').
     647                        bind('click', { file: this }, this.fileWantedControlClicked)
     648                       
     649                ).append(
     650                        this._priority_control = $('<div/>').addClass('file_priority_control').
     651                        bind('click', { file: this }, this.filePriorityControlClicked)
     652                       
     653                ).append(
     654                        $('<div/>').addClass('inspector_torrent_file_list_entry_name').
     655                        append(this.name)
     656                       
     657                ).append(
     658                        this._progress = $('<div/>').addClass('inspector_torrent_file_list_entry_progress')
     659                )
     660        },
     661       
     662        readAttributes: function(file_data) {
     663                if (undefined != file_data.index)          this._index  = file_data.index;
     664                if (undefined != file_data.bytesCompleted) this._done   = file_data.bytesCompleted;
     665                if (undefined != file_data.length)         this._size   = file_data.length;
     666                if (undefined != file_data.priority)       this._prio   = file_data.priority;
     667                if (undefined != file_data.wanted)         this._wanted = file_data.wanted;
     668        },
     669       
     670        element: function() {
     671                return this._element;
     672        },
     673       
     674        setPriority: function(priority) {
     675                var priority_level = { high: 1, normal: 0, low: -1 }[priority];
     676                if (this._prio == priority_level) { return; }
     677                this._prio = priority_level;
     678                this._torrent._controller.changeFileCommand("priority-" + priority, this._torrent, this);
     679                this.refreshPriorityHTML();
     680        },
     681       
     682        setWanted: function(wanted) {
     683                this._wanted = wanted;
     684                var command;
     685               
     686                if (wanted) {
     687                        this.element().removeClass('skip');
     688                        command = 'files-wanted'
     689                } else {
     690                        this.element().addClass('skip');
     691                        command = 'files-unwanted';
     692                }
     693                this._torrent._controller.changeFileCommand(command, this._torrent, this);
     694        },
     695       
     696        toggleWanted: function() {
     697                this.setWanted(!this._wanted);
     698        },
     699       
     700        refreshHTML: function() {
     701                this.refreshProgressHTML();
     702                this.refreshWantedHTML();
     703                this.refreshPriorityHTML();
     704        },
     705       
     706        refreshProgressHTML: function() {
     707                progress_details = Math.formatBytes(this._done) + ' of ' +
     708                                                        Math.formatBytes(this._size) + ' (' +
     709                                                        Math.ratio(100 * this._done, this._size) + '%)';
     710                setInnerHTML(this._progress[0], progress_details);
     711        },
     712       
     713        refreshWantedHTML: function() {
     714                var element = this.element();
     715                if (this._wanted && element.hasClass('skip'))
     716                        this.element().removeClass('skip');
     717                else if (!this._wanted && !element.hasClass('skip'))
     718                        this.element().addClass('skip');
     719               
     720                if (this._done < this._size && this.element().hasClass('complete'))
     721                        this.element().removeClass('complete');
     722                else if (!this.element().hasClass('complete'))
     723                        this.element().addClass('complete');
     724        },
     725       
     726        refreshPriorityHTML: function() {
     727                if (this['_last_refreshed_prio'] == this._prio) { return; }
     728                var priority = { '1': 'high', '0': 'normal', '-1': 'low' }[new String(this._prio)];
     729                var off_priorities = [ 'high', 'normal', 'low' ].sort(function(a,b) { return (a == priority) ? 1 : -1; } );
     730                this._priority_control.addClass(priority).
     731                        removeClass(off_priorities[0]).
     732                        removeClass(off_priorities[1]);
     733                this._last_refreshed_prio = this._prio;
     734        },
     735       
     736        fileWantedControlClicked: function(event) {
     737                event.data.file.toggleWanted();
     738        },
     739       
     740        filePriorityControlClicked: function(event) {
     741                var x = event.pageX;
     742                var target = this;
     743                while (target != null) {
     744                        x = x - target.offsetLeft;
     745                        target = target.offsetParent;
     746                }
     747                var file = event.data.file;
     748                if (x < 8) { file.setPriority('low'); }
     749                else if (x < 16) { file.setPriority('normal'); }
     750                else { file.setPriority('high'); }
     751        }
     752       
     753};
  • trunk/web/javascript/transmission.js

    r8011 r8062  
    5959                $('#inspector_tab_info').bind('click', this.inspectorTabClicked);
    6060                $('#inspector_tab_activity').bind('click', this.inspectorTabClicked);
     61                $('#inspector_tab_files').bind('click', this.inspectorTabClicked);
    6162                if (iPhone) {
    6263                        $('#torrent_inspector').bind('click', this.hideInspector);
     
    8485                // Get preferences & torrents from the daemon
    8586                this.remote.loadDaemonPrefs( );
    86                 this.remote.loadTorrents( );
     87                this.remote.loadTorrents( true );
    8788                this.togglePeriodicRefresh( true );
    8889        },
     
    9192                if (iPhone) {
    9293                        this.loadImages(
     94                                'images/buttons/info_general.png',
    9395                                'images/buttons/info_activity.png',
    94                                 'images/buttons/info_general.png',
     96                                'images/buttons/info_files.png',
    9597                                'images/buttons/toolbar_buttons.png',
    9698                                'images/graphics/filter_bar.png',
    9799                                'images/graphics/iphone_chrome.png',
    98                                 'images/graphics/logo.png',
    99                                 'images/progress/progress.png'
     100                                'images/graphics/logo.png'
    100101                        );
    101102                } else {
    102103                        this.loadImages(
     104                                'images/buttons/info_general.png',
    103105                                'images/buttons/info_activity.png',
    104                                 'images/buttons/info_general.png',
     106                                'images/buttons/info_files.png',
    105107                                'images/buttons/tab_backgrounds.png',
    106108                                'images/buttons/toolbar_buttons.png',
    107109                                'images/buttons/torrent_buttons.png',
     110                                'images/buttons/file_wanted_buttons.png',
     111                                'images/buttons/file_priority_buttons.png',
    108112                                'images/graphics/chrome.png',
    109113                                'images/graphics/filter_bar.png',
     
    293297                return s;
    294298        },
    295 
     299       
     300        getDeselectedTorrents: function() {
     301                var visible_torrent_ids = jQuery.map(this.getVisibleTorrents(), function(t) { return t.id(); } );
     302                var s = [ ];
     303                jQuery.each( this.getAllTorrents( ), function() {
     304                        var visible = (-1 != jQuery.inArray(this.id(), visible_torrent_ids));
     305                        if (!this.isSelected() || !visible)
     306                                s.push( this );
     307                } );
     308                return s;
     309        },
     310       
    296311        getVisibleRows: function()
    297312        {
     
    410425                        this.selectionChanged( );
    411426        },
    412    
     427
    413428        selectionChanged: function()
    414429        {
     
    580595                // Select the clicked tab, unselect the others,
    581596                // and display the appropriate info
    582                 var tab_ids = ['inspector_tab_info', 'inspector_tab_activity'];
     597                var tab_ids = $(this).parent('#inspector_tabs').find('.inspector_tab').map(
     598                        function() { return $(this).attr('id'); }
     599                );
    583600                for( var i=0; i<tab_ids.length; ++i ) {
    584601                        if (this.id == tab_ids[i]) {
     
    644661                        if( !this[Prefs._RefreshRate] )
    645662                             this[Prefs._RefreshRate] = 5;
    646                         this._periodic_refresh = setInterval('transmission.remote.loadTorrents()', this[Prefs._RefreshRate] * 1000 );
     663                        remote = this.remote;
     664                        this._periodic_refresh = setInterval(this.periodicRefresh, this[Prefs._RefreshRate] * 1000 );
    647665                } else {
    648666                        clearInterval(this._periodic_refresh);
    649667                        this._periodic_refresh = null;
    650668                }
     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);
     677        },
     678       
     679        scheduleFileRefresh: function() {
     680                this._periodicRefreshIterations = 0;
    651681        },
    652682
     
    657687         *--------------------------------------------*/
    658688   
    659         showPrefsDialog: function( )
    660         {
     689        showPrefsDialog: function( ) {
    661690                $('body').addClass('prefs_showing');
    662691                $('#prefs_container').show();
     
    866895               
    867896                $("#torrent_inspector_size, .inspector_row div").css('color', '#222');
    868 
     897               
    869898                if( torrents.length == 0 )
    870899                {
     
    891920                        setInnerHTML( $(ti+'comment')[0], na );
    892921                        setInnerHTML( $(ti+'creator')[0], na );
    893                         setInnerHTML( $(ti+'error')[0], na );           
     922                        setInnerHTML( $(ti+'error')[0], na );
     923                        this.updateVisibleFileLists();
    894924                        $("#torrent_inspector_size, .inspector_row > div:contains('N/A')").css('color', '#666');
    895925                        return;
     
    919949                }
    920950
    921                 for( i=0; i<torrents.length; ++i ) {
     951                for(i = 0; i < torrents.length; ++i ) {
    922952                        var t = torrents[i];
    923953                        sizeWhenDone         += t._sizeWhenDone;
     
    9801010               
    9811011                $(".inspector_row > div:contains('N/A')").css('color', '#666');
     1012                this.updateVisibleFileLists();
     1013        },
     1014       
     1015        updateVisibleFileLists: function() {
     1016                jQuery.each( this.getSelectedTorrents(), function() {
     1017                        this.showFileList();
     1018                } );
     1019                jQuery.each( this.getDeselectedTorrents(), function() {
     1020                        this.hideFileList();
     1021                } );
    9821022        },
    9831023   
     
    9911031                        this.showInspector( );
    9921032        },
    993    
     1033       
    9941034        showInspector: function() {
    9951035                $('#torrent_inspector').show();
     
    10551095        },
    10561096
     1097        updateTorrentsData: function( torrent_list ) {
     1098                var tr = this;
     1099                jQuery.each( torrent_list, function() {
     1100                        var t = Torrent.lookup(tr._torrents, this.id);
     1101                        if (t) t.refresh(this);
     1102                } );
     1103        },
     1104       
    10571105        /*
    10581106         * Process got some new torrent data from the server
    10591107         */
    1060         updateTorrents: function( torrent_list )
    1061         {
     1108        updateAllTorrents: function( torrent_list ) {
    10621109                var torrent_data;
    10631110                var new_torrents = [];
     
    10661113               
    10671114                // refresh existing torrents
     1115                this.updateTorrentsData( torrent_list );
     1116               
     1117                // partition existing and new torrents
     1118               
    10681119                for( var i=0, len=torrent_list.length; i<len; ++i ) {
    10691120                        var data = torrent_list[i];
     
    10721123                                new_torrents.push( data );
    10731124                        else {
    1074                                 t.refresh( data );
    10751125                                handled.push( t );
    10761126                        }
     
    10781128               
    10791129                // Add any torrents that aren't already being displayed
     1130                // if file data is available
    10801131                if( new_torrents.length ) {
    1081                         for( var i=0, len=new_torrents.length; i<len; ++i ) {
    1082                                 var t = new Torrent( this, new_torrents[i] );
    1083                                 this._torrents.push( t );
    1084                                 handled.push( t );
     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();
    10851143                        }
    1086                         this._torrents.sort( Torrent.compareById );
    10871144                }
    10881145               
     
    11001157                                        e.hide( );
    11011158                                }
     1159                                t.hideFileList();
    11021160                                this._torrents.splice( pos, 1 );
    11031161                                removedAny = true;
     
    11931251                                args.iframe = true;
    11941252                                args.success = function( data ) {
    1195                                         tr.remote.loadTorrents( );
     1253                                        tr.remote.loadTorrents( true );
    11961254                                        tr.togglePeriodicRefresh( true );
    11971255                                };
    1198                                 this.togglePeriodicRefresh( false );
     1256                                tr.togglePeriodicRefresh( false );
    11991257                                $('#torrent_upload_form').ajaxSubmit( args );
    12001258                        }
     
    12901348        stopTorrents: function( torrents ) {
    12911349                this.remote.stopTorrents( torrents );
     1350        },
     1351        changeFileCommand: function(command, torrent, file) {
     1352                this.remote.changeFileCommand(command, torrent, file)
    12921353        },
    12931354   
  • trunk/web/javascript/transmission.remote.js

    r8011 r8062  
    5656                transmission.togglePeriodicRefresh(false);
    5757        },
    58 
    59         sendRequest: function( url, data, success, contentType )
    60         {
    61                 var o = { };
    62                 o.cache = false;
    63                 o.contentType = contentType;
    64                 o.data = data;
    65                 o.dataType = 'json';
    66                 o.error = this.ajaxError;
    67                 o.success = success;
    68                 o.type = 'POST';
    69                 o.url = url;
    70                 $.ajax( o );
     58       
     59        sendRequest: function( data, success ) {
     60                $.ajax( {
     61                        url: RPC._Root,
     62                        type: 'POST',
     63                        contentType: 'json',
     64                        dataType: 'json',
     65                        cache: false,
     66                        data: $.toJSON(data),
     67                        error: this.ajaxError,
     68                        success: success
     69                } );
    7170        },
    7271
    7372        loadDaemonPrefs: function() {
    7473                var tr = this._controller;
    75                 var o = { };
    76                 o.method = 'session-get';
    77                 this.sendRequest( RPC._Root, $.toJSON(o), function(data) {
     74                var o = { method: 'session-get' };
     75                this.sendRequest( o, function(data) {
    7876                        var o = data.arguments;
    7977                        Prefs.getClutchPrefs( o );
    8078                        tr.updatePrefs( o );
    81                 }, "json" );
     79                } );
    8280        },
    8381
    84         loadTorrents: function() {
     82        loadTorrents: function(update_files) {
    8583                var tr = this._controller;
    86                 var o = { };
    87                 o.method = 'torrent-get'
    88                 o.arguments = { };
    89                 o.arguments.fields = [
    90                         'addedDate', 'announceURL', 'comment', 'creator',
    91                         'dateCreated', 'downloadedEver', 'error', 'errorString',
    92                         'eta', 'hashString', 'haveUnchecked', 'haveValid', 'id',
    93                         'isPrivate', 'leechers', 'leftUntilDone', 'name',
    94                         'peersConnected', 'peersGettingFromUs', 'peersSendingToUs',
    95                         'rateDownload', 'rateUpload', 'seeders', 'sizeWhenDone',
    96                         'status', 'swarmSpeed', 'totalSize', 'uploadedEver' ];
    97                 this.sendRequest( RPC._Root, $.toJSON(o), function(data) {
    98                         tr.updateTorrents( data.arguments.torrents );
    99                 }, "json" );
     84                var o = {
     85                        method: 'torrent-get',
     86                        arguments: { fields: [
     87                                'addedDate', 'announceURL', 'comment', 'creator',
     88                                'dateCreated', 'downloadedEver', 'error', 'errorString',
     89                                'eta', 'hashString', 'haveUnchecked', 'haveValid', 'id',
     90                                'isPrivate', 'leechers', 'leftUntilDone', 'name',
     91                                'peersConnected', 'peersGettingFromUs', 'peersSendingToUs',
     92                                'rateDownload', 'rateUpload', 'seeders', 'sizeWhenDone',
     93                                'status', 'swarmSpeed', 'totalSize', 'uploadedEver' ]
     94                        }
     95                };
     96                if (update_files) {
     97                        o.arguments.fields.push('files');
     98                        o.arguments.fields.push('wanted');
     99                        o.arguments.fields.push('priorities');
     100                }
     101                this.sendRequest( o, function(data) {
     102                        tr.updateAllTorrents( data.arguments.torrents );
     103                } );
    100104        },
    101 
     105       
     106        loadTorrentFiles: function( torrent_ids ) {
     107                var tr = this._controller;
     108                this.sendRequest( {
     109                        method: 'torrent-get',
     110                        arguments: { fields: [ 'files', 'wanted', 'priorities'] },
     111                        ids: torrent_ids
     112                }, function(data) {
     113                        tr.updateTorrentsData( data.arguments.torrents );
     114                } );
     115        },
     116       
     117        changeFileCommand: function( command, torrent, file ) {
     118                var remote = this;
     119                var torrent_ids = [ torrent.id() ];
     120                var o = {
     121                        method: 'torrent-set',
     122                        arguments: { ids: torrent_ids }
     123                };
     124                o.arguments[command] = [ file._index ];
     125                this.sendRequest( o, function( ) {
     126                        remote.loadTorrentFiles( torrent_ids );
     127                } );
     128        },
     129       
    102130        sendTorrentCommand: function( method, torrents ) {
    103131                var remote = this;
    104                 var o = { };
    105                 o.method = method;
    106                 o.arguments = { };
    107                 o.arguments.ids = [ ];
     132                var o = {
     133                        method: method,
     134                        arguments: { ids: [ ] }
     135                };
    108136                if( torrents != null )
    109137                        for( var i=0, len=torrents.length; i<len; ++i )
    110138                                o.arguments.ids.push( torrents[i].id() );
    111                 this.sendRequest( RPC._Root, $.toJSON(o), function( ) {
     139                this.sendRequest( o, function( ) {
    112140                        remote.loadTorrents();
    113                 }, "json" );
     141                } );
    114142        },
     143       
    115144        startTorrents: function( torrents ) {
    116145                this.sendTorrentCommand( 'torrent-start', torrents );
     
    150179        savePrefs: function( args ) {
    151180                var remote = this;
    152                 var o = { };
    153                 o.method = 'session-set';
    154                 o.arguments = args;
    155                 this.sendRequest( RPC._Root, $.toJSON(o), function(){
     181                var o = {
     182                        method: 'session-set',
     183                        arguments: args
     184                };
     185                this.sendRequest( o, function() {
    156186                        remote.loadDaemonPrefs();
    157                 }, "json" );
     187                } );
    158188        }
    159189};
  • trunk/web/stylesheets/common.css

    r8054 r8062  
    515515        z-index: 2;
    516516        text-align: left;
     517        overflow: auto;
    517518}
    518519div#torrent_inspector #torrent_inspector_name {
     
    533534}
    534535div#inspector_tabs {
     536        width: 189px;
    535537        margin: 0 auto;
    536538        padding-top: 10px;
    537         width: 140px;
    538539}
    539540.inspector_tab {
     
    549550}
    550551.inspector_container {
    551         margin: 10px;
    552         width: 330px; /* inspector_width==350 - ((margin==10)*2) */
     552        margin: 3%;
     553        width: 96%;
    553554}
    554555.inspector_group {
     
    575576        width: 230px; /* inspector_container_width==330 - inspector_label_width==100 */
    576577}
     578
     579/* Files Inspector Tab */
     580#inspector_file_list {
     581        padding: 0 0 0 0;
     582        margin: 0 0 0 0;
     583        text-align: left;
     584        cursor: default;
     585        overflow: hidden;
     586}
     587ul.inspector_torrent_file_list {
     588        width: 100%;
     589        margin: 0  0 0 0;
     590        padding-bottom: 10px;
     591        text-align: left;
     592        display: block;
     593        cursor: default;
     594        list-style-type: none;
     595        list-style: none;
     596        list-style-image: none;
     597}
     598li.inspector_torrent_file_list_entry {
     599        padding: 3px 0 3px 2px;
     600        display: block;
     601}
     602
     603li.inspector_torrent_file_list_entry.skip {
     604        color: #666;
     605}
     606
     607li.inspector_torrent_file_list_entry.even {
     608        background-color: #EEEEEE;
     609}
     610div.inspector_torrent_file_list_entry_name {
     611        font-size: 1.2em;
     612        font-weight: bold;
     613        color: #222;
     614        margin-left: 20px;
     615}
     616li.inspector_torrent_file_list_entry.skip>.inspector_torrent_file_list_entry_name {
     617        color: #666;
     618}
     619li.inspector_torrent_file_list_entry.even {
     620        background-color: #EEEEEE;
     621}
     622div.inspector_torrent_file_list_entry_progress {
     623        font-size: 1em;
     624        color: #666;
     625        margin-left: 20px;
     626}
     627div.file_wanted_control {
     628        background-position: left -16px;
     629        float: left;
     630        position: absolute;
     631        cursor: pointer;
     632        margin: 0 0 0 0;
     633        width: 16px;
     634        height: 16px;
     635        background-image: url('../images/buttons/file_wanted_buttons.png');
     636        background-repeat: no-repeat;
     637        background-color: transparent;
     638}
     639
     640li.inspector_torrent_file_list_entry.skip>.file_wanted_control {
     641        background-position: left 0px;
     642}
     643
     644li.inspector_torrent_file_list_entry.complete>.file_wanted_control {
     645        background-position: -16px -16px;
     646}
     647
     648li.inspector_torrent_file_list_entry.complete.skip>.file_wanted_control {
     649        background-position: -16px 0px;
     650}
     651
     652div.file_priority_control {
     653        float: right;
     654        margin: 0 0 0 0;
     655        width: 24px;
     656        height: 12px;
     657        background-image: url('../images/buttons/file_priority_buttons.png');
     658        background-repeat: no-repeat;
     659        background-color: transparent;
     660        cursor: pointer;
     661}
     662div.file_priority_control.high {
     663        background-position: left -12px;
     664}
     665div.file_priority_control.high:hover {
     666        background-position: right -12px;
     667}
     668div.file_priority_control.normal {
     669        background-position: left -24px;
     670}
     671div.file_priority_control.normal:hover {
     672        background-position: right -24px;
     673}
     674div.file_priority_control.low {
     675        background-position: left 0px;
     676}
     677div.file_priority_control.low:hover {
     678        background-position: right 0px;
     679}
     680
    577681
    578682/*--------------------------------------
Note: See TracChangeset for help on using the changeset viewer.