pandora/static/js/UI.js

280 lines
11 KiB
JavaScript
Raw Normal View History

2011-07-29 18:37:11 +00:00
// vim: et:ts=4:sw=4:sts=4:ft=javascript
2012-02-03 09:15:38 +00:00
'use strict';
2012-01-30 20:48:04 +00:00
2011-05-25 19:42:45 +00:00
pandora.UI = (function() {
2011-09-27 14:14:40 +00:00
var self = {}, that = {};
2011-09-27 14:14:40 +00:00
self.previousUI = {};
2011-09-27 14:14:40 +00:00
2011-09-26 16:46:31 +00:00
that.encode = function(val) {
return val.replace(/\./g, '\\.');
};
2011-09-27 14:14:40 +00:00
that.getPrevious = function(key) {
// fixme: probably unneeded by now
return !key ? self.previousUI : self.previousUI[key];
};
2011-09-27 14:14:40 +00:00
that.reset = function() {
pandora.api.resetUI({}, function() {
pandora.user.ui = pandora.site.user.ui;
pandora.user.ui._list = pandora.getListState(pandora.user.ui.find);
pandora.user.ui._filterState = pandora.getFilterState(pandora.user.ui.find);
pandora.user.ui._findState = pandora.getFindState(pandora.user.ui.find);
Ox.Theme(pandora.user.ui.theme);
pandora.$ui.appPanel.reload();
});
2011-10-22 14:50:53 +00:00
};
2011-09-26 16:46:31 +00:00
// sets pandora.user.ui.key to val
// key foo.bar.baz sets pandora.user.ui.foo.bar.baz
// val null removes a key
2011-09-28 17:32:03 +00:00
that.set = function(/* {key: val}[, flag] or key, val[, flag] */) {
2011-09-27 22:12:37 +00:00
var add = {},
2011-09-28 17:32:03 +00:00
args,
editSettings = pandora.site.editSettings,
item,
list,
2011-09-27 22:12:37 +00:00
listSettings = pandora.site.listSettings,
listView,
2011-09-27 14:14:40 +00:00
set = {},
textSettings = pandora.site.textSettings,
2011-11-05 17:20:40 +00:00
trigger = {},
triggerEvents;
2011-09-28 17:32:03 +00:00
if (Ox.isObject(arguments[0])) {
args = arguments[0];
triggerEvents = Ox.isUndefined(arguments[1]) ? true : arguments[1];
} else {
args = Ox.makeObject([arguments[0], arguments[1]]);
triggerEvents = Ox.isUndefined(arguments[2]) ? true : arguments[1];
}
Ox.Log('UI', 'SET', JSON.stringify(args));
self.previousUI = Ox.clone(pandora.user.ui, true);
2011-11-06 08:28:10 +00:00
self.previousUI._list = pandora.getListState(self.previousUI.find);
2013-02-16 01:20:40 +00:00
if (args.section == 'texts') {
trigger.section = args.section;
trigger.text = args.text;
2013-06-14 16:35:12 +00:00
} else if (args.section == 'edits') {
trigger.section = args.section;
trigger.edit = args.edit;
} else {
2013-02-16 01:20:40 +00:00
if ('find' in args) {
// the challenge here is that find may change list,
// and list may then change listSort and listView,
// which we don't want to trigger, since find triggers
// (values we put in add will be changed, but won't trigger)
list = pandora.getListState(args.find);
pandora.user.ui._list = list;
pandora.user.ui._filterState = pandora.getFilterState(args.find);
pandora.user.ui._findState = pandora.getFindState(args.find);
if (pandora.$ui.appPanel && !pandora.stayInItemView) {
// if we're not on page load, and if find isn't a context change
// caused by an edit, then switch from item view to list view
args['item'] = '';
}
if (list != self.previousUI._list) {
Ox.Log('UI', 'FIND HAS CHANGED LIST')
// if find has changed list
Ox.forEach(listSettings, function(listSetting, setting) {
// then for each setting that corresponds to a list setting
if (!pandora.user.ui.lists[list]
|| Ox.isUndefined(pandora.user.ui.lists[list][listSetting])) {
2013-02-16 01:20:40 +00:00
// either add the default setting
add[setting] = pandora.site.user.ui[setting];
} else {
// or the existing list setting
add[setting] = pandora.user.ui.lists[list][listSetting]
}
});
}
add.itemFind = pandora.getItemFind(args.find);
} else {
list = self.previousUI._list;
}
// it is important to check for find first, so that
// if find changes list, list is correct here
item = args.item || pandora.user.ui.item;
listView = add.listView || args.listView;
if (listView) {
if (pandora.isClipView(listView)) {
// when switching to a clip view, clear list selection
// (but don't trigger an additional event)
add.listSelection = [];
} else if (['text', 'position'].indexOf(pandora.user.ui.listSort[0].key) > -1) {
// when switching to a non-clip view, with a sort key
// that only exists in clip view, reset sort to default
args.listSort = pandora.site.user.ui.listSort;
}
}
2013-02-16 01:20:40 +00:00
if (!pandora.user.ui.lists[list]) {
add['lists.' + that.encode(list)] = {};
}
2013-02-16 01:20:40 +00:00
Ox.forEach(listSettings, function(listSetting, setting) {
// for each setting that corresponds to a list setting
// set that list setting to
var key = 'lists.' + that.encode(list) + '.' + listSetting;
if (setting in args) {
// the setting passed to UI.set
add[key] = args[setting];
} else if (setting in add) {
// or the setting changed via find
add[key] = add[setting];
} else if (!pandora.user.ui.lists[list]) {
// or the default setting
add[key] = pandora.site.user.ui[setting];
}
});
// set nested lisColumnWidth updates
Ox.forEach(args, function(value, key) {
if (Ox.startsWith(key, 'listColumnWidth.')) {
key = 'lists.' + that.encode(list) + '.columnWidth.'
+ key.slice('listColumnWidth.'.length);
if (!(key in add)) {
add[key] = value;
}
}
});
2013-02-16 01:20:40 +00:00
if (args.item) {
// when switching to an item, update list selection
add['listSelection'] = [args.item];
add['lists.' + that.encode(list) + '.selection'] = [args.item];
if (
!args.itemView
&& ['timeline', 'player', 'editor'].indexOf(pandora.user.ui.itemView) > -1
&& !pandora.user.ui.videoPoints[item]
&& !args['videoPoints.' + item]
) {
// if the item view doesn't change, remains a video view,
// video points don't exist yet, and won't be set,
// add default video points
add['videoPoints.' + item] = {annotation: '', 'in': 0, out: 0, position: 0};
}
if (
args['videoPoints.' + item]
&& (!pandora.user.ui.item || pandora.user.ui.itemView != 'editor')
) {
pandora._dontSelectResult = true;
}
}
2013-02-16 01:20:40 +00:00
if (['timeline', 'player', 'editor'].indexOf(args.itemView) > -1) {
// when switching to a video view, add it as default video view
args.videoView = args.itemView;
if (
!pandora.user.ui.videoPoints[item]
&& !args['videoPoints.' + item]
) {
// if video points don't exist yet, and won't be set,
// add default video points
add['videoPoints.' + item] = {annotation: '', 'in': 0, out: 0, position: 0};
}
2011-10-17 10:19:17 +00:00
}
}
2013-07-12 20:32:32 +00:00
if (args.edit) {
// add local edit settings
2014-02-06 14:07:36 +00:00
if (!pandora.user.ui.edits[args.edit]) {
add['edits.' + that.encode(args.edit)] = {};
}
2014-02-06 09:28:36 +00:00
Ox.forEach(editSettings, function(value, key) {
var editsKey = 'edits.' + that.encode(args.edit) + '.' + key;
2014-02-06 09:28:36 +00:00
add[editsKey] = editsKey in args ? args[editsKey]
: pandora.user.ui.edits[args.edit] ? pandora.user.ui.edits[args.edit][key]
2014-02-06 09:56:20 +00:00
: value;
});
2013-07-12 20:32:32 +00:00
}
2014-02-06 14:07:36 +00:00
2014-02-06 07:50:43 +00:00
Ox.forEach({
editSelection: 'selection',
editSort: 'sort',
editView: 'view'
}, function(editSetting, setting) {
2014-02-06 09:28:36 +00:00
var key = 'edits.' + that.encode(args.edit || pandora.user.ui.edit) + '.' + editSetting;
2014-02-06 07:50:43 +00:00
if (setting in args) {
// add local edit setting
2014-02-06 07:50:43 +00:00
add[key] = args[setting];
} else if (setting in add) {
// add local edit setting
add[key] = add[setting];
} else if (key in add) {
// add global edit setting
add[setting] = add[key];
2014-02-06 07:50:43 +00:00
}
});
if (args.text) {
add['texts.' + that.encode(args.text)] = Ox.map(textSettings, function(value, key) {
var textsKey = 'texts.' + that.encode(args.text),
textsSubKey = textsKey + '.' + key;
return textsKey in args && key in args[textsKey] ? args[textsKey][key]
: textsSubKey in args ? args[textSubKey]
: pandora.user.ui.texts[args.text] ? pandora.user.ui.texts[args.text][key]
: value;
});
}
2012-01-30 20:48:04 +00:00
// items in args trigger events, items in add do not
2011-09-28 17:32:03 +00:00
[args, add].forEach(function(obj, isAdd) {
2011-09-27 22:12:37 +00:00
Ox.forEach(obj, function(val, key) {
// make sure to not split at escaped dots ('\.')
var keys = key.replace(/\\\./g, '\n').split('.').map(function(key) {
return key.replace(/\n/g, '.')
}),
part,
2011-09-27 22:12:37 +00:00
ui = pandora.user.ui;
while (keys.length > 1) {
part = part ? part + '.' + keys[0] : keys[0];
if (Ox.isUndefined(ui[keys[0]])) {
ui[keys[0]] = {};
set[part] = {};
}
2011-09-27 22:12:37 +00:00
ui = ui[keys.shift()];
2011-05-25 19:42:45 +00:00
}
2011-09-27 22:12:37 +00:00
if (!Ox.isEqual(ui[keys[0]], val)) {
if (val === null) {
delete ui[keys[0]];
2011-09-27 22:12:37 +00:00
} else {
ui[keys[0]] = val;
}
2011-09-27 14:14:40 +00:00
set[key] = val;
2011-09-28 17:32:03 +00:00
if (!isAdd) {
2011-09-27 22:12:37 +00:00
trigger[key] = val;
2011-09-27 14:14:40 +00:00
}
2011-10-08 13:09:16 +00:00
}
2011-09-27 22:12:37 +00:00
});
});
2013-05-17 11:52:09 +00:00
if (Ox.len(set) && !pandora.isEmbedURL() && !pandora.isPrintURL()) {
pandora.api.setUI(set);
}
2011-09-28 17:32:03 +00:00
triggerEvents && Ox.forEach(trigger, function(val, key) {
Ox.Log('UI', 'TRIGGER ', key, val);
2013-12-29 12:03:42 +00:00
Ox.forEach(pandora.$ui, function($element) {
2014-09-26 12:30:51 +00:00
if (Ox.UI.isElement($element)) {
2014-09-23 21:56:44 +00:00
$element.triggerEvent('pandora_' + key.toLowerCase(), {
value: val,
previousValue: self.previousUI[key]
});
}
2011-05-25 19:42:45 +00:00
});
2011-09-27 22:12:37 +00:00
});
2013-02-16 01:20:40 +00:00
2011-10-01 13:51:18 +00:00
pandora.URL.update(Object.keys(
!pandora.$ui.appPanel ? args : trigger
));
2012-01-30 20:48:04 +00:00
};
2011-09-27 14:14:40 +00:00
return that;
2011-09-27 14:14:40 +00:00
2011-05-25 19:42:45 +00:00
}());