diff --git a/build/css/ox.ui.modern.css b/build/css/ox.ui.modern.css index 13d1b6ca..338ead22 100644 --- a/build/css/ox.ui.modern.css +++ b/build/css/ox.ui.modern.css @@ -349,6 +349,9 @@ Video .OxThemeModern .OxAnnotation { border-color: rgb(48, 48, 48); } +.OxThemeModern .OxAnnotation.OxSelected { + background: rgb(48, 48, 48); +} .OxThemeModern .OxVideoPlayer { background: rgb(0, 0, 0); diff --git a/build/js/ox.ui.js b/build/js/ox.ui.js index 7db34ed0..36be7ac9 100644 --- a/build/js/ox.ui.js +++ b/build/js/ox.ui.js @@ -10,6 +10,8 @@ requires // also see test.js, in demos ... +// fixme: render might be a better function name than construct + (function() { // fixme: move into Ox.UI @@ -6452,21 +6454,36 @@ requires Ox.List = function(options, self) { + /*** + basic list object + Options + centered boolean if true, and orientation is 'horizontal', + then keep the selected item centered + construct function function(data), returns the list item HTML + request function function(callback) returns {items, size, ...} + function(data, callback) returns [items] + Methods + Events + ***/ + + // fixme: items and request should be the same option + var self = self || {}, that = new Ox.Container({}, self) .defaults({ centered: false, - construct: function() {}, + construct: null, draggable: false, format: [], itemHeight: 16, + items: null, itemWidth: 16, keys: [], max: -1, min: 0, orientation: 'vertical', pageLength: 100, - request: function() {}, // (data, callback), without data returns {items, size etc.} + request: null, selected: [], sort: [], sortable: false, @@ -6518,17 +6535,13 @@ requires scrollTimeout: 0, selected: [] }); - if (self.options.max == -1) { - $.extend(self.keyboardEvents, { - key_alt_control_a: invertSelection, - key_control_a: selectAll - }); - } - if (self.options.min == 0) { - $.extend(self.keyboardEvents, { - key_control_shift_a: selectNone - }); - } + self.options.max == -1 && $.extend(self.keyboardEvents, { + key_alt_control_a: invertSelection, + key_control_a: selectAll + }); + self.options.min == 0 && $.extend(self.keyboardEvents, { + key_control_shift_a: selectNone + }); self.keyboardEvents[ 'key_' + (self.options.orientation == 'vertical' ? 'up' : 'left') ] = selectPrevious; @@ -6567,9 +6580,14 @@ requires }); } - updateQuery(self.options.selected); + Ox.print('OxList', self.options) + if (Ox.isArray(self.options.items)) { + loadItems(); + } else { + updateQuery(self.options.selected); + } that.bindEvent(self.keyboardEvents); - $window.resize(that.size); + $window.resize(that.size); // fixme: this is not the widget's job function addAboveToSelection() { var pos = getAbove(); @@ -7040,6 +7058,21 @@ requires return self.selected.indexOf(pos) > -1; } + function loadItems() { + self.options.items.forEach(function(item, pos) { + // fixme: duplicated + self.$items[pos] = new Ox.ListItem({ + construct: self.options.construct, + data: item, + draggable: self.options.draggable, + position: pos, + unique: self.options.unique + }); + isSelected(pos) && self.$items[pos].addClass('OxSelected'); + self.$items[pos].appendTo(that.$content); + }); + } + function loadPage(page, callback) { if (page < 0 || page >= self.pages) { !Ox.isUndefined(callback) && callback(); @@ -7171,18 +7204,17 @@ requires } function _mousedown(e) { - Ox.print('mousedown') var pos = findItemPosition(e), clickable, editable, clickTimeout = false, selectTimeout = false, $cell, hadFocus = that.hasFocus(); + Ox.print('mousedown', pos) that.gainFocus(); if (pos > -1) { if (!self.clickTimeout) { // click - //Ox.print('^^^^', 'pos', pos, 'id', $item.data('id')) if (e.metaKey) { if (!isSelected(pos) && (self.options.max == -1 || self.options.max > self.selected.length)) { addToSelection(pos); @@ -7488,7 +7520,7 @@ requires var ids = self.options.selected = getSelectedIds(); setTimeout(function() { var ids_ = getSelectedIds(); - //Ox.print('ids', ids, 'ids after 100 msec', ids_) + Ox.print('ids', ids, 'ids after 100 msec', ids_) if (ids.length == ids_.length && (ids.length == 0 || ids[0] == ids_[0])) { that.triggerEvent('select', { ids: ids @@ -7497,7 +7529,7 @@ requires ids: ids }); } else { - //Ox.print('select event not triggered after timeout'); + Ox.print('select event not triggered after timeout'); } }, 100); } @@ -7521,9 +7553,10 @@ requires unloadPage(page + 1) } - function updateQuery(ids) { + function updateQuery(ids) { // fixme: shouldn't this be setQuery? // ids are the selcected ids // (in case list is loaded with selection) + Ox.print('####', self.options) clear(); self.requests.push(self.options.request({}, function(result) { var keys = {}; @@ -10429,10 +10462,13 @@ requires id: '', items: [], title: '', - type: 'text' + type: 'text', + width: 0 }) .options(options || {}); + self.selected = -1; + that.$element = new Ox.CollapsePanel({ collapsed: false, extras: [ @@ -10452,14 +10488,59 @@ requires }); that.$content = that.$element.$content; + self.$annotations = new Ox.List({ + construct: function(data) { + return new Ox.Element('div') + .addClass('OxAnnotation OxTarget') + .html(data.value); + }, + items: $.map(self.options.items, function(v, i) { + return {value: v.value.replace(/\n/g, '
')}; + }), + }) + .bindEvent({ + select: selectAnnotation + }) + .appendTo(that.$content); + + /* self.$annotations = new Ox.Element('div') .appendTo(that.$content); + self.$annotation = []; self.options.items.forEach(function(item, i) { - new Ox.Element('div') + self.$annotation[i] = new Ox.Element('div') .addClass('OxAnnotation') - .html(item.value) + .html(item.value.replace(/\n/g, '
')) + .click(function() { + clickAnnotation(i); + }) .appendTo(self.$annotations); }); + */ + + function selectAnnotation(event, data) { + var pos = data.selected.ids[0], + item = self.options.items[pos]; + if (pos != self.selected) { + self.selected > -1 && + self.$annotation[self.selected].removeClass('OxSelected'); + self.selected = pos; + self.$annotation[self.selected].addClass('OxSelected'); + that.triggerEvent('select', { + 'in': item.in, + 'out': item.out + }); + } else { + self.$annotation[pos].replaceWith( + new Ox.Input({ + height: 128, + type: 'textarea', + value: item.value, + width: self.options.width + }) + ); + } + } function togglePanel() { @@ -11465,8 +11546,13 @@ requires self.options.layers.forEach(function(layer, i) { self.$annotationPanel[i] = new Ox.AnnotationPanel( - $.extend({}, layer, layer.id == 'subtitles' ? {items: self.options.subtitles} : {}) + $.extend({ + width: self.options.annotationSize + }, layer, layer.id == 'subtitles' ? {items: self.options.subtitles} : {}) ) + .bindEvent({ + select: selectAnnotation + }) .appendTo(self.$annotations); }); @@ -11674,6 +11760,13 @@ requires }); } + function selectAnnotation(event, data) { + self.options.position = data.in + self.options.points = [data.in, data.out]; + setPosition(); + setPoints(); + } + function setPoint(point) { self.options.points[point == 'in' ? 0 : 1] = self.options.position; self.$player[point == 'in' ? 1 : 2].options({ @@ -11685,13 +11778,16 @@ requires position: self.options.position }); } + setPoints(); + } + + function setPoints() { $.each(self.$player, function(i, v) { v.options({ points: self.options.points }); }); $.each(self.$timeline, function(i, v) { - //Ox.print('points:', self.options.points) v.options({ points: self.options.points });