improvements to editor ui
This commit is contained in:
parent
d1477a057a
commit
007e525162
3 changed files with 187 additions and 102 deletions
|
@ -25,7 +25,9 @@ Ox.Select = function(options, self) {
|
||||||
|
|
||||||
// fixme: selected item needs attribute "checked", not "selected" ... that's strange
|
// fixme: selected item needs attribute "checked", not "selected" ... that's strange
|
||||||
var self = self || {},
|
var self = self || {},
|
||||||
that = new Ox.Element({}, self) // fixme: do we use 'div', or {}, or '', by default?
|
that = new Ox.Element({
|
||||||
|
tooltip: options.tooltip || {}
|
||||||
|
}, self) // fixme: do we use 'div', or {}, or '', by default?
|
||||||
.defaults({
|
.defaults({
|
||||||
id: '',
|
id: '',
|
||||||
items: [],
|
items: [],
|
||||||
|
@ -145,6 +147,7 @@ Ox.Select = function(options, self) {
|
||||||
function showMenu() {
|
function showMenu() {
|
||||||
that.gainFocus();
|
that.gainFocus();
|
||||||
that.addClass('OxSelected');
|
that.addClass('OxSelected');
|
||||||
|
self.options.tooltip && that.$tooltip.hide();
|
||||||
self.$menu.showMenu();
|
self.$menu.showMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -168,7 +168,7 @@ Ox.VideoEditor = function(options, self) {
|
||||||
['play', 'in', 'out'].forEach(function(type, i) {
|
['play', 'in', 'out'].forEach(function(type, i) {
|
||||||
self.$player[i] = new Ox.VideoPlayer({
|
self.$player[i] = new Ox.VideoPlayer({
|
||||||
controlsBottom: type == 'play' ?
|
controlsBottom: type == 'play' ?
|
||||||
['play', 'playInToOut', 'volume', 'space', 'position'] :
|
['play', 'playInToOut', 'volume', 'size', 'space', 'position'] :
|
||||||
['goto', 'set', 'space', 'position'],
|
['goto', 'set', 'space', 'position'],
|
||||||
duration: self.options.duration,
|
duration: self.options.duration,
|
||||||
externalControls: true,
|
externalControls: true,
|
||||||
|
@ -253,10 +253,6 @@ Ox.VideoEditor = function(options, self) {
|
||||||
self.$annotations = new Ox.Element()
|
self.$annotations = new Ox.Element()
|
||||||
.css({
|
.css({
|
||||||
overflowY: 'auto'
|
overflowY: 'auto'
|
||||||
})
|
|
||||||
.bindEvent({
|
|
||||||
resize: resizeAnnotations,
|
|
||||||
toggle: toggleAnnotations
|
|
||||||
});
|
});
|
||||||
self.$annotationPanel = [];
|
self.$annotationPanel = [];
|
||||||
|
|
||||||
|
@ -291,25 +287,10 @@ Ox.VideoEditor = function(options, self) {
|
||||||
.appendTo(self.$annotations);
|
.appendTo(self.$annotations);
|
||||||
});
|
});
|
||||||
|
|
||||||
self.$menubar = Ox.Bar({
|
self.$videobar = Ox.Bar({
|
||||||
size: 16
|
size: 16
|
||||||
}).addClass('OxVideoPlayer');
|
}).addClass('OxVideoPlayer');
|
||||||
|
|
||||||
self.$sizeButton = Ox.Button({
|
|
||||||
style: 'symbol',
|
|
||||||
title: [
|
|
||||||
{id: 'grow', title: 'grow', selected: self.options.size == 'small'},
|
|
||||||
{id: 'shrink', title: 'shrink', selected: self.options.size == 'large'}
|
|
||||||
],
|
|
||||||
tooltip: ['Larger', 'Smaller'],
|
|
||||||
type: 'image'
|
|
||||||
})
|
|
||||||
.css({float: 'left'})
|
|
||||||
.bindEvent({
|
|
||||||
click: toggleSize
|
|
||||||
})
|
|
||||||
.appendTo(self.$menubar);
|
|
||||||
|
|
||||||
self.resolutions = [];
|
self.resolutions = [];
|
||||||
Ox.forEach(self.options.video, function(url, resolution) {
|
Ox.forEach(self.options.video, function(url, resolution) {
|
||||||
Ox.print(url, resolution)
|
Ox.print(url, resolution)
|
||||||
|
@ -319,6 +300,121 @@ Ox.VideoEditor = function(options, self) {
|
||||||
});
|
});
|
||||||
Ox.print('::::::',self.resolutions)
|
Ox.print('::::::',self.resolutions)
|
||||||
|
|
||||||
|
self.$keyboardShortcuts = $('<div>');
|
||||||
|
[
|
||||||
|
{key: Ox.UI.symbols.space, action: 'Play/Pause'},
|
||||||
|
{key: 'P', action: 'Play In to Out'},
|
||||||
|
{key: '0', action: 'Mute/Unmute'},
|
||||||
|
{key: '-', action: 'Turn Volume Down'},
|
||||||
|
{key: '+', action: 'Turn Volume Up'},
|
||||||
|
{key: Ox.UI.symbols.arrow_left, action: 'Go One Frame Back'},
|
||||||
|
{key: Ox.UI.symbols.arrow_right, action: 'Go One Frame Forward'},
|
||||||
|
{key: Ox.UI.symbols.shift + Ox.UI.symbols.arrow_left, action: 'Go One Second Back'},
|
||||||
|
{key: Ox.UI.symbols.shift + Ox.UI.symbols.arrow_right, action: 'Go One Second Forward'},
|
||||||
|
{key: Ox.UI.symbols.arrow_up, action: 'Go One Line Up'},
|
||||||
|
{key: Ox.UI.symbols.arrow_down, action: 'Go One Line Down'},
|
||||||
|
{key: Ox.UI.symbols.shift + Ox.UI.symbols.arrow_up, action: 'Go to First Frame'},
|
||||||
|
{key: Ox.UI.symbols.shift + Ox.UI.symbols.arrow_down, action: 'Go to Last Frame'},
|
||||||
|
{key: 'I', action: 'Set In Point'},
|
||||||
|
{key: 'O', action: 'Set Out Point'},
|
||||||
|
{key: Ox.UI.symbols.shift + 'I', action: 'Go to Out Point'},
|
||||||
|
{key: Ox.UI.symbols.shift + 'O', action: 'Go to Out Point'},
|
||||||
|
{key: '[', action: 'Go to Previous Annotation'},
|
||||||
|
{key: ']', action: 'Go to Next Annotation'},
|
||||||
|
{key: '\\', action: 'Select Current Annotation'},
|
||||||
|
{key: '<', action: 'Go to Previous Cut'},
|
||||||
|
{key: '>', action: 'Go to Next Cut'},
|
||||||
|
{key: '/', action: 'Select Current Cuts'},
|
||||||
|
{key: 'F', action: 'Find'},
|
||||||
|
{key: Ox.UI.symbols.shift + 'G', action: 'Go to Previous Result'},
|
||||||
|
{key: 'G', action: 'Go to Next Result'},
|
||||||
|
{key: 'S', action: 'Select Current Annotation'},
|
||||||
|
{key: 'E', action: 'Edit Selected Annotation'},
|
||||||
|
{key: Ox.UI.symbols.return, action: 'Submit'},
|
||||||
|
{key: Ox.UI.symbols.escape, action: 'Cancel'},
|
||||||
|
].forEach(function(shortcut) {
|
||||||
|
self.$keyboardShortcuts.append(
|
||||||
|
$('<div>').css({display: 'table-row'})
|
||||||
|
.append(
|
||||||
|
$('<div>').css({
|
||||||
|
display: 'table-cell',
|
||||||
|
height: '16px',
|
||||||
|
paddingRight: '16px',
|
||||||
|
//fontWeight: 'bold',
|
||||||
|
textAlign: 'right'
|
||||||
|
})
|
||||||
|
.html(shortcut.key)
|
||||||
|
)
|
||||||
|
.append(
|
||||||
|
$('<div>').css({display: 'table-cell'})
|
||||||
|
.html(shortcut.action)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
})
|
||||||
|
|
||||||
|
self.$videoMenuButton = Ox.Select({
|
||||||
|
items: Ox.merge([
|
||||||
|
{id: 'toggleSize', title: 'Large Player', selected: self.options.playerSize == 'large', keyboard: 'shift +'},
|
||||||
|
{}
|
||||||
|
], self.resolutions, [
|
||||||
|
{},
|
||||||
|
{id: 'largeTimeline', title: 'Hide Large Timeline'},
|
||||||
|
{id: 'subtitlesTimeline', title: 'Hide Subtitles on Large Timeline'},
|
||||||
|
{},
|
||||||
|
{id: 'linkSelection', title: 'Link to Selection...'},
|
||||||
|
{id: 'embed', title: 'Embed Selection...'},
|
||||||
|
{id: 'downloadSelection', title: 'Download Selection...'},
|
||||||
|
{},
|
||||||
|
{id: 'keyboard', title: 'Keyboard Shortcuts...', keyboard: 'h'}
|
||||||
|
|
||||||
|
]),
|
||||||
|
selectable: false,
|
||||||
|
title: $('<img>').attr({
|
||||||
|
src: Ox.UI.getImagePath('symbolSet.svg')
|
||||||
|
}),
|
||||||
|
tooltip: 'Actions and Settings',
|
||||||
|
type: 'image'
|
||||||
|
})
|
||||||
|
.css({float: 'left'})
|
||||||
|
.bindEvent({
|
||||||
|
click: function(data) {
|
||||||
|
var id = data.id;
|
||||||
|
if (id == 'toggleSize') {
|
||||||
|
toggleSize();
|
||||||
|
} else if (id == 'keyboard') {
|
||||||
|
var dialog = Ox.Dialog({
|
||||||
|
buttons: [
|
||||||
|
Ox.Button({id: 'close', title: 'Close'})
|
||||||
|
.bindEvent({click: function() { dialog.close(); }})
|
||||||
|
],
|
||||||
|
content: self.$keyboardShortcuts,
|
||||||
|
height: 384,
|
||||||
|
keys: {enter: 'close', escape: 'close'},
|
||||||
|
title: 'Keyboard Shortcuts',
|
||||||
|
width: 256
|
||||||
|
}).open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.appendTo(self.$videobar);
|
||||||
|
self.$videoMenuButton.find('input').attr({
|
||||||
|
src: Ox.UI.getImagePath('symbolSet.svg')
|
||||||
|
})
|
||||||
|
|
||||||
|
self.$selectButton = Ox.Button({
|
||||||
|
style: 'symbol',
|
||||||
|
title: 'select',
|
||||||
|
type: 'image'
|
||||||
|
})
|
||||||
|
.css({float: 'left'})
|
||||||
|
.bindEvent({
|
||||||
|
click: function() {
|
||||||
|
self.$menuButton.find('input').trigger('click')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
//.appendTo(self.$videobar);
|
||||||
|
|
||||||
|
|
||||||
self.$resolutionSelect = Ox.Select({
|
self.$resolutionSelect = Ox.Select({
|
||||||
items: [{id: '96', title: '96p'},{id: '240', title: '240p'}],//self.resolutions,
|
items: [{id: '96', title: '96p'},{id: '240', title: '240p'}],//self.resolutions,
|
||||||
width: 48
|
width: 48
|
||||||
|
@ -329,55 +425,10 @@ Ox.VideoEditor = function(options, self) {
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.appendTo(self.$menubar);
|
//.appendTo(self.$videobar);
|
||||||
|
|
||||||
|
|
||||||
//$('<div>').css({float: 'left', width: '8px', height: '1px'}).appendTo(self.$menubar.$element);
|
//$('<div>').css({float: 'left', width: '8px', height: '1px'}).appendTo(self.$videobar.$element);
|
||||||
|
|
||||||
self.$linkButton = Ox.Button({
|
|
||||||
style: 'symbol',
|
|
||||||
title: 'arrowRight',
|
|
||||||
tooltip: 'Link...',
|
|
||||||
type: 'image'
|
|
||||||
})
|
|
||||||
.css({float: 'left'})
|
|
||||||
//.css({marginLeft: '16px'})
|
|
||||||
.bindEvent({
|
|
||||||
click: function() {
|
|
||||||
window.location.hash =
|
|
||||||
Ox.formatDuration(self.options['in'], 3) + '-' +
|
|
||||||
Ox.formatDuration(self.options.out, 3);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.appendTo(self.$menubar);
|
|
||||||
|
|
||||||
self.$embedButton = Ox.Button({
|
|
||||||
style: 'symbol',
|
|
||||||
title: 'embed',
|
|
||||||
tooltip: 'Embed...',
|
|
||||||
type: 'image'
|
|
||||||
})
|
|
||||||
.css({float: 'left'})
|
|
||||||
.bindEvent({
|
|
||||||
click: function() {
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.appendTo(self.$menubar);
|
|
||||||
|
|
||||||
self.$downloadButton = Ox.Button({
|
|
||||||
style: 'symbol',
|
|
||||||
title: 'download',
|
|
||||||
tooltip: 'Download...',
|
|
||||||
type: 'image'
|
|
||||||
})
|
|
||||||
.css({float: 'left'})
|
|
||||||
.bindEvent({
|
|
||||||
click: function() {
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.appendTo(self.$menubar);
|
|
||||||
|
|
||||||
self.$goToPosterButton = Ox.Button({
|
self.$goToPosterButton = Ox.Button({
|
||||||
style: 'symbol',
|
style: 'symbol',
|
||||||
|
@ -386,13 +437,12 @@ Ox.VideoEditor = function(options, self) {
|
||||||
type: 'image'
|
type: 'image'
|
||||||
})
|
})
|
||||||
.css({float: 'left'})
|
.css({float: 'left'})
|
||||||
.css({marginLeft: '16px'})
|
|
||||||
.bindEvent({
|
.bindEvent({
|
||||||
click: function() {
|
click: function() {
|
||||||
setPosition(self.options.posterFrame)
|
setPosition(self.options.posterFrame)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.appendTo(self.$menubar);
|
.appendTo(self.$videobar);
|
||||||
|
|
||||||
self.$setPosterButton = Ox.Button({
|
self.$setPosterButton = Ox.Button({
|
||||||
disabled: true,
|
disabled: true,
|
||||||
|
@ -409,7 +459,7 @@ Ox.VideoEditor = function(options, self) {
|
||||||
self.$unlockPosterButton.toggleTitle();
|
self.$unlockPosterButton.toggleTitle();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.appendTo(self.$menubar);
|
.appendTo(self.$videobar);
|
||||||
|
|
||||||
self.$unlockPosterButton = Ox.Button({
|
self.$unlockPosterButton = Ox.Button({
|
||||||
style: 'symbol',
|
style: 'symbol',
|
||||||
|
@ -426,21 +476,7 @@ Ox.VideoEditor = function(options, self) {
|
||||||
self.$setPosterButton.toggleDisabled();
|
self.$setPosterButton.toggleDisabled();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.appendTo(self.$menubar);
|
.appendTo(self.$videobar);
|
||||||
|
|
||||||
self.$helpButton = Ox.Button({
|
|
||||||
style: 'symbol',
|
|
||||||
title: 'help',
|
|
||||||
tooltip: 'Help',
|
|
||||||
type: 'image'
|
|
||||||
})
|
|
||||||
.css({float: 'right'})
|
|
||||||
.bindEvent({
|
|
||||||
click: function() {
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.appendTo(self.$menubar);
|
|
||||||
|
|
||||||
self.$clearButton = Ox.Button({
|
self.$clearButton = Ox.Button({
|
||||||
disabled: true,
|
disabled: true,
|
||||||
|
@ -456,7 +492,7 @@ Ox.VideoEditor = function(options, self) {
|
||||||
submitFindInput('');
|
submitFindInput('');
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.appendTo(self.$menubar);
|
.appendTo(self.$videobar);
|
||||||
|
|
||||||
self.$findInput = Ox.Input({
|
self.$findInput = Ox.Input({
|
||||||
autocomplete: self.words,
|
autocomplete: self.words,
|
||||||
|
@ -478,7 +514,7 @@ Ox.VideoEditor = function(options, self) {
|
||||||
submitFindInput(data.value, true);
|
submitFindInput(data.value, true);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.appendTo(self.$menubar);
|
.appendTo(self.$videobar);
|
||||||
self.$findInput.find('input').css({background: 'transparent'})
|
self.$findInput.find('input').css({background: 'transparent'})
|
||||||
|
|
||||||
self.$findButton = Ox.Button({
|
self.$findButton = Ox.Button({
|
||||||
|
@ -494,7 +530,7 @@ Ox.VideoEditor = function(options, self) {
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
//.appendTo(self.$menubar);
|
//.appendTo(self.$videobar);
|
||||||
|
|
||||||
self.$nextButton = Ox.Button({
|
self.$nextButton = Ox.Button({
|
||||||
disabled: true,
|
disabled: true,
|
||||||
|
@ -509,7 +545,7 @@ Ox.VideoEditor = function(options, self) {
|
||||||
setPosition(getNextPosition('result', 1))
|
setPosition(getNextPosition('result', 1))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.appendTo(self.$menubar);
|
.appendTo(self.$videobar);
|
||||||
|
|
||||||
self.$previousButton = Ox.Button({
|
self.$previousButton = Ox.Button({
|
||||||
disabled: true,
|
disabled: true,
|
||||||
|
@ -524,12 +560,43 @@ Ox.VideoEditor = function(options, self) {
|
||||||
setPosition(getNextPosition('result', -1))
|
setPosition(getNextPosition('result', -1))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.appendTo(self.$menubar);
|
.appendTo(self.$videobar);
|
||||||
|
|
||||||
self.$results = $('<div>')
|
self.$results = $('<div>')
|
||||||
.css({float: 'right', width: '36px', padding: '2px 4px 0 0', fontSize: '9px', textAlign: 'right', cursor: 'default', opacity: 0.25})
|
.css({float: 'right', width: '36px', padding: '2px 4px 0 0', fontSize: '9px', textAlign: 'right', cursor: 'default', opacity: 0.25})
|
||||||
.html('0')
|
.html('0')
|
||||||
.appendTo(self.$menubar.$element);
|
.appendTo(self.$videobar.$element);
|
||||||
|
|
||||||
|
self.$annotationsbar = Ox.Bar({
|
||||||
|
size: 16
|
||||||
|
}).addClass('OxVideoPlayer');
|
||||||
|
|
||||||
|
self.$annotationsMenuButton = Ox.Select({
|
||||||
|
items: [
|
||||||
|
{id: 'annotations', title: 'Show Annotations', disabled: true},
|
||||||
|
{id: 'showAnnotationsAtPosition', title: 'At Current Position', checked: true},
|
||||||
|
{id: 'showAnnotationsInSelection', title: 'In Current Selection'},
|
||||||
|
{id: 'showAllAnnotations', title: 'All'},
|
||||||
|
{},
|
||||||
|
{id: 'textSize', title: 'Font Size', disabled: true},
|
||||||
|
{id: 'smallText', title: 'Small', checked: true},
|
||||||
|
{id: 'mediumText', title: 'Medium'},
|
||||||
|
{id: 'largeText', title: 'Large'}
|
||||||
|
|
||||||
|
],
|
||||||
|
max: 2,
|
||||||
|
title: $('<img>').attr({
|
||||||
|
src: Ox.UI.getImagePath('symbolSet.svg')
|
||||||
|
}),
|
||||||
|
tooltip: 'Actions and Settings',
|
||||||
|
type: 'image'
|
||||||
|
})
|
||||||
|
.css({float: 'left'})
|
||||||
|
.appendTo(self.$annotationsbar);
|
||||||
|
self.$annotationsMenuButton.find('input').attr({
|
||||||
|
src: Ox.UI.getImagePath('symbolSet.svg')
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
that.$element = Ox.SplitPanel({
|
that.$element = Ox.SplitPanel({
|
||||||
elements: [
|
elements: [
|
||||||
|
@ -537,7 +604,7 @@ Ox.VideoEditor = function(options, self) {
|
||||||
element: Ox.SplitPanel({
|
element: Ox.SplitPanel({
|
||||||
elements: [
|
elements: [
|
||||||
{
|
{
|
||||||
element: self.$menubar,
|
element: self.$videobar,
|
||||||
size: 16
|
size: 16
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -550,7 +617,22 @@ Ox.VideoEditor = function(options, self) {
|
||||||
{
|
{
|
||||||
collapsed: !self.options.showAnnotations,
|
collapsed: !self.options.showAnnotations,
|
||||||
collapsible: true,
|
collapsible: true,
|
||||||
element: self.$annotations,
|
element: Ox.SplitPanel({
|
||||||
|
elements: [
|
||||||
|
{
|
||||||
|
element: self.$annotationsbar,
|
||||||
|
size: 16
|
||||||
|
},
|
||||||
|
{
|
||||||
|
element: self.$annotations,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
orientation: 'vertical'
|
||||||
|
})
|
||||||
|
.bindEvent({
|
||||||
|
resize: resizeAnnotations,
|
||||||
|
toggle: toggleAnnotations
|
||||||
|
}),
|
||||||
resizable: true,
|
resizable: true,
|
||||||
resize: [192, 256, 320, 384],
|
resize: [192, 256, 320, 384],
|
||||||
size: self.options.annotationsSize
|
size: self.options.annotationsSize
|
||||||
|
|
|
@ -492,23 +492,23 @@ Video
|
||||||
}
|
}
|
||||||
|
|
||||||
.OxThemeModern .OxVideoPlayer .OxSelect {
|
.OxThemeModern .OxVideoPlayer .OxSelect {
|
||||||
border: 0;
|
border-color: transparent;
|
||||||
margin-left: 0px;
|
//margin-left: 0px;
|
||||||
margin-right: -18px;
|
//margin-right: -18px;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
font-size: 9px;
|
//font-size: 9px;
|
||||||
}
|
}
|
||||||
.OxThemeModern .OxVideoPlayer .OxSelect.OxFocus {
|
.OxThemeModern .OxVideoPlayer .OxSelect.OxFocus {
|
||||||
-moz-box-shadow: 0 0 0;
|
-moz-box-shadow: 0 0 0;
|
||||||
-webkit-box-shadow: 0 0 0;
|
-webkit-box-shadow: 0 0 0;
|
||||||
}
|
}
|
||||||
.OxThemeModern .OxVideoPlayer .OxSelect div {
|
.OxThemeModern .OxVideoPlayer .OxSelect div {
|
||||||
padding: 2px 0 0 0;
|
//padding: 0 0 0 2px;
|
||||||
font-size: 9px;
|
//font-size: 9px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.OxThemeModern .OxVideoPlayer .OxSelect input {
|
.OxThemeModern .OxVideoPlayer .OxSelect input {
|
||||||
display: none;
|
//display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue