Esanders has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/109595


Change subject: The great image scaling rewrite of 2014 (MW)
......................................................................

The great image scaling rewrite of 2014 (MW)

Implement new logic in ve.Scalable from I5b4f0f91b.

Change-Id: I24a2976036310d3814cc7d1853a68745e0499bd5
---
M VisualEditor.php
M lib/ve
M modules/ve-mw/ce/nodes/ve.ce.MWBlockImageNode.js
M modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
M modules/ve-mw/ui/dialogs/ve.ui.MWMediaEditDialog.js
5 files changed, 62 insertions(+), 24 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/95/109595/1

diff --git a/VisualEditor.php b/VisualEditor.php
index d94213e..be569b3 100644
--- a/VisualEditor.php
+++ b/VisualEditor.php
@@ -284,6 +284,7 @@
                'scripts' => array(
                        // ve
                        'lib/ve/modules/ve/ve.Range.js',
+                       'lib/ve/modules/ve/ve.Scalable.js',
                        'lib/ve/modules/ve/ve.Node.js',
                        'lib/ve/modules/ve/ve.BranchNode.js',
                        'lib/ve/modules/ve/ve.LeafNode.js',
diff --git a/lib/ve b/lib/ve
index e7f2b68..e8087b7 160000
--- a/lib/ve
+++ b/lib/ve
-Subproject commit e7f2b681ceb6086a3468148a29a61489b300d524
+Subproject commit e8087b77e99ddaa672126d4115723bdbb3a16284
diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWBlockImageNode.js 
b/modules/ve-mw/ce/nodes/ve.ce.MWBlockImageNode.js
index a2088c3..13cf013 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWBlockImageNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWBlockImageNode.js
@@ -202,7 +202,7 @@
                };
        }
 
-       this.$image.attr( dimensions );
+       this.$image.css( dimensions );
 
        this.$figure.css( {
                // If we have a border then the width is increased by 2
diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js 
b/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
index fbf2a6e..19a456c 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
@@ -22,6 +22,10 @@
  * @param {Object} [config] Configuration options
  */
 ve.ce.MWImageNode = function VeCeMWImageNode( $figure, $image, config ) {
+       config = ve.extendObject( {
+               'minDimensions': { 'width': 1, 'height': 1 }
+       }, config );
+
        // Parent constructor
        ve.ce.GeneratedContentNode.call( this );
 
@@ -33,6 +37,9 @@
        ve.ce.FocusableNode.call( this, this.$figure, config );
        ve.ce.RelocatableNode.call( this, this.$figure, config );
        ve.ce.MWResizableNode.call( this, this.$image, config );
+
+       // Events
+       this.connect( this, { 'focus': 'onFocus' } );
 };
 
 /* Inheritance */
@@ -60,9 +67,9 @@
                        'action': 'query',
                        'prop': 'imageinfo',
                        'iiprop': 'url',
-                       'iiurlwidth': this.model.getAttribute( 'width' ),
-                       'iiurlheight': this.model.getAttribute( 'height' ),
-                       'titles': this.model.getAttribute( 'resource' 
).replace( /^(.+\/)*/, '' )
+                       'iiurlwidth': this.getModel().getAttribute( 'width' ),
+                       'iiurlheight': this.getModel().getAttribute( 'height' ),
+                       'titles': this.getModel().getAttribute( 'resource' 
).replace( /^(.+\/)*/, '' )
        } )
                .done( ve.bind( this.onParseSuccess, this, deferred ) )
                .fail( ve.bind( this.onParseError, this, deferred ) );
@@ -107,3 +114,39 @@
 ve.ce.MWImageNode.prototype.onParseError = function ( deferred ) {
        deferred.reject();
 };
+
+/**
+ * Handle the node being focussed
+ */
+ve.ce.MWImageNode.prototype.onFocus = function () {
+       // Fetch the original dimensions the first time the node is focussed
+       if ( !this.originalDimensions ) {
+               this.fetchDimensions();
+       }
+};
+
+/**
+ * Fetch the original dimensions from the API
+ *
+ * @returns {jQuery.Promise} Promise which resolves with a boolean indicating 
success
+ */
+ve.ce.MWImageNode.prototype.fetchDimensions = function () {
+       var deferred = $.Deferred();
+       this.getModel().getImageInfo()
+               .done( ve.bind( function ( imageInfo ) {
+                       var dimensions = {
+                               'width': imageInfo.width,
+                               'height': imageInfo.height
+                       };
+                       this.setOriginalDimensions( dimensions );
+                       // Bitmaps can't be upscaled
+                       if ( imageInfo.mediatype === 'BITMAP' ) {
+                               this.setMaxDimensions( dimensions );
+                       }
+                       deferred.resolve( true );
+               }, this ) )
+               .fail( function () {
+                       deferred.resolve( false );
+               } );
+       return deferred.promise();
+};
\ No newline at end of file
diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWMediaEditDialog.js 
b/modules/ve-mw/ui/dialogs/ve.ui.MWMediaEditDialog.js
index 0524088..81c8c2b 100644
--- a/modules/ve-mw/ui/dialogs/ve.ui.MWMediaEditDialog.js
+++ b/modules/ve-mw/ui/dialogs/ve.ui.MWMediaEditDialog.js
@@ -171,13 +171,14 @@
  */
 ve.ui.MWMediaEditDialog.prototype.setup = function ( data ) {
        var newDoc,
-               doc = this.surface.getModel().getDocument();
+               doc = this.surface.getModel().getDocument(),
+               mediaNodeView = this.surface.getView().getFocusedNode();
 
        // Parent method
        ve.ui.MWDialog.prototype.setup.call( this, data );
 
        // Properties
-       this.mediaNode = this.surface.getView().getFocusedNode().getModel();
+       this.mediaNode = mediaNodeView.getModel();
        this.captionNode = this.mediaNode.getCaptionNode();
        this.store = this.surface.getModel().getDocument().getStore();
 
@@ -202,28 +203,21 @@
        );
 
        // Set initial size in inputs
-       this.sizeWidget.setDimensions( {
+       this.sizeWidget.setCurrentDimensions( {
                'width': this.mediaNode.getAttribute( 'width' ),
                'height': this.mediaNode.getAttribute( 'height' ),
        } );
 
        // Save original size for later calculations
-       this.mediaNode.getImageInfo().done( ve.bind( function ( imageInfo ) {
-               if ( imageInfo && imageInfo.width && imageInfo.height ) {
-                       var dimensions = {
-                               'width': imageInfo.width,
-                               'height': imageInfo.height
-                       };
-                       // Set the original dimensions in the widget
-                       this.sizeWidget.setOriginalDimensions( dimensions );
-
-                       // Bitmaps also have a maximum size of 
originalDimensions
-                       if ( imageInfo.mediatype === 'BITMAP' ) {
-                               this.sizeWidget.setMaxDimensions( dimensions );
+       mediaNodeView.fetchDimensions().done( ve.bind( function ( success ) {
+               if ( success ) {
+                       // Copy original & max dimensions from media node in 
widget
+                       this.sizeWidget.setOriginalDimensions( 
mediaNodeView.getOriginalDimensions() );
+                       if ( mediaNodeView.getMaxDimensions() ) {
+                               this.sizeWidget.setMaxDimensions( 
mediaNodeView.getMaxDimensions() );
                        }
                } else {
-                       // Original dimensions couldn't be fetched. Display an 
error message
-                       this.sizeErrorLabel.$element.hide();
+                       this.sizeErrorLabel.$element.toggle( !success );
                }
        }, this ) );
 
@@ -262,8 +256,8 @@
                );
 
                // Change attributes only if the values are valid
-               if ( this.sizeWidget.isValid() ) {
-                       attrs = this.sizeWidget.getDimensions();
+               if ( this.sizeWidget.isCurrentDimensionsValid() ) {
+                       attrs = this.sizeWidget.getCurrentDimensions();
                }
 
                surfaceModel.change(
@@ -271,7 +265,7 @@
                );
        }
 
-       // Clean size values
+       // Clear size values
        this.sizeWidget.clear();
 
        // Cleanup

-- 
To view, visit https://gerrit.wikimedia.org/r/109595
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I24a2976036310d3814cc7d1853a68745e0499bd5
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to