initial commit of the big javascript refactor

This commit is contained in:
Damien Churchill 2010-03-28 03:27:46 +01:00
parent 46a6576c68
commit 01bb9c4df5
49 changed files with 305 additions and 242 deletions

View File

@ -11,9 +11,13 @@
<link rel="stylesheet" type="text/css" href="${base}${stylesheet}" /> <link rel="stylesheet" type="text/css" href="${base}${stylesheet}" />
% endfor % endfor
<script type="text/javascript"> <script type="text/javascript">
${js_config} deluge = {
</script> author: 'Damien Churchill <damoxc@gmail.com>',
version: '${version}',
config: ${js_config}
}
</script>
<!-- Javascript --> <!-- Javascript -->
% for script in scripts: % for script in scripts:

View File

@ -500,5 +500,4 @@ Copyright:
} }
} }
}); });
deluge.connectionManager = new Deluge.ConnectionManager();
})(); })();

View File

@ -1,102 +0,0 @@
/*
Script: Deluge.Details.js
Contains all objects and functions related to the lower details panel and
it's containing tabs.
Copyright:
(C) Damien Churchill 2009-2010 <damoxc@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, write to:
The Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor
Boston, MA 02110-1301, USA.
In addition, as a special exception, the copyright holders give
permission to link the code of portions of this program with the OpenSSL
library.
You must obey the GNU General Public License in all respects for all of
the code used other than OpenSSL. If you modify file(s) with this
exception, you may extend this exception to your version of the file(s),
but you are not obligated to do so. If you do not wish to do so, delete
this exception statement from your version. If you delete this exception
statement from all source files in the program, then also delete it here.
*/
(function() {
Ext.namespace('Deluge.details');
Deluge.details.TabPanel = Ext.extend(Ext.TabPanel, {
constructor: function(config) {
config = Ext.apply({
region: 'south',
id: 'torrentDetails',
split: true,
height: 220,
minSize: 100,
collapsible: true,
margins: '0 5 5 5',
activeTab: 0
}, config);
Deluge.details.TabPanel.superclass.constructor.call(this, config);
},
clear: function() {
this.items.each(function(panel) {
if (panel.clear) {
panel.clear.defer(100, panel);
panel.disable();
}
});
},
update: function(tab) {
var torrent = deluge.torrents.getSelected();
if (!torrent) {
this.clear();
return;
}
this.items.each(function(tab) {
if (tab.disabled) tab.enable();
});
tab = tab || this.getActiveTab();
if (tab.update) tab.update(torrent.id);
},
/* Event Handlers */
// We need to add the events in onRender since Deluge.Torrents hasn't
// been created yet.
onRender: function(ct, position) {
Deluge.details.TabPanel.superclass.onRender.call(this, ct, position);
deluge.events.on('disconnect', this.clear, this);
deluge.torrents.on('rowclick', this.onTorrentsClick, this);
this.on('tabchange', this.onTabChange, this);
deluge.torrents.getSelectionModel().on('selectionchange', function(selModel) {
if (!selModel.hasSelection()) this.clear();
}, this);
},
onTabChange: function(panel, tab) {
this.update(tab);
},
onTorrentsClick: function(grid, rowIndex, e) {
this.update();
}
});
deluge.details = new Deluge.details.TabPanel();
})();

View File

@ -91,7 +91,7 @@ Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
})(); })();
// Create the Deluge namespace // Create the Deluge namespace
Deluge = { Ext.apply(Deluge, {
// private // private
progressTpl: '<div class="x-progress-wrap x-progress-renderered">' + progressTpl: '<div class="x-progress-wrap x-progress-renderered">' +
@ -124,7 +124,7 @@ Deluge = {
return String.format(Deluge.progressTpl, text, width, barWidth, textWidth); return String.format(Deluge.progressTpl, text, width, barWidth, textWidth);
} }
} });
// Setup a space for plugins to insert themselves // Setup a space for plugins to insert themselves
deluge.plugins = {}; deluge.plugins = {};

View File

@ -338,5 +338,4 @@ Copyright:
}); });
} }
}); });
deluge.editTrackers = new Deluge.EditTrackers();
})(); })();

View File

