add in support to the optionsmanager for binding form fields
This commit is contained in:
parent
3458b238d8
commit
4edb79bcd7
|
@ -56,7 +56,21 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
Ext.deluge.details.OptionsTab.superclass.initComponent.call(this);
|
||||
|
||||
this.fieldsets = {}, this.fields = {};
|
||||
this.optionsManager = new Deluge.OptionsManager();
|
||||
this.optionsManager = new Deluge.OptionsManager({
|
||||
defaults: {
|
||||
'max_download_speed': -1,
|
||||
'max_upload_speed': -1,
|
||||
'max_connections': -1,
|
||||
'max_upload_slots': -1,
|
||||
'is_auto_managed': false,
|
||||
'stop_at_ratio': false,
|
||||
'stop_ratio': 2.0,
|
||||
'remove_at_ratio': false,
|
||||
'move_completed': null,
|
||||
'private': false,
|
||||
'prioritize_first_last': false
|
||||
}
|
||||
});
|
||||
this.optionsManager.on('changed', this.onOptionChanged, this);
|
||||
|
||||
/*
|
||||
|
@ -94,16 +108,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
decimalPrecision: 1,
|
||||
minValue: -1,
|
||||
maxValue: 99999
|
||||
},
|
||||
listeners: {
|
||||
'spin': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
},
|
||||
'keypress': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
}
|
||||
});
|
||||
this.fieldsets.bandwidth.add({
|
||||
|
@ -131,16 +135,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
decimalPrecision: 1,
|
||||
minValue: -1,
|
||||
maxValue: 99999
|
||||
},
|
||||
listeners: {
|
||||
'spin': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
},
|
||||
'keypress': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
}
|
||||
});
|
||||
this.fieldsets.bandwidth.add({
|
||||
|
@ -169,16 +163,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
minValue: -1,
|
||||
maxValue: 99999
|
||||
},
|
||||
listeners: {
|
||||
'spin': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
},
|
||||
'keypress': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
},
|
||||
colspan: 2
|
||||
});
|
||||
|
||||
|
@ -202,16 +186,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
minValue: -1,
|
||||
maxValue: 99999
|
||||
},
|
||||
listeners: {
|
||||
'spin': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
},
|
||||
'keypress': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
},
|
||||
colspan: 2
|
||||
});
|
||||
|
||||
|
@ -240,12 +214,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
id: 'is_auto_managed',
|
||||
boxLabel: _('Auto Managed'),
|
||||
width: 200,
|
||||
listeners: {
|
||||
'check': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
},
|
||||
colspan: 2
|
||||
});
|
||||
|
||||
|
@ -253,15 +221,10 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
fieldLabel: '',
|
||||
labelSeparator: '',
|
||||
id: 'stop_at_ratio',
|
||||
width: 110,
|
||||
boxLabel: _('Stop seed at ratio'),
|
||||
listeners: {
|
||||
'check': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
}
|
||||
width: 120,
|
||||
boxLabel: _('Stop seed at ratio')
|
||||
});
|
||||
|
||||
this.fields.stop_ratio = this.fieldsets.queue.add({
|
||||
xtype: 'uxspinner',
|
||||
id: 'stop_ratio',
|
||||
|
@ -276,16 +239,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
incrementValue: 0.1,
|
||||
alternateIncrementValue: 1,
|
||||
decimalPrecision: 1
|
||||
},
|
||||
listeners: {
|
||||
'spin': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
},
|
||||
'keypress': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -296,12 +249,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
bodyStyle: 'padding-left: 10px',
|
||||
boxLabel: _('Remove at ratio'),
|
||||
disabled: true,
|
||||
listeners: {
|
||||
'check': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
},
|
||||
colspan: 2
|
||||
});
|
||||
|
||||
|
@ -310,12 +257,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
labelSeparator: '',
|
||||
id: 'move_completed',
|
||||
boxLabel: _('Move Completed'),
|
||||
listeners: {
|
||||
'check': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
},
|
||||
colspan: 2
|
||||
});
|
||||
|
||||
|
@ -342,28 +283,21 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
fieldLabel: '',
|
||||
labelSeparator: '',
|
||||
boxLabel: _('Private'),
|
||||
id: 'private',
|
||||
listeners: {
|
||||
'check': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
}
|
||||
id: 'private'
|
||||
});
|
||||
|
||||
this.fields.prioritize_first_last = this.fieldsets.general.add({
|
||||
fieldLabel: '',
|
||||
labelSeparator: '',
|
||||
boxLabel: _('Prioritize First/Last'),
|
||||
id: 'prioritize_first_last',
|
||||
listeners: {
|
||||
'check': {
|
||||
fn: this.onFieldChange,
|
||||
scope: this
|
||||
}
|
||||
}
|
||||
id: 'prioritize_first_last'
|
||||
});
|
||||
|
||||
// Bind the fields so the options manager can manage them.
|
||||
for (var id in this.fields) {
|
||||
this.optionsManager.bind(id, this.fields[id]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Buttons
|
||||
*/
|
||||
|
@ -425,15 +359,7 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
},
|
||||
|
||||
clear: function() {
|
||||
this.fields.max_download_speed.setValue(0);
|
||||
this.fields.max_upload_speed.setValue(0);
|
||||
this.fields.max_connections.setValue(0);
|
||||
this.fields.max_upload_slots.setValue(0);
|
||||
this.fields.is_auto_managed.setValue(false);
|
||||
this.fields.stop_at_ratio.setValue(false);
|
||||
this.fields.remove_at_ratio.setValue(false);
|
||||
this.fields['private'].setValue(false);
|
||||
this.fields.prioritize_first_last.setValue(false);
|
||||
this.optionsManager.resetOptions(this.torrentId);
|
||||
},
|
||||
|
||||
reset: function() {
|
||||
|
@ -456,14 +382,14 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
var value = changed['prioritize_first_last'];
|
||||
Deluge.Client.core.set_torrent_prioritize_first_last(this.torrentId, value, {
|
||||
success: function() {
|
||||
this.optionsManager.updateOption(this.torrentId, 'prioritize_first_last', value);
|
||||
this.optionsManager.setOption(this.torrentId, 'prioritize_first_last', value);
|
||||
},
|
||||
scope: this
|
||||
});
|
||||
}
|
||||
Deluge.Client.core.set_torrent_options([this.torrentId], changed, {
|
||||
success: function() {
|
||||
this.optionsManager.updateOptions(this.torrentId, changed);
|
||||
this.optionsManager.setOptions(this.torrentId, changed);
|
||||
this.optionsManager.resetOptions(this.torrentId);
|
||||
},
|
||||
scope: this
|
||||
|
@ -474,10 +400,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
Deluge.EditTrackers.show();
|
||||
},
|
||||
|
||||
onFieldChange: function(field) {
|
||||
this.optionsManager.setOption(this.torrentId, field.id, field.getValue());
|
||||
},
|
||||
|
||||
onOptionChanged: function(id, key, newValue, oldValue) {
|
||||
if (key == 'stop_at_ratio') {
|
||||
this.fields.remove_at_ratio.setDisabled(!newValue);
|
||||
|
@ -490,11 +412,6 @@ Ext.deluge.details.OptionsTab = Ext.extend(Ext.form.FormPanel, {
|
|||
delete torrent['private'];
|
||||
|
||||
this.optionsManager.updateOptions(this.torrentId, torrent);
|
||||
for (var key in torrent) {
|
||||
if (this.fields[key] && !this.optionsManager.hasChanged(this.torrentId, key)) {
|
||||
if (!this.fields[key].disabled) this.fields[key].setValue(torrent[key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
Deluge.Details.add(new Ext.deluge.details.OptionsTab());
|
||||
|
|
|
@ -39,26 +39,53 @@ Copyright:
|
|||
Deluge.OptionsManager = Ext.extend(Ext.util.Observable, {
|
||||
|
||||
constructor: function(config) {
|
||||
this.binds = {};
|
||||
this.changed = {};
|
||||
this.defaults = config['defaults'] || {};
|
||||
this.options = {};
|
||||
Deluge.OptionsManager.superclass.constructor.call(this);
|
||||
|
||||
|
||||
this.addEvents({
|
||||
'add': true,
|
||||
'changed': true,
|
||||
'reset': true
|
||||
});
|
||||
this.on('changed', this.onChange, this);
|
||||
|
||||
Deluge.OptionsManager.superclass.constructor.call(this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Add a set of default options and values for an id to the options manager
|
||||
* Add a set of default options and values to the options manager
|
||||
* @param {String} id
|
||||
* @param {Object} options The default options for the id.
|
||||
* @param {Object} options The default options.
|
||||
*/
|
||||
addOptions: function(id, 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':
|
||||
field.on('check', this.onFieldChange, this);
|
||||
break;
|
||||
case 'uxspinner':
|
||||
field.on('spin', this.onFieldChange, this);
|
||||
field.on('keypress', this.onFieldChange, this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the changed values for a specified id.
|
||||
* @param {String} id
|
||||
|
@ -69,13 +96,13 @@ Deluge.OptionsManager = Ext.extend(Ext.util.Observable, {
|
|||
},
|
||||
|
||||
/**
|
||||
* Get the default value for an option given an id and option name
|
||||
* Get the default value for an option given an id and option name.
|
||||
* @param {String} id
|
||||
* @param {String} option
|
||||
* @returns {Object} the value of the option
|
||||
*/
|
||||
getDefault: function(id, option) {
|
||||
return this.options[id][option];
|
||||
getOption: function(id, option) {
|
||||
return (this.hasOption(id, option)) ? this.options[id][option] : this.defaults[option];
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -85,7 +112,7 @@ Deluge.OptionsManager = Ext.extend(Ext.util.Observable, {
|
|||
* @returns {Object} the options value.
|
||||
*/
|
||||
getValue: function(id, option) {
|
||||
return (this.hasChanged(id, option)) ? this.changed[id][option] : this.options[id][option];
|
||||
return (this.hasChanged(id, option)) ? this.changed[id][option] : this.getOption(id, option);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -98,6 +125,17 @@ Deluge.OptionsManager = Ext.extend(Ext.util.Observable, {
|
|||
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
|
||||
|
@ -111,20 +149,45 @@ Deluge.OptionsManager = Ext.extend(Ext.util.Observable, {
|
|||
* Set the specified option for the passed in id.
|
||||
* @param {String} id
|
||||
* @param {String} option
|
||||
* @param {Object} value The new value for the option
|
||||
* @param {Object} value The value for the option
|
||||
*/
|
||||
setOption: function(id, option, value) {
|
||||
this.options[id][option] = value;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the specified options for the passed in id.
|
||||
* @param {String} id
|
||||
* @param {Object} options The option values to change.
|
||||
*/
|
||||
setOptions: function(id, options) {
|
||||
if (!this.changed[id]) this.changed[id] = {};
|
||||
for (var key in options) {
|
||||
this.setOption(id, key, options[key]);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Update the value for the specified option and id.
|
||||
* @param {String} id
|
||||
* @param {String} option
|
||||
* @param {Object} value;
|
||||
*/
|
||||
updateOption: function(id, option, value) {
|
||||
if (!this.changed[id]) this.changed[id] = {};
|
||||
|
||||
var oldValue = this.getValue(id, option);
|
||||
if (this.options[id][option] == value) {
|
||||
if (oldValue == value) return;
|
||||
|
||||
var defaultValue = this.getOption(id, option);
|
||||
if (defaultValue == value) {
|
||||
if (!Ext.isEmpty(this.changed[id][option])) delete this.changed[id][option];
|
||||
this.fireEvent('changed', id, option, value, oldValue);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Ext.type(this.options[id][option]) != Ext.type(value)) {
|
||||
switch (Ext.type(this.options[id][option])) {
|
||||
if (Ext.type(defaultValue) != Ext.type(value)) {
|
||||
switch (Ext.type(defaultValue)) {
|
||||
case 'string':
|
||||
value = String(value);
|
||||
break;
|
||||
|
@ -142,39 +205,33 @@ Deluge.OptionsManager = Ext.extend(Ext.util.Observable, {
|
|||
},
|
||||
|
||||
/**
|
||||
* Set the specified options for the passed in id.
|
||||
* Update the options for the specified id.
|
||||
* @param {String} id
|
||||
* @param {Object} options The option values to change.
|
||||
*/
|
||||
setOptions: function(id, options) {
|
||||
if (!this.changed[id]) this.changed[id] = {};
|
||||
for (var key in options) {
|
||||
this.setOption(id, key, options[key]);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Update the default value for the specified option and id.
|
||||
* @param {String} id
|
||||
* @param {String} option
|
||||
* @param {Object} value;
|
||||
*/
|
||||
updateOption: function(id, option, value) {
|
||||
this.options[id][option] = value;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update the defaults for the specified id.
|
||||
* @param {String} id
|
||||
* @param {Object} options The option defaults to change.
|
||||
* @param {Object} options The options to change.
|
||||
*/
|
||||
updateOptions: function(id, options) {
|
||||
if (!this.options[id]) {
|
||||
this.addOptions(id, options);
|
||||
} else {
|
||||
for (var key in options) {
|
||||
this.updateOption(id, key, options[key]);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/* 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];
|
||||
//alert(option);
|
||||
},
|
||||
|
||||
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);
|
||||
}
|
||||
});
|
||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue