summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.utils.js')
-rw-r--r--www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.utils.js210
1 files changed, 210 insertions, 0 deletions
diff --git a/www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.utils.js b/www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.utils.js
new file mode 100644
index 00000000..31af3872
--- /dev/null
+++ b/www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.utils.js
@@ -0,0 +1,210 @@
+/*
+ * This file is part of the MediaWiki extension MultimediaViewer.
+ *
+ * MultimediaViewer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MultimediaViewer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MultimediaViewer. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+( function ( mw, $, oo ) {
+ var RUP;
+
+ /**
+ * A helper class for reuse logic.
+ *
+ * @class mw.mmv.ui.Utils
+ * @constructor
+ */
+ function Utils() {
+ /** @property {mw.mmv.HtmlUtils} htmlUtils - */
+ this.htmlUtils = new mw.mmv.HtmlUtils();
+ }
+
+ RUP = Utils.prototype;
+
+ /**
+ * Creates pulldown menu from given options.
+ *
+ * @param {string[]} options
+ * @param {string[]} classes
+ * @param {string} def
+ * @return {OO.ui.DropdownWidget}
+ */
+ RUP.createPulldownMenu = function ( options, classes, def ) {
+ var dropdown, i, option,
+ items = [],
+ choices = {};
+
+ dropdown = new oo.ui.DropdownWidget( {
+ classes: classes
+ } );
+
+ for ( i = 0; i < options.length; i++ ) {
+ option = options[ i ];
+
+ choices[ option ] = new oo.ui.MenuOptionWidget( {
+ data: {
+ name: option,
+ height: null,
+ width: null
+ },
+ label: this.getDimensionsMessageHtml( option, 0, 0 ),
+ autoFitLabel: false
+ } );
+
+ items.push( choices[ option ] );
+ }
+
+ dropdown.getMenu()
+ .addItems( items )
+ .chooseItem( choices[ def ] );
+
+ return dropdown;
+ };
+
+ /**
+ * Gets a promise for the large thumbnail URL. This is needed because thumbnail URLs cannot
+ * be reliably guessed, even if we know the full size of the image - most of the time replacing
+ * the size in another thumbnail URL works (as long as the new size is not larger than the full
+ * size), but if the file name is very long and with the larger size the URL length would
+ * exceed a certain threshold, a different schema is used instead.
+ *
+ * @param {number} width
+ *
+ * @return {jQuery.Promise.<string>}
+ */
+ RUP.getThumbnailUrlPromise = function ( width ) {
+ return $( document ).triggerHandler( 'mmv-request-thumbnail', width ) ||
+ $.Deferred().reject();
+ };
+
+ /**
+ * Updates the menu options based on calculated sizes.
+ *
+ * @private
+ * @param {Object} sizes
+ * @param {OO.ui.MenuOptionWidget[]} options
+ */
+ RUP.updateMenuOptions = function ( sizes, options ) {
+ var i, option, data, $label;
+
+ for ( i = 0; i < options.length; i++ ) {
+ option = options[ i ];
+ data = option.getData();
+
+ if ( sizes[ data.name ] ) {
+ option.setDisabled( false );
+
+ // These values are later used when the item is selected
+ data.width = sizes[ data.name ].width;
+ data.height = sizes[ data.name ].height;
+
+ $label = $( '<span>' ).html( this.getDimensionsMessageHtml( data.name, data.width, data.height ) );
+
+ option.setLabel( $label );
+ } else {
+ option.setDisabled( true );
+ }
+ }
+ };
+
+ /**
+ * Calculates possible image sizes for html snippets. It returns up to
+ * three possible snippet frame sizes (small, medium, large) plus the
+ * original image size.
+ *
+ * @param {number} width
+ * @param {number} height
+ * @return {Object}
+ * @return {Object} return.small
+ * @return {Object} return.medium
+ * @return {Object} return.large
+ * @return {Object} return.original
+ */
+ RUP.getPossibleImageSizesForHtml = function ( width, height ) {
+ var i, bucketName,
+ currentGuess, dimensions,
+ bucketWidth, bucketHeight,
+ buckets = {
+ small: { width: 220, height: 145 },
+ medium: { width: 640, height: 480 },
+ large: { width: 1200, height: 900 }
+ },
+ sizes = {},
+ bucketNames = Object.keys( buckets ),
+ widthToHeight = height / width,
+ heightToWidth = width / height;
+
+ for ( i = 0; i < bucketNames.length; i++ ) {
+ bucketName = bucketNames[ i ];
+ dimensions = buckets[ bucketName ];
+ bucketWidth = dimensions.width;
+ bucketHeight = dimensions.height;
+
+ if ( width > bucketWidth ) {
+ // Width fits in the current bucket
+ currentGuess = bucketWidth;
+
+ if ( currentGuess * widthToHeight > bucketHeight ) {
+ // Constrain in height, resize width accordingly
+ sizes[ bucketName ] = {
+ width: Math.round( bucketHeight * heightToWidth ),
+ height: bucketHeight
+ };
+ } else {
+ sizes[ bucketName ] = {
+ width: currentGuess,
+ height: Math.round( currentGuess * widthToHeight )
+ };
+ }
+ } else if ( height > bucketHeight ) {
+ // Height fits in the current bucket, resize width accordingly
+ sizes[ bucketName ] = {
+ width: Math.round( bucketHeight * heightToWidth ),
+ height: bucketHeight
+ };
+ }
+ }
+
+ sizes.original = { width: width, height: height };
+
+ return sizes;
+ };
+
+ /**
+ * Generates an i18n message for a label, given a size label and image dimensions
+ *
+ * @param {string} sizeLabel
+ * @param {number} width
+ * @param {number} height
+ * @return {string} i18n label html
+ */
+ RUP.getDimensionsMessageHtml = function ( sizeLabel, width, height ) {
+ var dimensions = this.htmlUtils.jqueryToHtml( $( '<span>' )
+ .addClass( 'mw-mmv-embed-dimensions' )
+ .text(
+ mw.message(
+ 'multimediaviewer-embed-dimensions-separated',
+ mw.message(
+ 'multimediaviewer-embed-dimensions',
+ width, height ).text()
+ ).text()
+ ) );
+
+ return mw.message(
+ 'multimediaviewer-' + sizeLabel + '-embed-dimensions',
+ dimensions
+ ).text();
+ };
+
+ mw.mmv.ui.Utils = Utils;
+}( mediaWiki, jQuery, OO ) );