@ -154,5 +154,3 @@ Deluge.LoginWindow = Ext.extend(Ext.Window, {
this.passwordField.setRawValue(''); this.passwordField.setRawValue('');
} }
}); });
deluge.login = new Deluge.LoginWindow();

View File

@ -49,6 +49,13 @@ deluge.ui = {
* and set up various events that the UI will utilise. * and set up various events that the UI will utilise.
*/ */
initialize: function() { initialize: function() {
deluge.add = new Deluge.add.AddWindow();
deluge.details = new Deluge.details.DetailsPanel();
deluge.connectionManager = new Deluge.ConnectionManager();
deluge.editTrackers = new Deluge.EditTrackers();
deluge.login = new Deluge.LoginWindow();
deluge.preferences = new Deluge.preferences.PreferencesWindow();
this.MainPanel = new Ext.Panel({ this.MainPanel = new Ext.Panel({
id: 'mainPanel', id: 'mainPanel',
iconCls: 'x-deluge-main-panel', iconCls: 'x-deluge-main-panel',

View File

@ -550,4 +550,3 @@ Deluge.add.AddWindow = Ext.extend(Deluge.add.Window, {
this.url.show(); this.url.show();
} }
}); });
deluge.add = new Deluge.add.AddWindow();

View File

@ -50,8 +50,7 @@ Deluge.data.Peer = Ext.data.Record.create([
type: 'string' type: 'string'
}, { }, {
name: 'ip', name: 'ip',
type: 'string', type: 'string'
sortType: Deluge.data.SortTypes.asIPAddress
}, { }, {
name: 'client', name: 'client',
type: 'string' type: 'string'

View File

@ -0,0 +1,103 @@
/*
Script: Deluge.Details.js
Contains all objects and functions related to the lower details panel and
it's containing tabs.
Copyright:
(C) Damien Churchill 2009-2010 <damoxc@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, write to:
The Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor
Boston, MA 02110-1301, USA.
In addition, as a special exception, the copyright holders give
permission to link the code of portions of this program with the OpenSSL
library.
You must obey the GNU General Public License in all respects for all of
the code used other than OpenSSL. If you modify file(s) with this
exception, you may extend this exception to your version of the file(s),
but you are not obligated to do so. If you do not wish to do so, delete
this exception statement from your version. If you delete this exception
statement from all source files in the program, then also delete it here.
*/
Ext.namespace('Deluge.details');
Deluge.details.DetailsPanel = Ext.extend(Ext.TabPanel, {
region: 'south',
id: 'torrentDetails',
split: true,
height: 220,
minSize: 100,
collapsible: true,
margins: '0 5 5 5',
activeTab: 0,
initComponent: function() {
Deluge.details.DetailsPanel.superclass.initComponent.call(this);
this.add(new Deluge.details.StatusTab());
this.add(new Deluge.details.DetailsTab());
this.add(new Deluge.details.FilesTab());
this.add(new Deluge.details.PeersTab());
this.add(new Deluge.details.OptionsTab());
},
clear: function() {
this.items.each(function(panel) {
if (panel.clear) {
panel.clear.defer(100, panel);
panel.disable();
}
});
},
update: function(tab) {
var torrent = deluge.torrents.getSelected();
if (!torrent) {
this.clear();
return;
}
this.items.each(function(tab) {
if (tab.disabled) tab.enable();
});
tab = tab || this.getActiveTab();
if (tab.update) tab.update(torrent.id);
},
/* Event Handlers */
// We need to add the events in onRender since Deluge.Torrents hasn't
// been created yet.
onRender: function(ct, position) {
Deluge.details.DetailsPanel.superclass.onRender.call(this, ct, position);
deluge.events.on('disconnect', this.clear, this);
deluge.torrents.on('rowclick', this.onTorrentsClick, this);
this.on('tabchange', this.onTabChange, this);
deluge.torrents.getSelectionModel().on('selectionchange', function(selModel) {
if (!selModel.hasSelection()) this.clear();
}, this);
},
onTabChange: function(panel, tab) {
this.update(tab);
},
onTorrentsClick: function(grid, rowIndex, e) {
this.update();
}
});

View File

@ -112,4 +112,3 @@ Deluge.details.DetailsTab = Ext.extend(Ext.Panel, {
this.oldData = data; this.oldData = data;
} }
}); });
deluge.details.add(new Deluge.details.DetailsTab());

View File

@ -216,5 +216,4 @@ Copyright:
root.firstChild.expand(); root.firstChild.expand();
} }
}); });
deluge.details.add(new Deluge.details.FilesTab());
})(); })();

