diff --git a/static/js/list.js b/static/js/list.js index 3a52753d..f40ee4e3 100644 --- a/static/js/list.js +++ b/static/js/list.js @@ -3,8 +3,7 @@ pandora.ui.list = function() { - var preview = false, - that, + var that, view = pandora.user.ui.listView; if (view == 'list') { @@ -390,8 +389,7 @@ pandora.ui.list = function() { that.bindEvent({ closepreview: function(data) { pandora.$ui.previewDialog.close(); - preview = false; - //delete pandora.$ui.previewDialog; + delete pandora.$ui.previewDialog; }, copy: function(data) { Ox.Clipboard.copy(data.ids, 'item'); @@ -443,89 +441,18 @@ pandora.ui.list = function() { pandora.UI.set(set); }, openpreview: function(data) { - if (data.ids.length) { - // ... + if (!pandora.$ui.previewDialog) { + pandora.$ui.previewDialog = pandora.ui.previewDialog() + .open() + .bindEvent({ + close: function() { + that.closePreview(); + delete pandora.$ui.previewDialog; + } + }); + } else { + pandora.$ui.previewDialog.update(); } - pandora.requests.preview && pandora.api.cancel(pandora.requests.preview); - pandora.requests.preview = pandora.api.find({ - keys: ['director', 'id', 'modified', 'posterRatio', 'title', 'year'], - query: { - conditions: data.ids.map(function(id) { - return { - key: 'id', - value: id, - operator: '==' - }; - }), - operator: '|' - } - }, function(result) { - var item = result.data.items[0], - title = item.title + ( - item.director ? ' (' + item.director.join(', ') + ')' : '' - ) + ( - item.year ? ' ' + item.year : '' - ), - ratio = pandora.user.ui.showSitePosters ? pandora.site.posters.ratio : item.posterRatio, - windowWidth = window.innerWidth * 0.8, - windowHeight = window.innerHeight * 0.8, - windowRatio = windowWidth / windowHeight, - width = Math.round(ratio > windowRatio ? windowWidth : windowHeight * ratio), - height = Math.round(ratio < windowRatio ? windowHeight : windowWidth / ratio); - pandora.$ui.previewImage = $('') - .attr({src: '/' + item.id + '/' + ( - pandora.user.ui.showSitePosters ? 'siteposter' : 'poster' - ) + '128.jpg'}) - .css({width: width + 'px', height: height + 'px'}) - $('').load(function() { - pandora.$ui.previewImage.attr({src: $(this).attr('src')}); - }) - .attr({src: '/' + item.id + '/' + ( - pandora.user.ui.showSitePosters ? 'siteposter' : 'poster' - ) + '1024.jpg'}); - if (!preview) { - if (!pandora.$ui.previewDialog) { - pandora.$ui.previewDialog = Ox.Dialog({ - closeButton: true, - content: pandora.$ui.previewImage, - fixedRatio: true, - focus: false, - height: height, - maximizeButton: true, - title: title, - width: width - }) - .bindEvent({ - close: function() { - that.closePreview(); - preview = false; - }, - resize: function(data) { - pandora.$ui.previewImage.css({ - width: data.width + 'px', - height: data.height + 'px' - }); - } - }) - .open(); - } else { - pandora.$ui.previewDialog.options({ - content: pandora.$ui.previewImage, - height: height, - title: title, - width: width - }) - .open(); - } - preview = true; - } else { - pandora.$ui.previewDialog.options({ - content: pandora.$ui.previewImage, - title: title - }) - .setSize(width, height); - } - }); }, paste: function(data) { var items; diff --git a/static/js/previewDialog.js b/static/js/previewDialog.js new file mode 100644 index 00000000..f3e98f31 --- /dev/null +++ b/static/js/previewDialog.js @@ -0,0 +1,102 @@ +'use strict'; + +pandora.ui.previewDialog = function() { + + var $image, + $list = pandora.$ui.list, + item = Ox.last($list.options('selected')), + posterRatio = pandora.user.ui.showSitePosters + ? pandora.site.posters.ratio + : ($list.value(item, 'posterRatio') || pandora.site.posters.ratio), + size = getSize(posterRatio), + that = Ox.Dialog({ + closeButton: true, + content: Ox.Element(), + fixedRatio: true, + focus: false, + height: size.height, + maximizeButton: true, + title: Ox._('Loading...'), + width: size.width + }) + .bindEvent({ + resize: function(data) { + // FIXME: why doesn't that.options('content') work here? + // (currently the only reason $image is in the outer scope) + $image.css({ + width: data.width, + height: data.height + }); + }, + pandora_find: function() { + that.close(); + }, + pandora_item: function() { + that.close(); + }, + pandora_section: function() { + that.close(); + }, + pandora_showsiteposters: function() { + that.update(); + } + }); + + function getSize(posterRatio) { + var windowWidth = window.innerWidth * 0.8, + windowHeight = window.innerHeight * 0.8, + windowRatio = windowWidth / windowHeight; + return { + width: Math.round(posterRatio > windowRatio ? windowWidth : windowHeight * posterRatio), + height: Math.round(posterRatio < windowRatio ? windowHeight : windowWidth / posterRatio) + }; + } + + that.update = function() { + pandora.requests.preview && pandora.api.cancel(pandora.requests.preview); + pandora.requests.preview = pandora.api.find({ + keys: ['director', 'id', 'modified', 'posterRatio', 'title', 'year'], + query: { + conditions: [{ + key: 'id', + operator: '==', + value: Ox.last($list.options('selected')) + }], + operator: '&' + } + }, function(result) { + var item = result.data.items[0], + posterRatio = pandora.user.ui.showSitePosters + ? pandora.site.posters.ratio + : item.posterRatio, + size = getSize(posterRatio), + title = item.title + ( + item.director ? ' (' + item.director.join(', ') + ')' : '' + ) + ( + item.year ? ' ' + item.year : '' + ); + $image = $('') + .attr({src: '/' + item.id + '/' + ( + pandora.user.ui.showSitePosters ? 'siteposter' : 'poster' + ) + '128.jpg?' + item.modified}) + .css({width: size.width + 'px', height: size.height + 'px'}); + $('') + .load(function() { + $image.attr({src: $(this).attr('src')}); + }) + .attr({src: '/' + item.id + '/' + ( + pandora.user.ui.showSitePosters ? 'siteposter' : 'poster' + ) + '1024.jpg?' + item.modified}); + that.options({ + content: $image, + title: title, + }) + .setSize(size.width, size.height); + }); + return that; + } + + return that.update(); + +}; +