diff --git a/deluge/ui/web/css/deluge.css b/deluge/ui/web/css/deluge.css
index 0c4b63b27..062ba85b6 100644
--- a/deluge/ui/web/css/deluge.css
+++ b/deluge/ui/web/css/deluge.css
@@ -46,23 +46,36 @@ input {
/* Torrent Details */
-#torrentDetails dl {
+#torrentDetails dl, dl.singleline {
float: left;
min-height: 120px;
}
-#torrentDetails dl dt {
+#torrentDetails dl dt, dl.singleline dt {
float: left;
font-weight: bold;
height: 19px;
}
-#torrentDetails dl dd {
+#torrentDetails dl dd, dl.singleline dd {
margin-left: 100px;
width: 140px;
height: 19px;
}
+dl.singleline dt {
+ width: 80px;
+}
+
+dl.singleline dd {
+ margin-left: 85px;
+ width: auto;
+}
+
+.x-deluge-plugins {
+ background: White;
+}
+
/* Torrent Details - Status Tab */
.x-deluge-status-progressbar {
margin: 5px;
diff --git a/deluge/ui/web/css/xtheme-slate.css b/deluge/ui/web/css/xtheme-slate.css
index 94ed6ac86..4e1a791be 100644
--- a/deluge/ui/web/css/xtheme-slate.css
+++ b/deluge/ui/web/css/xtheme-slate.css
@@ -806,3 +806,7 @@ body.x-body-masked .x-window-mc, body.x-body-masked .x-window-plain .x-window-mc
.x-slider-vert .x-slider-inner{
background:transparent url(/themes/slate/slider/slider-v-bg.png) repeat-y 0 0;
}
+
+.x-deluge-plugins .x-panel-body {
+ background: White;
+}
diff --git a/deluge/ui/web/js/Deluge.Preferences.Plugins.js b/deluge/ui/web/js/Deluge.Preferences.Plugins.js
index a745eb4af..99978744e 100644
--- a/deluge/ui/web/js/Deluge.Preferences.Plugins.js
+++ b/deluge/ui/web/js/Deluge.Preferences.Plugins.js
@@ -1,7 +1,194 @@
-/*Deluge.Preferences.addPage(_('Plugins'), {
- border: false,
- xtype: 'form',
- layout: 'form',
- items: []
+Ext.namespace('Ext.deluge.preferences');
+Ext.deluge.preferences.Plugins = Ext.extend(Ext.Panel, {
+ constructor: function(config) {
+ config = Ext.apply({
+ border: false,
+ title: _('Plugins'),
+ layout: 'border',
+ height: 400,
+ cls: 'x-deluge-plugins'
+ }, config);
+ Ext.deluge.preferences.Plugins.superclass.constructor.call(this, config);
+ },
+
+ pluginTemplate: new Ext.Template(
+ '
' +
+ '- Author:
- {author}
' +
+ '- Version:
- {version}
' +
+ '- Author Email:
- {email}
' +
+ '- Homepage:
- {homepage}
' +
+ '- Details:
- {details}
' +
+ '
'
+ ),
+
+ initComponent: function() {
+ Ext.deluge.preferences.Plugins.superclass.initComponent.call(this);
+ this.defaultValues = {
+ 'version': '',
+ 'email': '',
+ 'homepage': '',
+ 'details': ''
+ };
+ this.pluginTemplate.compile();
+
+ var checkboxRenderer = function(v, p, record){
+ p.css += ' x-grid3-check-col-td';
+ return '
';
+ }
+
+ this.grid = this.add({
+ xtype: 'grid',
+ region: 'center',
+ store: new Ext.data.SimpleStore({
+ fields: [
+ {name: 'enabled', mapping: 0},
+ {name: 'plugin', mapping: 1}
+ ]
+ }),
+ columns: [{
+ id: 'enabled',
+ header: _('Enabled'),
+ width: 50,
+ sortable: true,
+ renderer: checkboxRenderer,
+ dataIndex: 'enabled'
+ }, {
+ id: 'plugin',
+ header: _('Plugin'),
+ sortable: true,
+ dataIndex: 'plugin'
+ }],
+ stripeRows: true,
+ selModel: new Ext.grid.RowSelectionModel({
+ singleSelect: true,
+ listeners: {
+ 'rowselect': {
+ fn: this.onPluginSelect,
+ scope: this
+ }
+ }
+ }),
+ autoExpandColumn: 'plugin',
+ deferredRender: false,
+ autoScroll: true,
+ margins: '5 5 5 5',
+ bbar: new Ext.Toolbar({
+ items: [{
+ cls: 'x-btn-text-icon',
+ iconCls: 'x-deluge-add',
+ text: _('Install'),
+ handler: this.onInstallPlugin,
+ scope: this
+ }, {
+ cls: 'x-btn-text-icon',
+ text: _('Rescan'),
+ handler: this.onRescanPlugins,
+ scope: this
+ }, '->', {
+ cls: 'x-btn-text-icon',
+ text: _('Find More'),
+ handler: this.onFindMorePlugins,
+ scope: this
+ }]
+ })
+ });
+
+ var fieldset = this.add({
+ xtype: 'fieldset',
+ border: false,
+ region: 'south',
+ title: _('Info'),
+ autoHeight: true,
+ labelWidth: 1
+ });
+ this.pluginInfo = fieldset.add({
+ xtype: 'panel',
+ border: false,
+ bodyCfg: {
+ style: 'margin-left: 10px'
+ }
+ });
+
+ this.on('show', this.onShow, this);
+ this.grid.on('cellclick', this.onCellClick, this);
+ Deluge.Preferences.on('show', this.onPreferencesShow, this);
+ },
+
+ disablePlugin: function(plugin) {
+ Deluge.Client.core.disable_plugin(plugin);
+ },
+
+ enablePlugin: function(plugin) {
+ Deluge.Client.core.enable_plugin(plugin);
+ },
+
+ setInfo: function(plugin) {
+ var values = plugin || this.defaultValues;
+ this.pluginInfo.body.dom.innerHTML = this.pluginTemplate.apply(values);
+ },
+
+ onCellClick: function(grid, rowIndex, colIndex, e) {
+ if (colIndex != 0) return;
+ var r = grid.getStore().getAt(rowIndex);
+ r.set('enabled', !r.get('enabled'));
+ r.commit();
+ if (r.get('enabled')) {
+ this.enablePlugin(r.get('plugin'));
+ } else {
+ this.disablePlugin(r.get('plugin'));
+ }
+ },
+
+ onGotAvailablePlugins: function(plugins) {
+ this.availablePlugins = plugins;
+ Deluge.Client.core.get_enabled_plugins({
+ success: this.onGotEnabledPlugins,
+ scope: this
+ });
+ },
+
+ onGotEnabledPlugins: function(plugins) {
+ this.enabledPlugins = plugins;
+ },
+
+ onGotPluginInfo: function(info) {
+ var values = {
+ author: info['Author'],
+ version: info['Version'],
+ email: info['Author-email'],
+ homepage: info['Home-page'],
+ details: info['Description']
+ }
+ this.setInfo(values);
+ delete info;
+ },
+
+ onPluginSelect: function(selmodel, rowIndex, r) {
+ Deluge.Client.web.get_plugin_info(r.get('plugin'), {
+ success: this.onGotPluginInfo,
+ scope: this
+ });
+ },
+
+ onPreferencesShow: function() {
+ Deluge.Client.core.get_available_plugins({
+ success: this.onGotAvailablePlugins,
+ scope: this
+ });
+ },
+
+ onShow: function() {
+ Ext.deluge.preferences.Plugins.superclass.onShow.call(this);
+ this.setInfo();
+ var plugins = [];
+ Ext.each(this.availablePlugins, function(plugin) {
+ if (this.enabledPlugins.indexOf(plugin) > -1) {
+ plugins.push([true, plugin]);
+ } else {
+ plugins.push([false, plugin]);
+ }
+ }, this);
+ this.grid.getStore().loadData(plugins);
+ }
});
-*/
\ No newline at end of file
+Deluge.Preferences.addPage(new Ext.deluge.preferences.Plugins());
\ No newline at end of file
diff --git a/deluge/ui/web/json_api.py b/deluge/ui/web/json_api.py
index a5fe7b0ed..8ba0d092d 100644
--- a/deluge/ui/web/json_api.py
+++ b/deluge/ui/web/json_api.py
@@ -710,5 +710,13 @@ class WebApi(JSONComponent):
@export
def get_plugin_info(self, name):
- return component.get("PluginManager").get_plugin_info(name)
+ return component.get("Web.PluginManager").get_plugin_info(name)
+
+ @export
+ def enable_plugin(self, name):
+ pass
+
+ @export
+ def disable_plugin(self, name):
+ pass
\ No newline at end of file