View File

@ -414,4 +414,3 @@ Deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
this.fields.stop_ratio.setDisabled(!stop_at_ratio); this.fields.stop_ratio.setDisabled(!stop_at_ratio);
} }
}); });
deluge.details.add(new Deluge.details.OptionsTab());

View File

@ -150,5 +150,4 @@ Copyright:
store.sort(sortState.field, sortState.direction); store.sort(sortState.field, sortState.direction);
} }
}); });
deluge.details.add(new Deluge.details.PeersTab());
})(); })();

View File

@ -119,4 +119,3 @@ Deluge.details.StatusTab = Ext.extend(Ext.Panel, {
this.progressBar.updateProgress(status.progress / 100.0, text); this.progressBar.updateProgress(status.progress / 100.0, text);
} }
}); });
deluge.details.add(new Deluge.details.StatusTab());

View File

@ -216,4 +216,3 @@ Deluge.preferences.Bandwidth = Ext.extend(Ext.form.FormPanel, {
})); }));
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Bandwidth());

View File

@ -86,4 +86,3 @@ Deluge.preferences.Cache = Ext.extend(Ext.form.FormPanel, {
})); }));
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Cache());

View File

@ -104,4 +104,3 @@ Deluge.preferences.Daemon = Ext.extend(Ext.form.FormPanel, {
})); }));
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Daemon());

View File

@ -155,4 +155,3 @@ Deluge.preferences.Downloads = Ext.extend(Ext.FormPanel, {
Deluge.preferences.Downloads.superclass.onShow.call(this); Deluge.preferences.Downloads.superclass.onShow.call(this);
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Downloads());

View File

@ -116,4 +116,3 @@ Deluge.preferences.Encryption = Ext.extend(Ext.form.FormPanel, {
})); }));
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Encryption());

View File

@ -262,4 +262,3 @@ Deluge.preferences.Interface = Ext.extend(Ext.form.FormPanel, {
this.certField.setDisabled(!checked); this.certField.setDisabled(!checked);
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Interface());

View File

@ -1,5 +1,5 @@
/* /*
Script: deluge.preferences.Network.js Script: Deluge.preferences.Network.js
The network preferences page. The network preferences page.
Copyright: Copyright:
@ -38,15 +38,11 @@ Ext.namespace('Deluge.preferences');
* @extends Ext.form.FormPanel * @extends Ext.form.FormPanel
*/ */
Deluge.preferences.Network = Ext.extend(Ext.form.FormPanel, { Deluge.preferences.Network = Ext.extend(Ext.form.FormPanel, {
constructor: function(config) {
config = Ext.apply({
border: false,
title: _('Network'),
layout: 'form'
}, config);
Deluge.preferences.Network.superclass.constructor.call(this, config);
},
border: false,
layout: 'form',
title: _('Network'),
initComponent: function() { initComponent: function() {
Deluge.preferences.Network.superclass.initComponent.call(this); Deluge.preferences.Network.superclass.initComponent.call(this);
var optMan = deluge.preferences.getOptionsManager(); var optMan = deluge.preferences.getOptionsManager();
@ -76,7 +72,7 @@ Deluge.preferences.Network = Ext.extend(Ext.form.FormPanel, {
} }
})); }));
this.listenPorts = fieldset.add({ this.listenPorts = fieldset.add({
xtype: 'uxspinnergroup', xtype: 'spinnergroup',
name: 'listen_ports', name: 'listen_ports',
fieldLabel: '', fieldLabel: '',
labelSeparator: '', labelSeparator: '',
@ -131,7 +127,7 @@ Deluge.preferences.Network = Ext.extend(Ext.form.FormPanel, {
} }
})); }));
this.outgoingPorts = fieldset.add({ this.outgoingPorts = fieldset.add({
xtype: 'uxspinnergroup', xtype: 'spinnergroup',
name: 'outgoing_ports', name: 'outgoing_ports',
fieldLabel: '', fieldLabel: '',
labelSeparator: '', labelSeparator: '',
@ -236,4 +232,3 @@ Deluge.preferences.Network = Ext.extend(Ext.form.FormPanel, {
})); }));
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Network());

