diff --git a/ui/gallery-prototype.js b/ui/gallery-prototype.js index da9f0903..ba503877 100755 --- a/ui/gallery-prototype.js +++ b/ui/gallery-prototype.js @@ -244,7 +244,7 @@ var DEBUG = true ImageGrid.GROUP('State', ImageGrid.OPTION({ name: 'BACKGROUND_MODES', - doc: 'list of available background styles.\n'+ + doc: 'list of available background styles.\n\n'+ 'NOTE: there is also a null mode that is what is set in the '+ 'main CSS.', display: false, @@ -259,7 +259,7 @@ ImageGrid.GROUP('State', name: 'NORMAL_MODE_BG', display: false, value: null, - doc: 'Background style in normal (ribbon) mode.\n'+ + doc: 'Background style in normal (ribbon) mode.\n\n'+ 'NOTE: This will get updated on background change in tuntime.\n'+ 'NOTE: null represents the default style.', callback: function(){ @@ -272,7 +272,7 @@ ImageGrid.GROUP('State', name: 'SINGLE_IMAGE_MODE_BG', display: false, value: 'black', - doc: 'Background style in single image mode.\n'+ + doc: 'Background style in single image mode.\n\n'+ 'NOTE: This will get updated on background change in tuntime.\n'+ 'NOTE: null represents the default style.', callback: function(){ @@ -285,11 +285,11 @@ ImageGrid.GROUP('State', name: 'ORIGINAL_FIELD_SCALE', display: false, value: 1.0, - doc: 'Scale of view in image mode.\n'+ + doc: 'Scale of view in image mode.\n\n'+ 'NOTE: this will change if changed at runtime.', callback: function(){ if(ImageGrid.toggleSingleImageMode('?') == 'off'){ - setContainerScale(ImageGrid.option.ORIGINAL_FIELD_SCALE) + ImageGrid.setContainerScale(ImageGrid.option.ORIGINAL_FIELD_SCALE) } } })) @@ -375,6 +375,40 @@ function showInOverlay(obj){ +function getElementScale(elem){ + //var transform = elem.css('transform') + var vendors = ['o', 'moz', 'ms', 'webkit'] + var transform = elem.css('transform') + var res + + // go through vendor prefixes... (hate this!) + if(!transform || transform == 'none'){ + for(var i in vendors){ + transform = elem.css('-' + vendors[i] + '-transform') + if(transform && transform != 'none'){ + break + } + } + } + // no transform is set... + if(!transform || transform == 'none'){ + return 1 + } + // get the scale value -- first argument of scale/matrix... + return parseFloat((/(scale|matrix)\(([^,]*),.*\)/).exec(transform)[2]) +} + + +function setElementScale(elem, scale){ + return elem.css({ + 'transform': 'scale('+scale+', '+scale+')', + '-moz-transform': 'scale('+scale+', '+scale+')', + '-o-transform': 'scale('+scale+', '+scale+')', + '-ms-transform': 'scale('+scale+', '+scale+')', + '-webkit-transform': 'scale('+scale+', '+scale+')', + }) +} + // this will create a function that will add/remove a css_class to elem // calling the optional callbacks before and/or after. // @@ -775,12 +809,12 @@ function setupControlElements(){ // XXX rename classes to "shift-image-up" and "shift-image-down"... $('.screen-button.demote').click(shiftImageUp) $('.screen-button.promote').click(shiftImageDown) - $('.screen-button.zoom-in').click(function(){scaleContainerBy(ImageGrid.option.ZOOM_FACTOR)}) - $('.screen-button.zoom-out').click(function(){scaleContainerBy(1/ImageGrid.option.ZOOM_FACTOR)}) + $('.screen-button.zoom-in').click(ImageGrid.scaleContainerUp) + $('.screen-button.zoom-out').click(ImageGrid.scaleContainerDown) // XXX - $('.screen-button.toggle-wide').click(function(){scaleContainerBy(0.2)}) + $('.screen-button.toggle-wide').click(function(){ImageGrid.scaleContainerBy(0.2)}) $('.screen-button.toggle-single').click(ImageGrid.toggleSingleImageMode) - $('.screen-button.fit-three').click(fitThreeImages) + $('.screen-button.fit-three').click(ImageGrid.fitThreeImages) $('.screen-button.show-controls').click(function(){ImageGrid.toggleControls('on')}) $('.screen-button.settings').click(ImageGrid.showSetup) } @@ -878,8 +912,6 @@ function loadJSON(data, set_order){ -/*********************************************************************/ - /*************************************************** Event Handlers **/ @@ -1033,75 +1065,6 @@ function toggleBackgroundModes(){ -// XXX use order and priority of options... -// XXX make history work for this... -// XXX should this be a toggle?? -ImageGrid.ACTION({ - title: 'Settings', - doc: 'Show setup interface.', -}, -function showSetup(){ - var opts = ImageGrid.option - var opt_ps = ImageGrid.option_props - var groups = {} - - var opts_container = $('
') - // build options... - for(var n in opt_ps){ - var disabled = false - var opt = opt_ps[n] - var group = opt.group - // handle disabled opts... - if(opt.display == false){ - if(!DEBUG){ - continue - } - disabled = true - } - // build an option... - var option = $('
').append($([ - $('
').text(opt.title != null ? opt.title : n)[0], - $('
').html(opt['doc'].replace(/\n/g, '
'))[0], - $('
').text(opts[n])[0] - ])) - // group things correctly... - if(group == null){ - group = 'Other' - } - if(groups[group] == null){ - groups[group] = $('
') - .append($('
').text(group)) - .append(option) - } else { - groups[group].append(option) - } - // event handlers... - var handler = opt_ps[n].click_handler - if(disabled){ - option.addClass('disabled') - } else if(handler != null){ - option.click(handler) - } - } - // build groups... - for(var i = 0; i < ImageGrid.option_groups.length; i++){ - var group_name = ImageGrid.option_groups[i] - opts_container.append(groups[group_name]) - } - opts_container.append(groups['Other']) - opts_container.click(function(e){ - // update the view... - // XXX do we need to redraw the whole thing on each click??? - ImageGrid.showSetup() - e.preventDefault() - return false - }) - showInOverlay(opts_container) -}) - - - - ImageGrid.GROUP('Mode: All', ImageGrid.ACTION({ id: 'toggleControls', @@ -1116,8 +1079,78 @@ ImageGrid.GROUP('Mode: All', doc: 'Toggle global transitions.', type: 'toggle', }, - createCSSClassToggler('.viewer', 'transitions-enabled'))) + createCSSClassToggler('.viewer', 'transitions-enabled')), + // XXX use order and priority of options... + // XXX make history work for this... + // XXX should this be a toggle?? + ImageGrid.ACTION({ + title: 'Settings', + doc: 'Show setup interface.', + }, + function showSetup(){ + var opts = ImageGrid.option + var opt_ps = ImageGrid.option_props + var groups = {} + + var opts_container = $('
') + // build options... + for(var n in opt_ps){ + var disabled = false + var opt = opt_ps[n] + var group = opt.group + // handle disabled opts... + if(opt.display == false){ + if(!DEBUG){ + continue + } + disabled = true + } + // build an option... + var option = $('
').append($([ + $('
').text(opt.title != null ? opt.title : n)[0], + $('
').html(opt['doc'].replace(/\n/g, '
'))[0], + $('
').text(opts[n])[0] + ])) + // group things correctly... + if(group == null){ + group = 'Other' + } + if(groups[group] == null){ + groups[group] = $('
') + .append($('
').text(group)) + .append(option) + } else { + groups[group].append(option) + } + // event handlers... + var handler = opt_ps[n].click_handler + if(disabled){ + option.addClass('disabled') + } else if(handler != null){ + option.click(handler) + } + } + // build groups... + for(var i = 0; i < ImageGrid.option_groups.length; i++){ + var group_name = ImageGrid.option_groups[i] + opts_container.append(groups[group_name]) + } + opts_container.append(groups['Other']) + opts_container.click(function(e){ + // update the view... + // XXX do we need to redraw the whole thing on each click??? + ImageGrid.showSetup() + e.preventDefault() + return false + }) + showInOverlay(opts_container) + }), + + ImageGrid.ACTION({ + title: 'Close overlay' + }, + function closeOverlay(){ $('.overlay').click() })) @@ -1143,10 +1176,10 @@ ImageGrid.GROUP('Mode: Single Image', // post... function(action){ if(action == 'on'){ - fitImage() + ImageGrid.fitImage() setBackgroundMode(ImageGrid.option.SINGLE_IMAGE_MODE_BG) } else { - setContainerScale(ImageGrid.option.ORIGINAL_FIELD_SCALE) + ImageGrid.setContainerScale(ImageGrid.option.ORIGINAL_FIELD_SCALE) setBackgroundMode(ImageGrid.option.NORMAL_MODE_BG) } clickAfterTransitionsDone() @@ -1377,79 +1410,76 @@ ImageGrid.GROUP('Navigation', /********************************************************** Zooming **/ -// NOTE: this will only return a single scale value... -function getElementScale(elem){ - //var transform = elem.css('transform') - var vendors = ['o', 'moz', 'ms', 'webkit'] - var transform = elem.css('transform') - var res - // go through vendor prefixes... (hate this!) - if(!transform || transform == 'none'){ - for(var i in vendors){ - transform = elem.css('-' + vendors[i] + '-transform') - if(transform && transform != 'none'){ - break - } - } - } - // no transform is set... - if(!transform || transform == 'none'){ - return 1 - } - // get the scale value -- first argument of scale/matrix... - return parseFloat((/(scale|matrix)\(([^,]*),.*\)/).exec(transform)[2]) -} +ImageGrid.GROUP('Zooming', + // XXX is this an action or a helper??? + ImageGrid.ACTION({ + title: 'Get element scale', + doc: 'Return a scale value for the given element(s).\n\n'+ + 'NOTE: this will only return a single scale value...', + }, + getElementScale), + ImageGrid.ACTION({ + title: 'Set element scale', + doc: 'Set the scale value for the given element(s).' + }, + setElementScale), + ImageGrid.ACTION({ + title: 'Scale container by factor', + }, + function scaleContainerBy(factor){ + return ImageGrid.setContainerScale(getElementScale($('.field'))*factor) + }), + ImageGrid.ACTION({ + title: 'Scale container up', + }, + function scaleContainerUp(){ + return ImageGrid.scaleContainerBy(ImageGrid.option.ZOOM_FACTOR) + }), + ImageGrid.ACTION({ + title: 'Scale container down', + }, + function scaleContainerDown(){ + return ImageGrid.scaleContainerBy(1/ImageGrid.option.ZOOM_FACTOR) + }), -function setElementScale(elem, scale){ - return elem.css({ - 'transform': 'scale('+scale+', '+scale+')', - '-moz-transform': 'scale('+scale+', '+scale+')', - '-o-transform': 'scale('+scale+', '+scale+')', - '-ms-transform': 'scale('+scale+', '+scale+')', - '-webkit-transform': 'scale('+scale+', '+scale+')', - }) -} + ImageGrid.ACTION({ + title: 'Set container scale', + }, + function setContainerScale(scale){ + return setElementScale($('.field'), scale) + }), + ImageGrid.ACTION({ + title: 'Fit N images to container width/height', + }, + function fitNImages(n){ + var H = $('.container').height() + var W = $('.container').width() -function scaleContainerBy(factor){ - return setContainerScale(getElementScale($('.field'))*factor) -} + var h = $('.image.current').height() + // NOTE: this is cheating, need to get actual three widths... + var w = $('.image.current').width()*n + var f = Math.min(H/h, W/w) + ImageGrid.setContainerScale(f) + }), -function setContainerScale(scale){ - return setElementScale($('.field'), scale) -} - - - -function fitNImages(n){ - var H = $('.container').height() - var W = $('.container').width() - - var h = $('.image.current').height() - // NOTE: this is cheating, need to get actual three widths... - var w = $('.image.current').width()*n - - var f = Math.min(H/h, W/w) - - setContainerScale(f) -} - - -function fitImage(){fitNImages(1)} -function fitTwoImages(){fitNImages(2)} -function fitThreeImages(){fitNImages(3)} -function fitFourImages(){fitNImages(4)} -function fitFiveImages(){fitNImages(5)} -function fitSixImages(){fitNImages(6)} -function fitSevenImages(){fitNImages(7)} -function fitEightImages(){fitNImages(8)} -function fitNineImages(){fitNImages(9)} + // the fit N image pack, for 1 <= N <= 9 + ImageGrid.ACTION({ title: 'Fit single image' }, function fitImage(){ImageGrid.fitNImages(1)}), + ImageGrid.ACTION({ title: 'Fit two images' }, function fitTwoImages(){ImageGrid.fitNImages(2)}), + ImageGrid.ACTION({ title: 'Fit three images' }, function fitThreeImages(){ImageGrid.fitNImages(3)}), + ImageGrid.ACTION({ title: 'Fit four images' }, function fitFourImages(){ImageGrid.fitNImages(4)}), + ImageGrid.ACTION({ title: 'Fit five images' }, function fitFiveImages(){ImageGrid.fitNImages(5)}), + ImageGrid.ACTION({ title: 'Fit six images' }, function fitSixImages(){ImageGrid.fitNImages(6)}), + ImageGrid.ACTION({ title: 'Fit seven images' }, function fitSevenImages(){ImageGrid.fitNImages(7)}), + ImageGrid.ACTION({ title: 'Fit eight images' }, function fitEightImages(){ImageGrid.fitNImages(8)}), + ImageGrid.ACTION({ title: 'Fit nine images' }, function fitNineImages(){ImageGrid.fitNImages(9)}) +) diff --git a/ui/keybindings.js b/ui/keybindings.js index fea0c66f..c059cc3e 100755 --- a/ui/keybindings.js +++ b/ui/keybindings.js @@ -2,7 +2,7 @@ // NOTE: use String.fromCharCode(code)... var keybindings = { // togglable modes and options... - 191: ImageGrid.showSetup, // ? + 191: ImageGrid.showSetup, // ? 70: ImageGrid.toggleSingleImageMode, // f 83: ImageGrid.toggleSingleRibbonMode, // s 13: 70, // Enter @@ -13,32 +13,26 @@ var keybindings = { 77: toggleMarkers, // m - 27: [ - // XXX make this into a real action... - function(){$('.overlay').click()}, // Esc - 'Hide overlay' - ], + 27: ImageGrid.closeOverlay(), // Esc // zooming... - // XXX make this into a real action... - 187: function(){scaleContainerBy(ImageGrid.option.ZOOM_FACTOR)}, // + - // XXX make this into a real action... - 189: function(){scaleContainerBy(1/ImageGrid.option.ZOOM_FACTOR)}, // - + 187: ImageGrid.scaleContainerUp, // + + 189: ImageGrid.scaleContainerDown, // - // zoom presets... 48: { - 'default': fitImage, // 0 + 'default': ImageGrid.fitImage, // 0 // XXX make this into a real action... 'ctrl': function(){setContainerScale(1)}, // ctrl+0 }, - 49: fitImage, // 1 - 50: fitTwoImages, // 2 - 51: fitThreeImages, // 3 - 52: fitFourImages, // 4 - 53: fitFiveImages, // 5 - 54: fitSixImages, // 6 - 55: fitSevenImages, // 7 - 56: fitEightImages, // 8 - 57: fitNineImages, // 9 + 49: ImageGrid.fitImage, // 1 + 50: ImageGrid.fitTwoImages, // 2 + 51: ImageGrid.fitThreeImages, // 3 + 52: ImageGrid.fitFourImages, // 4 + 53: ImageGrid.fitFiveImages, // 5 + 54: ImageGrid.fitSixImages, // 6 + 55: ImageGrid.fitSevenImages, // 7 + 56: ImageGrid.fitEightImages, // 8 + 57: ImageGrid.fitNineImages, // 9 // navigation...