184 lines
4.2 KiB
JavaScript
184 lines
4.2 KiB
JavaScript
/**
|
|
* Copyright © Mnemosyne LLC
|
|
*
|
|
* This file is licensed under the GPLv2.
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
*/
|
|
|
|
function FileRow(torrent, i)
|
|
{
|
|
var fields = {
|
|
have: 0,
|
|
index: 0,
|
|
isDirty: false,
|
|
isWanted: true,
|
|
priority: 0,
|
|
me: this,
|
|
size: 0,
|
|
torrent: null
|
|
},
|
|
|
|
elements = {
|
|
priority_control: null,
|
|
progress: null,
|
|
root: null
|
|
},
|
|
|
|
initialize = function(torrent, i) {
|
|
fields.torrent = torrent;
|
|
fields.index = i;
|
|
createRow(torrent, i);
|
|
},
|
|
|
|
readAttributes = function(file) {
|
|
if (fields.have !== file.bytesCompleted) {
|
|
fields.have = file.bytesCompleted;
|
|
fields.isDirty = true;
|
|
}
|
|
if (fields.size !== file.length) {
|
|
fields.size = file.length;
|
|
fields.isDirty = true;
|
|
}
|
|
if (fields.priority !== file.priority) {
|
|
fields.priority = file.priority;
|
|
fields.isDirty = true;
|
|
}
|
|
if (fields.isWanted !== file.wanted) {
|
|
fields.isWanted = file.wanted;
|
|
fields.isDirty = true;
|
|
}
|
|
},
|
|
|
|
refreshWantedHTML = function()
|
|
{
|
|
var e = elements.root,
|
|
c = [ e.classNameConst ];
|
|
|
|
if (!fields.isWanted) { c.push('skip'); }
|
|
if (isDone()) { c.push('complete'); }
|
|
e.className = c.join(' ');
|
|
},
|
|
refreshPriorityHTML = function()
|
|
{
|
|
var e = elements.priority_control,
|
|
c = [ e.classNameConst ];
|
|
|
|
switch(fields.priority) {
|
|
case -1 : c.push('low'); break;
|
|
case 1 : c.push('high'); break;
|
|
default : c.push('normal'); break;
|
|
}
|
|
e.className = c.join(' ');
|
|
},
|
|
refreshProgressHTML = function()
|
|
{
|
|
var pct = 100 * (fields.size ? (fields.have / fields.size) : 1.0),
|
|
c = [ Transmission.fmt.size(fields.have),
|
|
' of ',
|
|
Transmission.fmt.size(fields.size),
|
|
' (',
|
|
Transmission.fmt.percentString(pct),
|
|
'%)' ].join('');
|
|
setInnerHTML(elements.progress, c);
|
|
},
|
|
refreshHTML = function() {
|
|
if (fields.isDirty) {
|
|
fields.isDirty = false;
|
|
refreshProgressHTML();
|
|
refreshWantedHTML();
|
|
refreshPriorityHTML();
|
|
}
|
|
},
|
|
refresh = function() {
|
|
readAttributes(fields.torrent.getFile(fields.index));
|
|
refreshHTML();
|
|
},
|
|
|
|
isDone = function () {
|
|
return fields.have >= fields.size;
|
|
},
|
|
|
|
createRow = function(torrent, i) {
|
|
var file = torrent.getFile(i),
|
|
name, root, wanted_div, pri_div, file_div, prog_div;
|
|
|
|
root = document.createElement('li');
|
|
root.id = 't' + fields.torrent.getId() + 'f' + fields.index;
|
|
root.classNameConst = 'inspector_torrent_file_list_entry ' + ((i%2)?'odd':'even');
|
|
root.className = root.classNameConst;
|
|
|
|
wanted_div = document.createElement('div');
|
|
wanted_div.className = "file_wanted_control";
|
|
$(wanted_div).click(function(){ fireWantedChanged(!fields.isWanted); });
|
|
|
|
pri_div = document.createElement('div');
|
|
pri_div.classNameConst = "file_priority_control";
|
|
pri_div.className = pri_div.classNameConst;
|
|
$(pri_div).bind('click',function(ev){
|
|
var prio,
|
|
x = ev.pageX,
|
|
e = ev.target;
|
|
while (e) {
|
|
x -= e.offsetLeft;
|
|
e = e.offsetParent;
|
|
}
|
|
// ugh.
|
|
if (isMobileDevice) {
|
|
if (x < 8) prio = -1;
|
|
else if (x < 27) prio = 0;
|
|
else prio = 1;
|
|
} else {
|
|
if (x < 12) prio = -1;
|
|
else if (x < 23) prio = 0;
|
|
else prio = 1;
|
|
}
|
|
firePriorityChanged(prio);
|
|
});
|
|
|
|
name = file.name || 'Unknown';
|
|
name = name.substring(name.lastIndexOf('/')+1);
|
|
name = name.replace(/([\/_\.])/g, "$1​");
|
|
file_div = document.createElement('div');
|
|
file_div.className = "inspector_torrent_file_list_entry_name";
|
|
file_div.innerHTML = name;
|
|
|
|
prog_div = document.createElement('div');
|
|
prog_div.className = "inspector_torrent_file_list_entry_progress";
|
|
|
|
root.appendChild(wanted_div);
|
|
root.appendChild(pri_div);
|
|
root.appendChild(file_div);
|
|
root.appendChild(prog_div);
|
|
|
|
elements.root = root;
|
|
elements.priority_control = pri_div;
|
|
elements.progress = prog_div;
|
|
|
|
refresh();
|
|
return root;
|
|
},
|
|
|
|
fireWantedChanged = function(do_want) {
|
|
$(fields.me).trigger('wantedToggled',[ fields.me, do_want ]);
|
|
},
|
|
firePriorityChanged = function(priority) {
|
|
$(fields.me).trigger('priorityToggled',[ fields.me, priority ]);
|
|
};
|
|
|
|
/***
|
|
**** PUBLIC
|
|
***/
|
|
|
|
this.getElement = function() {
|
|
return elements.root;
|
|
};
|
|
this.getIndex = function() {
|
|
return fields.index;
|
|
};
|
|
this.isEditable = function () {
|
|
return (fields.torrent.getFileCount()>1) && !isDone();
|
|
};
|
|
|
|
initialize(torrent, i);
|
|
};
|