View File

@ -108,4 +108,3 @@ Deluge.preferences.Other = Ext.extend(Ext.form.FormPanel, {
})); }));
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Other());

View File

@ -336,4 +336,3 @@ Deluge.preferences.Plugins = Ext.extend(Ext.Panel, {
this.setInfo(); this.setInfo();
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Plugins());

View File

@ -58,6 +58,8 @@ Deluge.preferences.PreferencesWindow = Ext.extend(Ext.Window, {
plain: true, plain: true,
resizable: false, resizable: false,
pages: {},
initComponent: function() { initComponent: function() {
Deluge.preferences.PreferencesWindow.superclass.initComponent.call(this); Deluge.preferences.PreferencesWindow.superclass.initComponent.call(this);
@ -104,10 +106,26 @@ Deluge.preferences.PreferencesWindow = Ext.extend(Ext.Window, {
this.addButton(_('Apply'), this.onApply, this); this.addButton(_('Apply'), this.onApply, this);
this.addButton(_('Ok'), this.onOk, this); this.addButton(_('Ok'), this.onOk, this);
this.pages = {};
this.optionsManager = new Deluge.OptionsManager(); this.optionsManager = new Deluge.OptionsManager();
this.on('afterrender', this.onAfterRender, this); this.on('afterrender', this.onAfterRender, this);
this.on('show', this.onShow, this); this.on('show', this.onShow, this);
this.initPages();
},
initPages: function() {
deluge.preferences = this;
this.addPage(new Deluge.preferences.Downloads());
//this.addPage(new Deluge.preferences.Network());
this.addPage(new Deluge.preferences.Encryption());
this.addPage(new Deluge.preferences.Bandwidth());
this.addPage(new Deluge.preferences.Interface());
this.addPage(new Deluge.preferences.Other());
this.addPage(new Deluge.preferences.Daemon());
this.addPage(new Deluge.preferences.Queue());
this.addPage(new Deluge.preferences.Proxy());
this.addPage(new Deluge.preferences.Cache());
this.addPage(new Deluge.preferences.Plugins());
}, },
onApply: function(e) { onApply: function(e) {
@ -142,6 +160,7 @@ Deluge.preferences.PreferencesWindow = Ext.extend(Ext.Window, {
var name = page.title; var name = page.title;
store.add([new PreferencesRecord({name: name})]); store.add([new PreferencesRecord({name: name})]);
page['bodyStyle'] = 'margin: 5px'; page['bodyStyle'] = 'margin: 5px';
page.preferences = this;
this.pages[name] = this.configPanel.add(page); this.pages[name] = this.configPanel.add(page);
return this.pages[name]; return this.pages[name];
}, },
@ -211,4 +230,3 @@ Deluge.preferences.PreferencesWindow = Ext.extend(Ext.Window, {
this.hide(); this.hide();
} }
}); });
deluge.preferences = new Deluge.preferences.PreferencesWindow();

View File

@ -236,4 +236,3 @@ Deluge.preferences.Proxy = Ext.extend(Ext.form.FormPanel, {
this.fireEvent('change', this, newValues, oldValues); this.fireEvent('change', this, newValues, oldValues);
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Proxy());

View File

@ -223,4 +223,3 @@ Deluge.preferences.Queue = Ext.extend(Ext.form.FormPanel, {
this.removeAtRatio.setDisabled(!checked); this.removeAtRatio.setDisabled(!checked);
} }
}); });
deluge.preferences.addPage(new Deluge.preferences.Queue());

View File

