From 2e2851dc13d73352530dd4495c7e05603b2e520d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 23:38:38 +0200 Subject: Adding upstream version 2.1.2~dev0+20240219. Signed-off-by: Daniel Baumann --- deluge/ui/web/js/deluge-all/details/FilesTab.js | 236 ++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 deluge/ui/web/js/deluge-all/details/FilesTab.js (limited to 'deluge/ui/web/js/deluge-all/details/FilesTab.js') diff --git a/deluge/ui/web/js/deluge-all/details/FilesTab.js b/deluge/ui/web/js/deluge-all/details/FilesTab.js new file mode 100644 index 0000000..36ef968 --- /dev/null +++ b/deluge/ui/web/js/deluge-all/details/FilesTab.js @@ -0,0 +1,236 @@ +/** + * Deluge.details.FilesTab.js + * + * Copyright (c) Damien Churchill 2009-2010 + * + * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with + * the additional special exception to link portions of this program with the OpenSSL library. + * See LICENSE for more details. + */ + +Deluge.details.FilesTab = Ext.extend(Ext.ux.tree.TreeGrid, { + title: _('Files'), + + rootVisible: false, + + columns: [ + { + header: _('Filename'), + width: 330, + dataIndex: 'filename', + tpl: new Ext.XTemplate('{filename:htmlEncode}'), + }, + { + header: _('Size'), + width: 150, + dataIndex: 'size', + tpl: new Ext.XTemplate('{size:this.fsize}', { + fsize: function (v) { + return fsize(v); + }, + }), + }, + { + xtype: 'tgrendercolumn', + header: _('Progress'), + width: 150, + dataIndex: 'progress', + renderer: function (v) { + var progress = v * 100; + return Deluge.progressBar( + progress, + this.col.width, + progress.toFixed(2) + '%', + 0 + ); + }, + }, + { + header: _('Priority'), + width: 150, + dataIndex: 'priority', + tpl: new Ext.XTemplate( + '' + + '
' + + '{priority:this.getName}' + + '
', + { + getClass: function (v) { + return FILE_PRIORITY_CSS[v]; + }, + + getName: function (v) { + return _(FILE_PRIORITY[v]); + }, + } + ), + }, + ], + + selModel: new Ext.tree.MultiSelectionModel(), + + initComponent: function () { + Deluge.details.FilesTab.superclass.initComponent.call(this); + this.setRootNode(new Ext.tree.TreeNode({ text: _('Files') })); + }, + + clear: function () { + var root = this.getRootNode(); + if (!root.hasChildNodes()) return; + root.cascade(function (node) { + var parentNode = node.parentNode; + if (!parentNode) return; + if (!parentNode.ownerTree) return; + parentNode.removeChild(node); + }); + }, + + createFileTree: function (files) { + function walk(files, parentNode) { + for (var file in files.contents) { + var item = files.contents[file]; + if (item.type == 'dir') { + walk( + item, + parentNode.appendChild( + new Ext.tree.TreeNode({ + text: file, + filename: file, + size: item.size, + progress: item.progress, + priority: item.priority, + }) + ) + ); + } else { + parentNode.appendChild( + new Ext.tree.TreeNode({ + text: file, + filename: file, + fileIndex: item.index, + size: item.size, + progress: item.progress, + priority: item.priority, + leaf: true, + iconCls: 'x-deluge-file', + uiProvider: Ext.ux.tree.TreeGridNodeUI, + }) + ); + } + } + } + var root = this.getRootNode(); + walk(files, root); + root.firstChild.expand(); + }, + + update: function (torrentId) { + if (this.torrentId != torrentId) { + this.clear(); + this.torrentId = torrentId; + } + + deluge.client.web.get_torrent_files(torrentId, { + success: this.onRequestComplete, + scope: this, + torrentId: torrentId, + }); + }, + + updateFileTree: function (files) { + function walk(files, parentNode) { + for (var file in files.contents) { + var item = files.contents[file]; + var node = parentNode.findChild('filename', file); + node.attributes.size = item.size; + node.attributes.progress = item.progress; + node.attributes.priority = item.priority; + node.ui.updateColumns(); + if (item.type == 'dir') { + walk(item, node); + } + } + } + walk(files, this.getRootNode()); + }, + + onRender: function (ct, position) { + Deluge.details.FilesTab.superclass.onRender.call(this, ct, position); + deluge.menus.filePriorities.on('itemclick', this.onItemClick, this); + this.on('contextmenu', this.onContextMenu, this); + this.sorter = new Ext.tree.TreeSorter(this, { + folderSort: true, + }); + }, + + onContextMenu: function (node, e) { + e.stopEvent(); + var selModel = this.getSelectionModel(); + if (selModel.getSelectedNodes().length < 2) { + selModel.clearSelections(); + node.select(); + } + deluge.menus.filePriorities.showAt(e.getPoint()); + }, + + onItemClick: function (baseItem, e) { + switch (baseItem.id) { + case 'expandAll': + this.expandAll(); + break; + default: + var indexes = {}; + var walk = function (node) { + if (Ext.isEmpty(node.attributes.fileIndex)) return; + indexes[node.attributes.fileIndex] = + node.attributes.priority; + }; + this.getRootNode().cascade(walk); + + var nodes = this.getSelectionModel().getSelectedNodes(); + Ext.each(nodes, function (node) { + if (!node.isLeaf()) { + var setPriorities = function (node) { + if (Ext.isEmpty(node.attributes.fileIndex)) return; + indexes[node.attributes.fileIndex] = + baseItem.filePriority; + }; + node.cascade(setPriorities); + } else if (!Ext.isEmpty(node.attributes.fileIndex)) { + indexes[node.attributes.fileIndex] = + baseItem.filePriority; + return; + } + }); + + var priorities = new Array(Ext.keys(indexes).length); + for (var index in indexes) { + priorities[index] = indexes[index]; + } + + deluge.client.core.set_torrent_options( + [this.torrentId], + { file_priorities: priorities }, + { + success: function () { + Ext.each(nodes, function (node) { + node.attributes.priority = + baseItem.filePriority; + node.ui.updateColumns(); + }); + }, + scope: this, + } + ); + break; + } + }, + + onRequestComplete: function (files, options) { + if (!this.getRootNode().hasChildNodes()) { + this.createFileTree(files); + } else { + this.updateFileTree(files); + } + }, +}); -- cgit v1.2.3