Author: damoxc
Revision: 5557
Log:
change Deluge.OptionsManager to only handle a single set of options,
and add Deluge.MultiOptionsManager to manage multiple sets
Diff:
Modified: trunk/deluge/ui/web/js/Deluge.Add.js
===================================================================
--- trunk/deluge/ui/web/js/Deluge.Add.js 2009-07-28 16:53:40 UTC (rev
5556)
+++ trunk/deluge/ui/web/js/Deluge.Add.js 2009-07-28 18:01:58 UTC (rev
5557)
@@ -76,7 +76,7 @@
folderSort: true
});
- this.optionsManager = new Deluge.OptionsManager({
+ this.optionsManager = new Deluge.MultiOptionsManager({
defaults: {
'add_paused': false,
'compact_allocation': false,
Modified: trunk/deluge/ui/web/js/Deluge.Details.Options.js
===================================================================
--- trunk/deluge/ui/web/js/Deluge.Details.Options.js 2009-07-28 16:53:40 UTC
(rev 5556)
+++ trunk/deluge/ui/web/js/Deluge.Details.Options.js 2009-07-28 18:01:58 UTC
(rev 5557)
@@ -56,7 +56,7 @@
Ext.deluge.details.OptionsTab.superclass.initComponent.call(this);
this.fieldsets = {}, this.fields = {};
- this.optionsManager = new Deluge.OptionsManager({
+ this.optionsManager = new Deluge.MultiOptionsManager({
defaults: {
'max_download_speed': -1,
'max_upload_speed': -1,
Added: trunk/deluge/ui/web/js/Deluge.MultiOptionsManager.js
===================================================================
--- trunk/deluge/ui/web/js/Deluge.MultiOptionsManager.js
(rev 0)
+++ trunk/deluge/ui/web/js/Deluge.MultiOptionsManager.js 2009-07-28
18:01:58 UTC (rev 5557)
@@ -0,0 +1,248 @@
+/*
+Script:
+ Deluge.MultiOptionsManager.js
+
+Copyright:
+ (C) Damien Churchill 2009 <[email protected]>
+ 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.
+*/
+
+/**
+ * @description A class that can be used to manage options throughout the ui.
+ * @namespace Deluge
+ * @class Deluge.MultiOptionsManager
+ */
+Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, {
+
+ constructor: function(config) {
+ config = config || {};
+ this.options = {};
+ this.binds = {};
+ this.changed = {};
+ this.defaults = (config && config['defaults']) || {};
+
+ this.addEvents({
+ 'add': true,
+ 'changed': true,
+ 'reset': true
+ });
+ this.on('changed', this.onChange, this);
+
+ Deluge.MultiOptionsManager.superclass.constructor.call(this);
+ },
+
+ /**
+ * Add a set of default options and values to the options manager
+ * @param {String} id
+ * @param {Object} options The default options.
+ */
+ addOptions: function(options) {
+ this.options[id] = options;
+ },
+
+ /**
+ * Binds a form field to the specified option.
+ * @param {String} option
+ * @param {Ext.form.Field} field
+ */
+ bind: function(option, field) {
+ this.binds[option] = field;
+ this.binds[field] = option;
+
+ switch (field.getXType()) {
+ case 'checkbox':
+ case 'radiogroup':
+ field.on('check', this.onFieldChange, this);
+ break;
+ case 'uxspinner':
+ field.on('spin', this.onFieldChange, this);
+ field.on('keypress', this.onFieldChange, this);
+ break;
+ default:
+ break;
+ }
+ },
+
+ /**
+ * Changes bound fields to use the specified id.
+ * @param {String} id
+ */
+ changeId: function(id) {
+ this.currentId = id;
+ for (var option in this.defaults) {
+ if (!this.binds[option]) continue;
+ this.binds[option].setValue(this.get(id, option));
+ }
+ },
+
+ /**
+ * Get the value for an option
+ * @param {String} id
+ * @param {String|Array} [option] A single option or an array of
options to return.
+ * @returns {Object} the options value.
+ */
+ get: function(id, option) {
+ if (!option) {
+ var values = {};
+ for (var key in this.defaults) {
+ values[key] = this.get(id, key);
+ }
+ return values;
+ } else {
+ return (this.hasChanged(id, option)) ?
this.changed[id][option] : this.getDefault(id, option);
+ }
+ },
+
+ /**
+ * Returns the changed values.
+ * @param {String} id
+ * @returns {Object} the changed options
+ */
+ getChanged: function(id) {
+ return (this.changed[id]) ? this.changed[id] : {};
+ },
+
+ /**
+ * Get the default value for an option.
+ * @param {String} id
+ * @param {String|Array} [option] A single option or an array of
options to return.
+ * @returns {Object} the value of the option
+ */
+ getDefault: function(id, option) {
+ return (this.hasOption(id, option)) ? this.options[id][option]
: this.defaults[option];
+ },
+
+ /**
+ * Check to see if the option has been changed.
+ * @param {String} id
+ * @param {String} option
+ * @returns {Boolean} true if the option has been changed, else false.
+ */
+ hasChanged: function(id, option) {
+ return (this.changed[id] &&
!Ext.isEmpty(this.changed[id][option]));
+ },
+
+ /**
+ * Check to see if an id has had an option set to something other than
the
+ * default value.
+ * @param {String} id
+ * @param {String} option
+ * @returns {Boolean} true if the id has an option, else false.
+ */
+ hasOption: function(id, option) {
+ return (this.options[id] &&
!Ext.isEmpty(this.options[id][option]));
+ },
+
+ /**
+ * Reset the options back to the default values for the specified id.
+ * @param {String} id
+ */
+ reset: function(id) {
+ if (!this.changed[id]) return;
+ delete this.changed[id];
+ },
+
+ /**
+ * Sets the value of specified option for the passed in id.
+ * @param {String} id
+ * @param {String} option
+ * @param {Object} value The value for the option
+ */
+ set: function(id, option, value) {
+ if (typeof value === undefined) {
+ for (var key in option) {
+ this.set(id, key, option[key]);
+ }
+ } else {
+ if (!this.options[id]) this.options[id] = {};
+ this.options[id][option] = value;
+ }
+ },
+
+ /**
+ * Update the value for the specified option and id.
+ * @param {String} id
+ * @param {String|Object} option or options to update
+ * @param {Object} [value];
+ */
+ update: function(id, option, value) {
+ if (typeof value === undefined) {
+ for (var key in option) {
+ this.update(id, key, option[key]);
+ }
+ } else {
+ if (!this.changed[id]) this.changed[id] = {};
+
+ var oldValue = this.get(id, option);
+ if (oldValue == value) return;
+
+ var defaultValue = this.getDefault(id, option);
+ if (defaultValue == value) {
+ if (this.hasChanged(id, option)) delete
this.changed[id][option];
+ this.fireEvent('changed', id, option, value,
oldValue);
+ return;
+ }
+
+ if (Ext.type(defaultValue) != Ext.type(value)) {
+ switch (Ext.type(defaultValue)) {
+ case 'string':
+ value = String(value);
+ break;
+ case 'number':
+ value = Number(value);
+ break;
+ case 'boolean':
+ value = Boolean(value);
+ break;
+ }
+ }
+
+ this.changed[id][option] = value;
+ this.fireEvent('changed', id, option, value, oldValue);
+ }
+ },
+
+ /* Event Handlers */
+
+ /**
+ * Stops a form fields value from being blocked by the change functions
+ * @param {Ext.form.Field} field
+ * @private
+ */
+ onFieldChange: function(field) {
+ var option = this.binds[field];
+ this.update(this.currentId, option, field.getValue());
+ },
+
+ onChange: function(id, option, newValue, oldValue) {
+ // If we don't have a bind there's nothing to do.
+ if (Ext.isEmpty(this.binds[option])) return;
+
+ // Set the form field to the new value.
+ this.binds[option].setValue(newValue);
+ }
+});
\ No newline at end of file
Modified: trunk/deluge/ui/web/js/Deluge.OptionsManager.js
===================================================================
--- trunk/deluge/ui/web/js/Deluge.OptionsManager.js 2009-07-28 16:53:40 UTC
(rev 5556)
+++ trunk/deluge/ui/web/js/Deluge.OptionsManager.js 2009-07-28 18:01:58 UTC
(rev 5557)
@@ -31,6 +31,8 @@
statement from all source files in the program, then also delete it here.
*/
+Ext.namespace('Deluge');
+
/**
* @description A class that can be used to manage options throughout the ui.
* @namespace Deluge
@@ -42,9 +44,7 @@
config = config || {};
this.binds = {};
this.changed = {};
- this.defaults = (config && config['defaults']) || {};
- this.options = {};
- this.currentId = null;
+ this.options = (config && config['options']) || {};
this.addEvents({
'add': true,
@@ -61,8 +61,8 @@
* @param {String} id
* @param {Object} options The default options.
*/
- addOptions: function(id, options) {
- this.options[id] = options;
+ addOptions: function(options) {
+ this.options = Ext.applyIf(this.options, options);
},
/**
@@ -89,52 +89,42 @@
},
/**
- * Changes bound fields to use the specified id.
- * @param {String} id
+ * Get the value for an option or options.
+ * @param {String} [option] A single option or an array of options to
return.
+ * @returns {Object} the options value.
*/
- changeId: function(id) {
- this.currentId = id;
- for (var option in this.defaults) {
- if (!this.binds[option]) continue;
- this.binds[option].setValue(this.get(id, option));
- }
+ get: function() {
+ var options = {};
+ Ext.each(arguments, function(option) {
+ if (!this.has(option)) return;
+ options[option] = (this.isDirty(option)) ?
this.changed[option] : this.options[option];
+ });
+ return options;
},
/**
- * Get the value for an option
- * @param {String} id
+ * Get the default value for an option or options.
* @param {String|Array} [option] A single option or an array of
options to return.
- * @returns {Object} the options value.
+ * @returns {Object} the value of the option
*/
- get: function(id, option) {
- if (!option) {
- var values = {};
- for (var key in this.defaults) {
- values[key] = this.get(id, key);
- }
- return values;
- } else {
- return (this.hasChanged(id, option)) ?
this.changed[id][option] : this.getDefault(id, option);
- }
+ getDefault: function(option) {
+ return this.options[option];
},
/**
- * Returns the changed values.
- * @param {String} id
+ * Returns the dirty (changed) values.
* @returns {Object} the changed options
*/
- getChanged: function(id) {
- return (this.changed[id]) ? this.changed[id] : {};
+ getDirty: function() {
+ return this.changed;
},
/**
- * Get the default value for an option.
- * @param {String} id
- * @param {String|Array} [option] A single option or an array of
options to return.
- * @returns {Object} the value of the option
+ * @param {String} [option] The option to check
+ * @returns {Boolean} true if the option has been changed from the
default.
*/
- getDefault: function(id, option) {
- return (this.hasOption(id, option)) ? this.options[id][option]
: this.defaults[option];
+ isDirty: function(option) {
+ return !Ext.isEmpty(this.changed[option]);
},
/**
@@ -148,63 +138,49 @@
},
/**
- * Check to see if an id has had an option set to something other than
the
- * default value.
- * @param {String} id
+ * Check to see if an option exists in the options manager
* @param {String} option
- * @returns {Boolean} true if the id has an option, else false.
+ * @returns {Boolean} true if the option exists, else false.
*/
- hasOption: function(id, option) {
- return (this.options[id] &&
!Ext.isEmpty(this.options[id][option]));
+ has: function(option) {
+ return (this.defaults[option]);
},
/**
- * Reset the options back to the default values for the specified id.
+ * Reset the options back to the default values.
* @param {String} id
*/
- reset: function(id) {
- if (!this.changed[id]) return;
- delete this.changed[id];
+ reset: function() {
+ this.changed = {};
},
/**
* Sets the value of specified option for the passed in id.
- * @param {String} id
* @param {String} option
* @param {Object} value The value for the option
*/
- set: function(id, option, value) {
- if (typeof value === undefined) {
- for (var key in option) {
- this.set(id, key, option[key]);
- }
- } else {
- if (!this.options[id]) this.options[id] = {};
- this.options[id][option] = value;
- }
+ set: function(option, value) {
+ this.options[option] = value;
},
/**
* Update the value for the specified option and id.
- * @param {String} id
* @param {String|Object} option or options to update
* @param {Object} [value];
*/
- update: function(id, option, value) {
+ update: function(option, value) {
if (typeof value === undefined) {
for (var key in option) {
- this.update(id, key, option[key]);
+ this.update(key, option[key]);
}
} else {
- if (!this.changed[id]) this.changed[id] = {};
-
- var oldValue = this.get(id, option);
+ var oldValue = this.get(option);
if (oldValue == value) return;
- var defaultValue = this.getDefault(id, option);
+ var defaultValue = this.getDefault(option);
if (defaultValue == value) {
- if (this.hasChanged(id, option)) delete
this.changed[id][option];
- this.fireEvent('changed', id, option, value,
oldValue);
+ if (this.isDirty(option)) delete
this.changed[option];
+ this.fireEvent('changed', option, value,
oldValue);
return;
}
@@ -221,9 +197,9 @@
break;
}
}
-
- this.changed[id][option] = value;
- this.fireEvent('changed', id, option, value, oldValue);
+
+ this.changed[option] = value;
+ this.fireEvent('changed', option, value, oldValue);
}
},
@@ -236,14 +212,14 @@
*/
onFieldChange: function(field) {
var option = this.binds[field];
- this.update(this.currentId, option, field.getValue());
+ this.update(option, field.getValue());
},
- onChange: function(id, option, newValue, oldValue) {
+ onChange: function(option, newValue, oldValue) {
// If we don't have a bind there's nothing to do.
if (Ext.isEmpty(this.binds[option])) return;
// Set the form field to the new value.
this.binds[option].setValue(newValue);
}
-});
+});
\ No newline at end of file
Modified: trunk/deluge/ui/web/js/Deluge.Preferences.Downloads.js
===================================================================
--- trunk/deluge/ui/web/js/Deluge.Preferences.Downloads.js 2009-07-28
16:53:40 UTC (rev 5556)
+++ trunk/deluge/ui/web/js/Deluge.Preferences.Downloads.js 2009-07-28
18:01:58 UTC (rev 5557)
@@ -15,6 +15,7 @@
this.fieldsets = {}
this.fields = {};
+ var optMan = Deluge.Preferences.getOptionsManager();
this.fieldsets['folders'] = this.add({
xtype: 'fieldset',
border: false,
@@ -51,8 +52,8 @@
name: 'compact_allocation',
labelSeparator: '',
items: [
- {boxLabel: _('Compact'), value: 'true'},
- {boxLabel: _('Full'), value:
'false',style: 'margin-right: 10px;'}
+ {boxLabel: _('Compact') + ' ',
value: 'true'},
+ {boxLabel: _('Full'), value: 'false'}
]
});
Modified: trunk/deluge/ui/web/js/Deluge.Preferences.js
===================================================================
--- trunk/deluge/ui/web/js/Deluge.Preferences.js 2009-07-28 16:53:40 UTC
(rev 5556)
+++ trunk/deluge/ui/web/js/Deluge.Preferences.js 2009-07-28 18:01:58 UTC
(rev 5557)
@@ -94,6 +94,8 @@
Ext.deluge.PreferencesWindow.superclass.initComponent.call(this);
this.categoriesGrid = this.items.get(0);
this.configPanel = this.items.get(1);
+ this.optionsManager = new Deluge.OptionsManager();
+
this.pages = {};
this.on('show', this.onShow, this);
},
@@ -111,6 +113,14 @@
this.pages[name].hide();
},
+ /**
+ * Return the options manager for the preferences window.
+ * @returns {Deluge.OptionsManager} the options manager
+ */
+ getOptionsManager: function() {
+ return this.optionsManager;
+ },
+
onPageSelect: function(selModel, rowIndex, r) {
if (this.currentPage) {
this.currentPage.hide();
Modified: trunk/deluge/ui/web/server.py
===================================================================
--- trunk/deluge/ui/web/server.py 2009-07-28 16:53:40 UTC (rev 5556)
+++ trunk/deluge/ui/web/server.py 2009-07-28 18:01:58 UTC (rev 5557)
@@ -278,6 +278,7 @@
"/js/Deluge.Menus.js",
"/js/Deluge.Events.js",
"/js/Deluge.OptionsManager.js",
+ "/js/Deluge.MultiOptionsManager.js",
"/js/Deluge.Add.js",
"/js/Deluge.Add.File.js",
"/js/Deluge.Add.Url.js",
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"deluge-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/deluge-commit?hl=en
-~----------~----~----~----~------~----~------~--~---