@ -4,6 +4,8 @@
* licensing@extjs.com * licensing@extjs.com
* http://www.extjs.com/license * http://www.extjs.com/license
*/ */
Ext.ns('Ext.ux.tree');
/** /**
* @class Ext.ux.tree.TreeGrid * @class Ext.ux.tree.TreeGrid
* @extends Ext.tree.TreePanel * @extends Ext.tree.TreePanel
@ -404,4 +406,4 @@ Ext.ux.tree.TreeGrid = Ext.extend(Ext.tree.TreePanel, {
} }
}); });
Ext.reg('treegrid', Ext.ux.tree.TreeGrid); Ext.reg('treegrid', Ext.ux.tree.TreeGrid);

View File

@ -38,6 +38,7 @@ import time
import locale import locale
import shutil import shutil
import urllib import urllib
import fnmatch
import gettext import gettext
import hashlib import hashlib
import logging import logging
@ -240,7 +241,7 @@ class LookupResource(resource.Resource, component.Component):
self.__paths = {} self.__paths = {}
for directory in directories: for directory in directories:
self.addDirectory(directory) self.addDirectory(directory)
def addDirectory(self, directory, path=""): def addDirectory(self, directory, path=""):
log.debug("Adding directory `%s` with path `%s`", directory, path) log.debug("Adding directory `%s` with path `%s`", directory, path)
paths = self.__paths.setdefault(path, []) paths = self.__paths.setdefault(path, [])
@ -267,7 +268,7 @@ class LookupResource(resource.Resource, component.Component):
filename = os.path.basename(request.path) filename = os.path.basename(request.path)
for directory in self.__paths[path]: for directory in self.__paths[path]:
if filename in os.listdir(directory): if os.path.join(directory, filename):
path = os.path.join(directory, filename) path = os.path.join(directory, filename)
log.debug("Serving path: '%s'", path) log.debug("Serving path: '%s'", path)
mime_type = mimetypes.guess_type(path) mime_type = mimetypes.guess_type(path)
@ -277,6 +278,131 @@ class LookupResource(resource.Resource, component.Component):
request.setResponseCode(http.NOT_FOUND) request.setResponseCode(http.NOT_FOUND)
return "<h1>404 - Not Found</h1>" return "<h1>404 - Not Found</h1>"
class ScriptResource(resource.Resource, component.Component):
def __init__(self):
resource.Resource.__init__(self)
component.Component.__init__(self, "Scripts")
self.__scripts = {
"normal": {
"scripts": {},
"order": []
},
"debug": {
"scripts": {},
"order": []
},
"dev": {
"scripts": {},
"order": []
}
}
def add_script(self, path, filepath, type=None):
"""
Adds a script or scripts to the script resource.
:param path: The path of the script (this supports globbing)
:type path: string
:param filepath: The physical location of the script
:type filepath: string
:keyword type: The type of script to add (normal, debug, dev)
:param type: string
"""
if type not in ("dev", "debug", "normal"):
type = "normal"
self.__scripts[type]["scripts"][path] = filepath
self.__scripts[type]["order"].append(path)
def add_script_folder(self, path, filepath, type=None, recurse=True):
"""
Adds a folder of scripts to the script resource.
:param path: The path of the script (this supports globbing)
:type path: string
:param filepath: The physical location of the script
:type filepath: string
:keyword type: The type of script to add (normal, debug, dev)
:param type: string
:keyword recurse: Whether or not to recurse into other folders
:param recurse: bool
"""
if type not in ("dev", "debug", "normal"):
type = "normal"
self.__scripts[type]["scripts"][path] = (filepath, recurse)
self.__scripts[type]["order"].append(path)
def get_scripts(self, type=None):
"""
Returns a list of the scripts that can be used for producing
script tags.
:keyword type: The type of scripts to get (normal, debug, dev)
:param type: string
"""
scripts = []
if type not in ("dev", "debug", "normal"):
type = 'normal'
_scripts = self.__scripts[type]["scripts"]
_order = self.__scripts[type]["order"]
for path in _order:
filepath = _scripts[path]
# this is a folder
if isinstance(filepath, tuple):
filepath, recurse = filepath
if recurse:
for dirpath, dirnames, filenames in os.walk(filepath, False):
files = fnmatch.filter(filenames, "*.js")
files.sort()
dirpath = dirpath[len(filepath)+1:]
if dirpath:
scripts.extend(['js/' + path + '/' + dirpath + '/' + f for f in files])
else:
scripts.extend(['js/' + path + '/' + f for f in files])
else:
files = fnmatch.filter(os.listdir('.'), "*.js")
else:
scripts.append("js/" + path)
return scripts
def getChild(self, path, request):
if hasattr(request, "lookup_path"):
request.lookup_path = os.path.join(request.lookup_path, path)
else:
request.lookup_path = path
return self
def render(self, request):
log.debug("Requested path: '%s'", request.lookup_path)
for type in ("dev", "debug", "normal"):
scripts = self.__scripts[type]["scripts"]
for pattern in scripts:
if not request.lookup_path.startswith(pattern):
continue
filepath = scripts[pattern]
if isinstance(filepath, tuple):
filepath = filepath[0]
path = filepath + request.lookup_path[len(pattern):]
if not os.path.isfile(path):
continue
log.debug("Serving path: '%s'", path)
mime_type = mimetypes.guess_type(path)
request.setHeader("content-type", mime_type[0])
return compress(open(path, "rb").read(), request)
request.setResponseCode(http.NOT_FOUND)
return "<h1>404 - Not Found</h1>"
class TopLevel(resource.Resource): class TopLevel(resource.Resource):
addSlash = True addSlash = True
@ -286,89 +412,6 @@ class TopLevel(resource.Resource):
"css/deluge.css" "css/deluge.css"
] ]
__scripts = [
"js/ext-base.js",
"js/ext-all.js",
"js/ext-extensions.js",
"config.js",
"gettext.js",
"js/deluge-all.js"
]
__debug_scripts = [
"js/ext-base-debug.js",
"js/ext-all-debug.js",
"js/ext-extensions-debug.js",
"config.js",
"gettext.js",
"js/deluge-all-debug.js"
]
__dev_scripts = [
"js/ext-base-debug.js",
"js/ext-all-debug.js",
"js/ext-extensions/BufferView.js",
"js/ext-extensions/FileUploadField.js",
"js/ext-extensions/JSLoader.js",
"js/ext-extensions/Spinner.js",
"js/ext-extensions/SpinnerField.js",
"js/ext-extensions/StatusBar.js",
"js/ext-extensions/ToggleField.js",
"js/ext-extensions/TreeGridSorter.js",
"js/ext-extensions/TreeGridColumnResizer.js",
"js/ext-extensions/TreeGridNodeUI.js",
"js/ext-extensions/TreeGridLoader.js",
"js/ext-extensions/TreeGridColumns.js",
"js/ext-extensions/TreeGridRenderColumn.js",
"js/ext-extensions/TreeGrid.js",
"gettext.js",
"js/deluge-all/Deluge.js",
"js/deluge-all/Deluge.Formatters.js",
"js/deluge-all/Deluge.Menus.js",
"js/deluge-all/Deluge.data.SortTypes.js",
"js/deluge-all/Deluge.EventsManager.js",
"js/deluge-all/Deluge.OptionsManager.js",
"js/deluge-all/Deluge.MultiOptionsManager.js",
"js/deluge-all/Deluge.data.Peer.js",
"js/deluge-all/Deluge.data.Torrent.js",
"js/deluge-all/Deluge.Add.js",
"js/deluge-all/Deluge.Add.File.js",
"js/deluge-all/Deluge.Add.Url.js",
"js/deluge-all/Deluge.Add.Infohash.js",
"js/deluge-all/Deluge.Client.js",
"js/deluge-all/Deluge.ConnectionManager.js",
"js/deluge-all/Deluge.Details.js",
"js/deluge-all/Deluge.Details.Status.js",
"js/deluge-all/Deluge.Details.Details.js",
"js/deluge-all/Deluge.Details.Files.js",
"js/deluge-all/Deluge.Details.Peers.js",
"js/deluge-all/Deluge.Details.Options.js",
"js/deluge-all/Deluge.EditTrackers.js",
"js/deluge-all/Deluge.FileBrowser.js",
"js/deluge-all/Deluge.Keys.js",
"js/deluge-all/Deluge.Login.js",
"js/deluge-all/Deluge.MoveStorage.js",
"js/deluge-all/Deluge.Plugin.js",
"js/deluge-all/Deluge.Preferences.js",
"js/deluge-all/Deluge.Preferences.Downloads.js",
#"js/deluge-all/Deluge.Preferences.Network.js",
"js/deluge-all/Deluge.Preferences.Encryption.js",
"js/deluge-all/Deluge.Preferences.Bandwidth.js",
"js/deluge-all/Deluge.Preferences.Interface.js",
"js/deluge-all/Deluge.Preferences.Other.js",
"js/deluge-all/Deluge.Preferences.Daemon.js",
"js/deluge-all/Deluge.Preferences.Queue.js",
"js/deluge-all/Deluge.Preferences.Proxy.js",
"js/deluge-all/Deluge.Preferences.Cache.js",
"js/deluge-all/Deluge.Preferences.Plugins.js",
"js/deluge-all/Deluge.Remove.js",
"js/deluge-all/Deluge.Sidebar.js",
"js/deluge-all/Deluge.Statusbar.js",
"js/deluge-all/Deluge.Toolbar.js",
"js/deluge-all/Deluge.Torrents.js",
"js/deluge-all/Deluge.UI.js"
]
def __init__(self): def __init__(self):
resource.Resource.__init__(self) resource.Resource.__init__(self)
self.putChild("css", LookupResource("Css", rpath("css"))) self.putChild("css", LookupResource("Css", rpath("css")))
@ -377,10 +420,26 @@ class TopLevel(resource.Resource):
self.putChild("icons", LookupResource("Icons", rpath("icons"))) self.putChild("icons", LookupResource("Icons", rpath("icons")))
self.putChild("images", LookupResource("Images", rpath("images"))) self.putChild("images", LookupResource("Images", rpath("images")))
# Add the javascript resource with the development paths js = ScriptResource()
js = LookupResource("Javascript", rpath("js"))
js.addDirectory(rpath("js", "ext-extensions"), "ext-extensions") # configure the dev scripts
js.addDirectory(rpath("js", "deluge-all"), "deluge-all") js.add_script("ext-base.js", rpath("js", "ext-base-debug.js"), "dev")
js.add_script("ext-all.js", rpath("js", "ext-all-debug.js"), "dev")
js.add_script_folder("ext-extensions", rpath("js", "ext-extensions"), "dev")
js.add_script_folder("deluge-all", rpath("js", "deluge-all"), "dev")
# configure the debug scripts
js.add_script("ext-base.js", rpath("js", "ext-base-debug.js"), "debug")
js.add_script("ext-all.js", rpath("js", "ext-all-debug.js"), "debug")
js.add_script("ext-extensions.js", rpath("js", "ext-extensions-debug.js"), "debug")
js.add_script("deluge-all.js", rpath("js", "deluge-all-debug.js"), "debug")
# configure the normal scripts
js.add_script("ext-base.js", rpath("js", "ext-base.js"), "debug")
js.add_script("ext-all.js", rpath("js", "ext-all.js"), "debug")
js.add_script("ext-extensions.js", rpath("js", "ext-extensions.js"), "debug")
js.add_script("deluge-all.js", rpath("js", "deluge-all.js"), "debug")
self.putChild("js", js) self.putChild("js", js)
self.putChild("json", JSON()) self.putChild("json", JSON())
@ -457,11 +516,14 @@ class TopLevel(resource.Resource):
dev = False dev = False
if dev: if dev:
scripts = self.dev_scripts[:] mode = 'dev'
elif debug: elif debug:
scripts = self.debug_scripts[:] mode = 'debug'
else: else:
scripts = self.scripts[:] mode = None
scripts = component.get("Scripts").get_scripts(mode)
scripts.insert(0, "gettext.js")
template = Template(filename=rpath("index.html")) template = Template(filename=rpath("index.html"))
request.setHeader("content-type", "text/html; charset=utf-8") request.setHeader("content-type", "text/html; charset=utf-8")
@ -484,12 +546,7 @@ class TopLevel(resource.Resource):
web_config = component.get("Web").get_config() web_config = component.get("Web").get_config()
web_config["base"] = base web_config["base"] = base
config = dict([(key, web_config[key]) for key in UI_CONFIG_KEYS]) config = dict([(key, web_config[key]) for key in UI_CONFIG_KEYS])
js_config = """deluge = { js_config = common.json.dumps(config)
author: 'Damien Churchill <damoxc@gmail.com>',
version: '%s',
config: %s
}""" % (common.get_version(), common.json.dumps(config))
return template.render(scripts=scripts, stylesheets=self.stylesheets, return template.render(scripts=scripts, stylesheets=self.stylesheets,
debug=debug, base=base, js_config=js_config) debug=debug, base=base, js_config=js_config)