1/** 2 * Copyright �� Mnemosyne LLC 3 * 4 * This file is licensed under the GPLv2. 5 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 6 */ 7 8function FileRow(torrent, depth, name, indices, even) 9{ 10 var fields = { 11 have: 0, 12 indices: [], 13 isWanted: true, 14 priorityLow: false, 15 priorityNormal: false, 16 priorityHigh: false, 17 me: this, 18 size: 0, 19 torrent: null 20 }, 21 22 elements = { 23 priority_low_button: null, 24 priority_normal_button: null, 25 priority_high_button: null, 26 progress: null, 27 root: null 28 }, 29 30 initialize = function(torrent, depth, name, indices, even) { 31 fields.torrent = torrent; 32 fields.indices = indices; 33 createRow(torrent, depth, name, even); 34 }, 35 36 refreshWantedHTML = function() 37 { 38 var e = $(elements.root); 39 e.toggleClass('skip', !fields.isWanted); 40 e.toggleClass('complete', isDone()); 41 $(e[0].checkbox).prop('disabled', !isEditable()); 42 $(e[0].checkbox).prop('checked', fields.isWanted); 43 }, 44 refreshProgressHTML = function() 45 { 46 var pct = 100 * (fields.size ? (fields.have / fields.size) : 1.0), 47 c = [ Transmission.fmt.size(fields.have), 48 ' of ', 49 Transmission.fmt.size(fields.size), 50 ' (', 51 Transmission.fmt.percentString(pct), 52 '%)' ].join(''); 53 setTextContent(elements.progress, c); 54 }, 55 refreshImpl = function() { 56 var i, 57 file, 58 have = 0, 59 size = 0, 60 wanted = false, 61 low = false, 62 normal = false, 63 high = false; 64 65 // loop through the file_indices that affect this row 66 for (i=0; i<fields.indices.length; ++i) { 67 file = fields.torrent.getFile (fields.indices[i]); 68 have += file.bytesCompleted; 69 size += file.length; 70 wanted |= file.wanted; 71 switch (file.priority) { 72 case -1: low = true; break; 73 case 0: normal = true; break; 74 case 1: high = true; break; 75 } 76 } 77 78 if ((fields.have != have) || (fields.size != size)) { 79 fields.have = have; 80 fields.size = size; 81 refreshProgressHTML(); 82 } 83 84 if (fields.isWanted !== wanted) { 85 fields.isWanted = wanted; 86 refreshWantedHTML(); 87 } 88 89 if (fields.priorityLow !== low) { 90 fields.priorityLow = low; 91 $(elements.priority_low_button).toggleClass('selected', low); 92 } 93 94 if (fields.priorityNormal !== normal) { 95 fields.priorityNormal = normal; 96 $(elements.priority_normal_button).toggleClass('selected', normal); 97 } 98 99 if (fields.priorityHigh !== high) { 100 fields.priorityHigh = high; 101 $(elements.priority_high_button).toggleClass('selected', high); 102 } 103 }, 104 105 isDone = function () { 106 return fields.have >= fields.size; 107 }, 108 isEditable = function () { 109 return (fields.torrent.getFileCount()>1) && !isDone(); 110 }; 111 112 createRow = function(torrent, depth, name, even) { 113 var e, root, box; 114 115 root = document.createElement('li'); 116 root.className = 'inspector_torrent_file_list_entry' + (even?'even':'odd'); 117 elements.root = root; 118 119 e = document.createElement('input'); 120 e.type = 'checkbox'; 121 e.className = "file_wanted_control"; 122 e.title = 'Download file'; 123 $(e).change(function(ev){ fireWantedChanged( $(ev.currentTarget).prop('checked')); }); 124 root.checkbox = e; 125 root.appendChild(e); 126 127 e = document.createElement('div'); 128 e.className = 'file-priority-radiobox'; 129 box = e; 130 131 e = document.createElement('div'); 132 e.className = 'low'; 133 e.title = 'Low Priority'; 134 $(e).click(function(){ firePriorityChanged(-1); }); 135 elements.priority_low_button = e; 136 box.appendChild(e); 137 138 e = document.createElement('div'); 139 e.className = 'normal'; 140 e.title = 'Normal Priority'; 141 $(e).click(function(){ firePriorityChanged(0); }); 142 elements.priority_normal_button = e; 143 box.appendChild(e); 144 145 e = document.createElement('div'); 146 e.title = 'High Priority'; 147 e.className = 'high'; 148 $(e).click(function(){ firePriorityChanged(1); }); 149 elements.priority_high_button = e; 150 box.appendChild(e); 151 152 root.appendChild(box); 153 154 e = document.createElement('div'); 155 e.className = "inspector_torrent_file_list_entry_name"; 156 setTextContent(e, name); 157 $(e).click(function(){ fireNameClicked(-1); }); 158 root.appendChild(e); 159 160 e = document.createElement('div'); 161 e.className = "inspector_torrent_file_list_entry_progress"; 162 root.appendChild(e); 163 $(e).click(function(){ fireNameClicked(-1); }); 164 elements.progress = e; 165 166 $(root).css('margin-left', '' + (depth*16) + 'px'); 167 168 refreshImpl(); 169 return root; 170 }, 171 172 fireWantedChanged = function(do_want) { 173 $(fields.me).trigger('wantedToggled',[ fields.indices, do_want ]); 174 }, 175 firePriorityChanged = function(priority) { 176 $(fields.me).trigger('priorityToggled',[ fields.indices, priority ]); 177 }, 178 fireNameClicked = function() { 179 $(fields.me).trigger('nameClicked',[ fields.me, fields.indices ]); 180 }; 181 182 /*** 183 **** PUBLIC 184 ***/ 185 186 this.getElement = function() { 187 return elements.root; 188 }; 189 this.refresh = function() { 190 refreshImpl(); 191 }; 192 193 initialize(torrent, depth, name, indices, even); 194}; 195