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