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

Side by Side Diff: ui/file_manager/gallery/js/slide_mode.js

Issue 416023002: Gallery.app: Add touch operation to rotate images. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed. Created 6 years, 5 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/file_manager/gallery/js/image_editor/viewport.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * Slide mode displays a single image and has a set of controls to navigate 8 * Slide mode displays a single image and has a set of controls to navigate
9 * between the images and to edit an image. 9 * between the images and to edit an image.
10 * 10 *
(...skipping 1354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 1365
1366 /** 1366 /**
1367 * Event on beginning of the current gesture. 1367 * Event on beginning of the current gesture.
1368 * The variable is updated when the number of touch finger changed. 1368 * The variable is updated when the number of touch finger changed.
1369 * @type {TouchEvent} 1369 * @type {TouchEvent}
1370 * @private 1370 * @private
1371 */ 1371 */
1372 this.gestureStartEvent_ = null; 1372 this.gestureStartEvent_ = null;
1373 1373
1374 /** 1374 /**
1375 * Rotation value on beginning of the current gesture.
1376 * @type {number}
1377 * @private
1378 */
1379 this.gestureStartRotation_ = 0;
1380
1381 /**
1375 * Last touch event. 1382 * Last touch event.
1376 * @type {TouchEvent} 1383 * @type {TouchEvent}
1377 * @private 1384 * @private
1378 */ 1385 */
1379 this.lastEvent_ = null; 1386 this.lastEvent_ = null;
1380 1387
1381 /** 1388 /**
1382 * Zoom value just after last touch event. 1389 * Zoom value just after last touch event.
1383 * @type {number} 1390 * @type {number}
1384 * @private 1391 * @private
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1418 * @param {boolean} flag New value. 1425 * @param {boolean} flag New value.
1419 */ 1426 */
1420 set enabled(flag) { 1427 set enabled(flag) {
1421 this.enabled_ = flag; 1428 this.enabled_ = flag;
1422 if (!this.enabled_) 1429 if (!this.enabled_)
1423 this.stopOperation(); 1430 this.stopOperation();
1424 } 1431 }
1425 }; 1432 };
1426 1433
1427 /** 1434 /**
1435 * Obtains the degrees of the pinch twist angle.
1436 * @param {TouchEvent} event1 Start touch event. It should include more than two
1437 * touches.
1438 * @param {TouchEvent} event2 Current touch event. It should include more than
1439 * two touches.
1440 * @return {number} Degrees of the pinch twist angle.
1441 */
1442 TouchHandler.getTwistAngle = function(event1, event2) {
1443 var dx1 = event1.touches[1].clientX - event1.touches[0].clientX;
1444 var dy1 = event1.touches[1].clientY - event1.touches[0].clientY;
1445 var dx2 = event2.touches[1].clientX - event2.touches[0].clientX;
1446 var dy2 = event2.touches[1].clientY - event2.touches[0].clientY;
1447 var innerProduct = dx1 * dx2 + dy1 * dy2; // |v1| * |v2| * cos(t) = x / r
1448 var outerProduct = dx1 * dy2 - dy1 * dx2; // |v1| * |v2| * sin(t) = y / r
1449 return Math.atan2(outerProduct, innerProduct) * 180 / Math.PI; // atan(y / x)
1450 };
1451
1452 /**
1428 * Stops the current touch operation. 1453 * Stops the current touch operation.
1429 */ 1454 */
1430 TouchHandler.prototype.stopOperation = function() { 1455 TouchHandler.prototype.stopOperation = function() {
1431 this.touchStarted_ = false; 1456 this.touchStarted_ = false;
1432 this.done_ = false; 1457 this.done_ = false;
1433 this.gestureStartEvent_ = null; 1458 this.gestureStartEvent_ = null;
1434 this.lastEvent_ = null; 1459 this.lastEvent_ = null;
1435 this.lastZoom_ = 1.0; 1460 this.lastZoom_ = 1.0;
1436 }; 1461 };
1437 1462
(...skipping 11 matching lines...) Expand all
1449 if (!this.touchStarted_) 1474 if (!this.touchStarted_)
1450 return; 1475 return;
1451 1476
1452 // Check if the current touch operation ends with the event. 1477 // Check if the current touch operation ends with the event.
1453 if (event.touches.length === 0) { 1478 if (event.touches.length === 0) {
1454 this.stopOperation(); 1479 this.stopOperation();
1455 return; 1480 return;
1456 } 1481 }
1457 1482
1458 // Check if a new gesture started or not. 1483 // Check if a new gesture started or not.
1484 var viewport = this.slideMode_.getViewport();
1459 if (!this.lastEvent_ || 1485 if (!this.lastEvent_ ||
1460 this.lastEvent_.touches.length !== event.touches.length) { 1486 this.lastEvent_.touches.length !== event.touches.length) {
1461 if (event.touches.length === 2 || 1487 if (event.touches.length === 2 ||
1462 event.touches.length === 1) { 1488 event.touches.length === 1) {
1463 this.gestureStartEvent_ = event; 1489 this.gestureStartEvent_ = event;
1490 this.gestureStartRotation_ = viewport.getRotation();
1464 this.lastEvent_ = event; 1491 this.lastEvent_ = event;
1465 this.lastZoom_ = this.slideMode_.getViewport().getZoom(); 1492 this.lastZoom_ = viewport.getZoom();
1466 } else { 1493 } else {
1467 this.gestureStartEvent_ = null; 1494 this.gestureStartEvent_ = null;
1495 this.gestureStartRotation_ = 0;
1468 this.lastEvent_ = null; 1496 this.lastEvent_ = null;
1469 this.lastZoom_ = 1.0; 1497 this.lastZoom_ = 1.0;
1470 } 1498 }
1471 return; 1499 return;
1472 } 1500 }
1473 1501
1474 // Handle the gesture movement. 1502 // Handle the gesture movement.
1475 var viewport = this.slideMode_.getViewport();
1476 switch (event.touches.length) { 1503 switch (event.touches.length) {
1477 case 1: 1504 case 1:
1478 if (viewport.isZoomed()) { 1505 if (viewport.isZoomed()) {
1479 // Scrolling an image by swipe. 1506 // Scrolling an image by swipe.
1480 var dx = event.touches[0].screenX - this.lastEvent_.touches[0].screenX; 1507 var dx = event.touches[0].screenX - this.lastEvent_.touches[0].screenX;
1481 var dy = event.touches[0].screenY - this.lastEvent_.touches[0].screenY; 1508 var dy = event.touches[0].screenY - this.lastEvent_.touches[0].screenY;
1482 viewport.setOffset( 1509 viewport.setOffset(
1483 viewport.getOffsetX() + dx, viewport.getOffsetY() + dy); 1510 viewport.getOffsetX() + dx, viewport.getOffsetY() + dy);
1484 this.slideMode_.applyViewportChange(); 1511 this.slideMode_.applyViewportChange();
1485 } else { 1512 } else {
(...skipping 14 matching lines...) Expand all
1500 break; 1527 break;
1501 1528
1502 case 2: 1529 case 2:
1503 // Pinch zoom. 1530 // Pinch zoom.
1504 var distance1 = TouchHandler.getDistance(this.lastEvent_); 1531 var distance1 = TouchHandler.getDistance(this.lastEvent_);
1505 var distance2 = TouchHandler.getDistance(event); 1532 var distance2 = TouchHandler.getDistance(event);
1506 if (distance1 === 0) 1533 if (distance1 === 0)
1507 break; 1534 break;
1508 var zoom = distance2 / distance1 * this.lastZoom_; 1535 var zoom = distance2 / distance1 * this.lastZoom_;
1509 viewport.setZoom(zoom); 1536 viewport.setZoom(zoom);
1537
1538 // Pinch rotation.
1539 var angle = TouchHandler.getTwistAngle(this.gestureStartEvent_, event);
1540 if (angle > 25)
mtomasz 2014/07/24 11:22:21 nit: constant?
hirono 2014/07/25 01:03:41 Done.
1541 viewport.setRotation(this.gestureStartRotation_ + 1);
1542 else if (angle < -25)
1543 viewport.setRotation(this.gestureStartRotation_ - 1);
1544 else
1545 viewport.setRotation(this.gestureStartRotation_);
1510 this.slideMode_.applyViewportChange(); 1546 this.slideMode_.applyViewportChange();
1511 break; 1547 break;
1512 } 1548 }
1513 1549
1514 // Update the last event. 1550 // Update the last event.
1515 this.lastEvent_ = event; 1551 this.lastEvent_ = event;
1516 this.lastZoom_ = viewport.getZoom(); 1552 this.lastZoom_ = viewport.getZoom();
1517 }; 1553 };
OLDNEW
« no previous file with comments | « ui/file_manager/gallery/js/image_editor/viewport.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698