Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1121)

Unified Diff: ui/file_manager/gallery/js/image_editor/image_resize.js

Issue 2299493002: Add an ability for resize in gallery. (Closed)
Patch Set: Make a change in GalleryJsTest.SlideModeTest Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/file_manager/gallery/js/image_editor/image_editor.js ('k') | ui/file_manager/gallery/js/slide_mode.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/file_manager/gallery/js/image_editor/image_resize.js
diff --git a/ui/file_manager/gallery/js/image_editor/image_resize.js b/ui/file_manager/gallery/js/image_editor/image_resize.js
new file mode 100644
index 0000000000000000000000000000000000000000..9c186c35d2ecefb4d6d234238cb81937feb8f622
--- /dev/null
+++ b/ui/file_manager/gallery/js/image_editor/image_resize.js
@@ -0,0 +1,277 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * Resize Mode
+ *
+ * @extends {ImageEditor.Mode}
+ * @constructor
+ * @struct
+ */
+ImageEditor.Mode.Resize = function() {
+ ImageEditor.Mode.call(this, 'resize', 'GALLERY_RESIZE');
+
+ /** @private {number} */
+ this.imageWidth_ = 0;
+
+ /** @private {number} */
+ this.imageHeight_ = 0;
+
+ /** @private {number} */
+ this.maxValidWidth_ = 0;
+
+ /** @private {number} */
+ this.maxValidHeight_ = 0;
+
+ /** @private {number} */
+ this.widthInputValue_ = 0;
+
+ /** @private {number} */
+ this.heightInputValue_ = 0;
+
+ /** @private {HTMLElement} */
+ this.widthInputElement_ = null;
+
+ /** @private {HTMLElement} */
+ this.heightInputElement_ = null;
+
+ /** @private {number} */
+ this.ratio_ = 0;
+
+ /** @private {boolean} */
+ this.fixedRatio_ = true;
+
+ /** @private {boolean} */
+ this.showingAlertDialog_ = false;
+
+ /** @private {FilesAlertDialog} */
+ this.alertDialog_ = null;
+};
+
+/** @const {number} */
+ImageEditor.Mode.Resize.MINIMUM_VALID_VALUE = 1;
+
+/** @const {number} */
+ImageEditor.Mode.Resize.DEFAULT_MAX_VALID_VALUE = 10000;
+
+ImageEditor.Mode.Resize.prototype = {
+ __proto__ : ImageEditor.Mode.prototype
+};
+
+/** @override */
+ImageEditor.Mode.Resize.prototype.setUp = function() {
+ ImageEditor.Mode.prototype.setUp.apply(this, arguments);
+
+ this.setDefault_();
+};
+
+/** @override */
+ImageEditor.Mode.Resize.prototype.createTools = function(toolbar) {
+ this.widthInputElement_ = toolbar.addInput('width', 'GALLERY_WIDTH',
+ this.onInputChanged_.bind(this, 'width'),
+ this.widthInputValue_, 'px');
+
+ this.lockIcon_ = toolbar.addButton('GALLERY_FIXRATIO',
+ ImageEditor.Toolbar.ButtonType.ICON_TOGGLEABLE,
+ this.onLockIconClicked_.bind(this), 'lockicon');
+ if(this.fixedRatio_)
+ this.lockIcon_.setAttribute('locked', '');
+
+ this.heightInputElement_ = toolbar.addInput('height', 'GALLERY_HEIGHT',
+ this.onInputChanged_.bind(this, 'height'),
+ this.heightInputValue_, 'px');
+};
+
+/**
+ * Handlers change events of width/height input element.
+ * @param {string} name
+ * @param {Event} event
+ * @private
+ */
+ImageEditor.Mode.Resize.prototype.onInputChanged_ = function(
+ name, event) {
+
+ if(name !== 'height' && name !== 'width')
+ return;
+
+ this.updateInputValues_();
+
+ function adjustToRatio() {
+ switch (name) {
+ case 'width':
+ var newHeight = Math.ceil(this.widthInputValue_ / this.ratio_);
+ if(this.isInputValidByName_('heigth', newHeight)) {
+ this.heightInputValue_ = newHeight;
+ this.setHeightInputValue_();
+ }
+ break;
+ case 'height':
+ var newWidth = Math.ceil(this.heightInputValue_ * this.ratio_);
+ if(this.isInputValidByName_('width', newWidth)) {
+ this.widthInputValue_ = newWidth;
+ this.setWidthInputValue_();
+ }
+ break;
+ }
+ }
+
+ if(this.fixedRatio_ && this.isInputValidByName_(name))
+ adjustToRatio.call(this);
+};
+
+/**
+ * Handlers change events of lock icon.
+ * @param {Event} event An event.
+ * @private
+ */
+ImageEditor.Mode.Resize.prototype.onLockIconClicked_ = function(event) {
+ var toggled = !this.fixedRatio_;
+ if(toggled) {
+ this.initializeInputValues_();
+ this.lockIcon_.setAttribute('locked', '');
+ } else {
+ this.lockIcon_.removeAttribute('locked');
+ }
+
+ this.fixedRatio_ = toggled;
+};
+
+/**
+ * Set default values.
+ * @private
+ */
+ImageEditor.Mode.Resize.prototype.setDefault_ = function() {
+ var viewport = this.getViewport();
+ assert(viewport);
+
+ var rect = viewport.getImageBounds();
+ this.imageWidth_ = rect.width;
+ this.imageHeight_ = rect.height;
+
+ this.initializeInputValues_();
+
+ this.ratio_ = this.imageWidth_ / this.imageHeight_;
+
+ this.maxValidWidth_ = Math.max(
+ this.imageWidth_, ImageEditor.Mode.Resize.DEFAULT_MAX_VALID_VALUE);
+ this.maxValidHeight_ = Math.max(
+ this.imageHeight_, ImageEditor.Mode.Resize.DEFAULT_MAX_VALID_VALUE);
+};
+
+/**
+ * Initialize width/height input values.
+ * @private
+ */
+ImageEditor.Mode.Resize.prototype.initializeInputValues_ = function() {
+ this.widthInputValue_ = this.imageWidth_;
+ this.setWidthInputValue_();
+
+ this.heightInputValue_ = this.imageHeight_;
+ this.setHeightInputValue_();
+};
+
+/**
+ * Update input values to local variales.
+ * @private
+ */
+ImageEditor.Mode.Resize.prototype.updateInputValues_ = function() {
+ if(this.widthInputElement_)
+ this.widthInputValue_ = parseInt(this.widthInputElement_.getValue(), 10);
+ if(this.heightInputElement_)
+ this.heightInputValue_ = parseInt(this.heightInputElement_.getValue(), 10);
+};
+
+/**
+ * Apply local variables' change to width input element.
+ * @private
+ */
+ImageEditor.Mode.Resize.prototype.setWidthInputValue_ = function() {
+ if(this.widthInputElement_)
+ this.widthInputElement_.setValue(this.widthInputValue_);
+};
+
+/**
+ * Apply local variables' change to height input element.
+ * @private
+ */
+ImageEditor.Mode.Resize.prototype.setHeightInputValue_ = function() {
+ if(this.heightInputElement_)
+ this.heightInputElement_.setValue(this.heightInputValue_);
+};
+
+/**
+ * Check if the given name of input has a valid value.
+ *
+ * @param {string} name Name of input to check.
+ * @param {number=} opt_value Value to be checked. Local input's variable will
+ be checked if undefined.
+ * @return {boolean} True if the input
+ * @private
+ */
+ImageEditor.Mode.Resize.prototype.isInputValidByName_ = function(
+ name, opt_value) {
+ console.assert(name === 'height' || name === 'width');
+
+ var limit = name === 'width' ? this.maxValidWidth_ : this.maxValidHeight_;
+ var value = opt_value ||
+ (name === 'width' ? this.widthInputValue_ : this.heightInputValue_);
+
+ return ImageEditor.Mode.Resize.MINIMUM_VALID_VALUE <= value && value <= limit;
+};
+
+/**
+ * Check if width/height input values are valid.
+ * @return {boolean} true if both values are valid.
+ */
+ImageEditor.Mode.Resize.prototype.isInputValid = function() {
+ return this.isInputValidByName_('width') &&
+ this.isInputValidByName_('height');
+};
+
+/**
+ * Show alert dialog only if input value is invalid.
+ */
+ImageEditor.Mode.Resize.prototype.showAlertDialog = function() {
+ if(this.isInputValid() || this.showingAlertDialog_)
+ return;
+
+ this.alertDialog_ = this.alertDialog_ ||
+ new FilesAlertDialog(/** @type {!HTMLElement} */ (document.body));
+ this.showingAlertDialog_ = true;
+ this.alertDialog_.showWithTitle('', strf('GALLERY_INVALIDVALUE'),
+ function() {
+ this.initializeInputValues_();
+ this.showingAlertDialog_ = false;
+ }.bind(this), null, null);
+};
+
+/**
+ * @return {boolean} True when showing an alert dialog.
+ * @override
+ */
+ImageEditor.Mode.Resize.prototype.isConsumingKeyEvents = function() {
+ return this.showingAlertDialog_;
+};
+
+/** @override */
+ImageEditor.Mode.Resize.prototype.cleanUpUI = function() {
+ ImageEditor.Mode.prototype.cleanUpUI.apply(this, arguments);
+
+ if(this.showingAlertDialog_) {
+ this.alertDialog_.hide();
+ this.showingAlertDialog_ = false;
+ }
+};
+
+/** @override */
+ImageEditor.Mode.Resize.prototype.reset = function() {
+ ImageEditor.Mode.prototype.reset.call(this);
+
+ this.setDefault_();
+};
+
+/** @override */
+ImageEditor.Mode.Resize.prototype.getCommand = function() {
+ return new Command.Resize(this.widthInputValue_, this.heightInputValue_);
+};
« no previous file with comments | « ui/file_manager/gallery/js/image_editor/image_editor.js ('k') | ui/file_manager/gallery/js/slide_mode.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698