From fe8743be5c9d95dc09f665937046396f3774fa82 Mon Sep 17 00:00:00 2001 From: Kevin Glowacz Date: Tue, 10 Nov 2009 05:42:57 +0000 Subject: [PATCH] (trunk web) Add turtle mode. Patch from Grug. Fixes #2157 --- web/index.html | 141 ++++++++++++------ web/javascript/common.js | 27 +++- web/javascript/jquery/jquery.transmenu.min.js | 2 +- web/javascript/transmission.js | 68 +++++++-- web/javascript/transmission.remote.js | 7 + web/stylesheets/common.css | 59 +++++++- 6 files changed, 246 insertions(+), 58 deletions(-) diff --git a/web/index.html b/web/index.html index b1613ad07..ea9221529 100755 --- a/web/index.html +++ b/web/index.html @@ -206,52 +206,101 @@

Preferences

-
- -
- - +
+
    +
  • General
  • +
  • Speed
  • +
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + + +
+
+
-
- - -
-
-
- -
- - -
-
-
- -
- - -
-
-
- -
- - - - -
-
- - - - -
-
-
- -
- - - +
Save @@ -341,6 +390,8 @@ +
 
+
diff --git a/web/javascript/common.js b/web/javascript/common.js index b7370ecbf..82bc7b5fd 100644 --- a/web/javascript/common.js +++ b/web/javascript/common.js @@ -252,6 +252,29 @@ String.prototype.compareTo = function( that ) { return 0; } +/** + * @brief Switch between different dialog tabs + */ +function changeTab(tab, id) { + for ( var x = 0, node; tab.parentNode.childNodes[x]; x++ ) { + node = tab.parentNode.childNodes[x]; + if (node == tab) { + node.className = "prefs_tab_enabled"; + } else { + node.className = "prefs_tab_disabled"; + } + } + for ( x = 0; tab.parentNode.parentNode.childNodes[x]; x++ ) { + node = tab.parentNode.parentNode.childNodes[x]; + if (node.tagName == "DIV") { + if (node.id == id) { + node.style.display = "block"; + } else { + node.style.display = "none"; + } + } + } +} /*** **** Preferences @@ -287,6 +310,7 @@ Prefs._SortByProgress = 'percent_completed'; Prefs._SortByState = 'state'; Prefs._SortByTracker = 'tracker'; +Prefs._TurtleState = 'turtle-state'; Prefs._Defaults = { @@ -296,7 +320,8 @@ Prefs._Defaults = 'show_filter': true, 'show_inspector': false, 'sort_direction': 'ascending', - 'sort_method': 'name' + 'sort_method': 'name', + 'turtle-state' : false }; /* diff --git a/web/javascript/jquery/jquery.transmenu.min.js b/web/javascript/jquery/jquery.transmenu.min.js index 0d60ae7ac..8eb058aca 100644 --- a/web/javascript/jquery/jquery.transmenu.min.js +++ b/web/javascript/jquery/jquery.transmenu.min.js @@ -25,6 +25,6 @@ if(!$(this).is('.trans_menu')){$(this).addClass('trans_menu');} $('ul',this).shadowBox();$(this).bind('closemenu',function(){clean();});var liElems=$(this).children('li');for(var j=0;jdiv').addClass('inner');if(transMenuSettings.arrow_char){var arrow_markup=$(""+transMenuSettings.arrow_char+'');if($.browser.mozilla&&+$.browser.version.replace(/\./g,'').slice(0,3)<191){arrow_markup.css('margin-top','-13px');} $('div.inner div.outerbox',this).before(arrow_markup);} -$(this).wrap('
').after('
');});};$.fn.transMenu.setDefaults=function(o){$.extend(defaults,o);};$.fn.shadowBox=function(){return this.each(function(){var outer=$('
').get(0);if($(this).css('position')=='absolute'){$(outer).css({position:'relative',width:this.offsetWidth,height:this.offsetHeight});}else{$(outer).css('position','absolute');} +});};$.fn.transMenu.setDefaults=function(o){$.extend(defaults,o);};$.fn.shadowBox=function(){return this.each(function(){var outer=$('
').get(0);if($(this).css('position')=='absolute'){$(outer).css({position:'relative',width:this.offsetWidth,height:this.offsetHeight});}else{$(outer).css('position','absolute');} $(this).addClass('innerBox').wrap(outer).before('
');});};$.fn.selectMenuItem=function(){if(this.find('span.selected').length==0){this.prepend($(""+transMenuSettings.selected_char+""));} return this;};$.fn.deselectMenuItem=function(){return this.find('span.selected').remove();};$.fn.menuItemIsSelected=function(){return(this.find('span.selected').length>0);};$.fn.deselectMenuSiblings=function(){this.parent().find('span.selected').remove();this.selectMenuItem();return this;};})(jQuery); diff --git a/web/javascript/transmission.js b/web/javascript/transmission.js index 08939e8b0..f61ec491a 100644 --- a/web/javascript/transmission.js +++ b/web/javascript/transmission.js @@ -52,6 +52,7 @@ Transmission.prototype = $('#open_link').bind('click', function(e){ tr.openTorrentClicked(e); }); $('#upload_confirm_button').bind('click', function(e){ tr.confirmUploadClicked(e); return false;}); $('#upload_cancel_button').bind('click', function(e){ tr.cancelUploadClicked(e); return false; }); + $('#turtle_button').bind('click', function(e){ tr.toggleTurtleClicked(e); return false; }); if (iPhone) { $('#inspector_close').bind('click', function(e){ tr.hideInspector(); }); $('#preferences_link').bind('click', function(e){ tr.releaseClutchPreferencesButton(e); }); @@ -65,6 +66,7 @@ Transmission.prototype = this.createContextMenu(); this.createSettingsMenu(); } + this.initTurtleDropDowns(); this._torrent_list = $('#torrent_list')[0]; this._inspector_file_list = $('#inspector_file_list')[0]; @@ -309,6 +311,19 @@ Transmission.prototype = }, + initTurtleDropDowns: function() { + var i, out, hour, mins; + // Build the list of times + out = ""; + for (i = 0; i < 24 * 4; i++) { + hour = parseInt(i / 4); + mins = ((i % 4) * 15); + out += ""; + } + setInnerHTML( $('#turtle_start_time')[0], out ); + setInnerHTML( $('#turtle_end_time')[0], out ); + }, + /*-------------------------------------------- * * U T I L I T I E S @@ -604,15 +619,22 @@ Transmission.prototype = // pass the new prefs upstream to the RPC server var o = { }; - o[RPC._PeerPort] = parseInt( $('#prefs_form #port')[0].value ); - o[RPC._UpSpeedLimit] = parseInt( $('#prefs_form #upload_rate')[0].value ); - o[RPC._DownSpeedLimit] = parseInt( $('#prefs_form #download_rate')[0].value ); - o[RPC._DownloadDir] = $('#prefs_form #download_location')[0].value; - o[RPC._UpSpeedLimited] = $('#prefs_form #limit_upload')[0].checked; - o[RPC._DownSpeedLimited] = $('#prefs_form #limit_download')[0].checked; - o[RPC._Encryption] = $('#prefs_form #encryption')[0].checked - ? RPC._EncryptionRequired - : RPC._EncryptionPreferred; + o[RPC._PeerPort] = parseInt( $('#prefs_form #port')[0].value ); + o[RPC._UpSpeedLimit] = parseInt( $('#prefs_form #upload_rate')[0].value ); + o[RPC._DownSpeedLimit] = parseInt( $('#prefs_form #download_rate')[0].value ); + o[RPC._DownloadDir] = $('#prefs_form #download_location')[0].value; + o[RPC._UpSpeedLimited] = $('#prefs_form #limit_upload')[0].checked; + o[RPC._DownSpeedLimited] = $('#prefs_form #limit_download')[0].checked; + o[RPC._Encryption] = $('#prefs_form #encryption')[0].checked + ? RPC._EncryptionRequired + : RPC._EncryptionPreferred; + o[RPC._TurtleDownSpeedLimit] = parseInt( $('#prefs_form #turtle_download_rate')[0].value ); + o[RPC._TurtleUpSpeedLimit] = parseInt( $('#prefs_form #turtle_upload_rate')[0].value ); + o[RPC._TurtleTimeEnabled] = $('#prefs_form #turtle_schedule')[0].checked; + o[RPC._TurtleTimeBegin] = parseInt( $('#prefs_form #turtle_start_time').val() ); + o[RPC._TurtleTimeEnd] = parseInt( $('#prefs_form #turtle_end_time').val() ); + o[RPC._TurtleTimeDay] = parseInt( $('#prefs_form #turtle_days').val() ); + tr.remote.savePrefs( o ); tr.hidePrefsDialog( ); @@ -730,6 +752,25 @@ Transmission.prototype = } }, + toggleTurtleClicked: function() { + // Toggle the value + this[Prefs._TurtleState] = !this[Prefs._TurtleState]; + // Store the result + var args = { }; + args[RPC._TurtleState] = this[Prefs._TurtleState]; + this.remote.savePrefs( args ); + }, + + updateTurtleButton: function() { + if ( this[Prefs._TurtleState] ) { + $('#turtle_button').addClass('turtleEnabled'); + $('#turtle_button').removeClass('turtleDisabled'); + } else { + $('#turtle_button').removeClass('turtleEnabled'); + $('#turtle_button').addClass('turtleDisabled'); + } + }, + /*-------------------------------------------- * * I N T E R F A C E F U N C T I O N S @@ -782,6 +823,12 @@ Transmission.prototype = $('input#upload_rate')[0].value = up_limit; $('input#refresh_rate')[0].value = prefs[Prefs._RefreshRate]; $('div.encryption input')[0].checked = prefs[RPC._Encryption] == RPC._EncryptionRequired; + $('input#turtle_download_rate')[0].value = prefs[RPC._TurtleDownSpeedLimit]; + $('input#turtle_upload_rate')[0].value = prefs[RPC._TurtleUpSpeedLimit]; + $('input#turtle_schedule')[0].checked = prefs[RPC._TurtleTimeEnabled]; + $('select#turtle_start_time').val( prefs[RPC._TurtleTimeBegin] ); + $('select#turtle_end_time').val( prefs[RPC._TurtleTimeEnd] ); + $('select#turtle_days').val( prefs[RPC._TurtleTimeDay] ); if (!iPhone) { @@ -795,6 +842,9 @@ Transmission.prototype = : '#unlimited_upload_rate'; $(key).deselectMenuSiblings().selectMenuItem(); } + + this[Prefs._TurtleState] = prefs[RPC._TurtleState]; + this.updateTurtleButton(); }, setSearch: function( search ) { diff --git a/web/javascript/transmission.remote.js b/web/javascript/transmission.remote.js index 6cc84730a..96ebcd693 100644 --- a/web/javascript/transmission.remote.js +++ b/web/javascript/transmission.remote.js @@ -20,6 +20,13 @@ RPC._DownloadDir = 'download-dir'; RPC._PeerPort = 'peer-port'; RPC._UpSpeedLimited = 'speed-limit-up-enabled'; RPC._DownSpeedLimited = 'speed-limit-down-enabled'; +RPC._TurtleState = 'alt-speed-enabled'; +RPC._TurtleUpSpeedLimit = 'alt-speed-up'; +RPC._TurtleDownSpeedLimit = 'alt-speed-down'; +RPC._TurtleTimeEnabled = 'alt-speed-time-enabled'; +RPC._TurtleTimeBegin = 'alt-speed-time-begin'; +RPC._TurtleTimeEnd = 'alt-speed-time-end'; +RPC._TurtleTimeDay = 'alt-speed-time-day'; function TransmissionRemote( controller ) { diff --git a/web/stylesheets/common.css b/web/stylesheets/common.css index c8f555a50..92e0d04a4 100644 --- a/web/stylesheets/common.css +++ b/web/stylesheets/common.css @@ -739,6 +739,22 @@ div.torrent_footer div#disk_space_container { padding: 0px; } +div.torrent_footer div#turtle_button { + height: 22px; + width: 32px !important; + margin: 0 0 0 38px; + padding: 0; + -moz-user-select: none; + -webkit-user-select: none; +} + +.turtleEnabled { + background: transparent url('../images/graphics/chrome.png') -32px -119px no-repeat; +} +.turtleDisabled { + background: transparent url('../images/graphics/chrome.png') left -97px no-repeat; +} + /*-------------------------------------- * * D I A L O G S @@ -865,12 +881,12 @@ iframe#torrent_upload_frame { div#prefs_container label { display: block; + margin: 0 0 0 2px; } div#prefs_container label.category { clear: both; font-size: 1.2em; - margin: 0 0 0 2px; } div#prefs_container label.item { @@ -889,7 +905,11 @@ div#prefs_container div.formdiv.checkbox label.item { } div#prefs_container div.limit_total label.item { - width: 91px; + width: 102px; +} + +div#prefs_container div.limit_turtle label.item { + width: 120px; } div#prefs_container div.preference input[type=checkbox] { @@ -935,6 +955,41 @@ div#prefs_container h2.dialog_heading { display: none; } +div#prefs_container div#prefs_tabs { + clear: both; +} + +div#prefs_container div#prefs_tabs ul { + margin: 0; + padding: 0; +} +div#prefs_container div#prefs_tabs ul li { + display: block; + float: left; + font-size: 1.2em; + color: #323232; + text-align: center; + padding: 2px 20px; + border-left: 1px solid #787878; + border-right: 1px solid #787878; + border-top: 1px solid #787878; +} +.prefs_tab_disabled { + background: #C0C8D6 url('../images/graphics/filter_bar.png') bottom repeat-x; +} +.prefs_tab_enabled { + background: none; +} +div.dialog_container div#prefs_tabs ul li.prefs_tab_disabled:hover, +div.dialog_container div#prefs_tabs ul li.prefs_tab_disabled:active { + background: none; +} +div#prefs_container div#prefs_tabs div.prefs_tab { + border: 1px solid #787878; + clear: both; + padding: 2px 0; +} + div#prefs_container div#pref_error { display: none; width: 395px;