about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMashiro <adadam@qq.com>2020-11-03 13:06:45 +0800
committerGitHub <noreply@github.com>2020-11-03 06:06:45 +0100
commitf645dad661ba033efdcdd6ca7597e7b8bc7f4f51 (patch)
treed1f6dd82ac2af2e30cbc653699255cb31a34724f
parent6a2db10f767879b9072b6c020ebadac4f985ed34 (diff)
add mouse scroll lock in image expand view (#15088)
* add mouse scroll lock in image expand view

* enhancement
-rw-r--r--app/javascript/mastodon/features/ui/components/zoomable_image.js40
1 files changed, 21 insertions, 19 deletions
diff --git a/app/javascript/mastodon/features/ui/components/zoomable_image.js b/app/javascript/mastodon/features/ui/components/zoomable_image.js
index 4753a7a1c..402196727 100644
--- a/app/javascript/mastodon/features/ui/components/zoomable_image.js
+++ b/app/javascript/mastodon/features/ui/components/zoomable_image.js
@@ -194,11 +194,14 @@ class ZoomableImage extends React.PureComponent {
 
     if (this.state.zoomMatrix.type === 'full-width') {
       // full width, scroll vertical
-      this.container.scrollTop = this.container.scrollTop + event.pixelY;
+      this.container.scrollTop = Math.max(this.container.scrollTop + event.pixelY, this.state.lockScroll.y);
     } else {
       // full height, scroll horizontal
-      this.container.scrollLeft = this.container.scrollLeft + event.pixelY;
+      this.container.scrollLeft = Math.max(this.container.scrollLeft + event.pixelY, this.state.lockScroll.x);
     }
+
+    // lock horizontal scroll
+    this.container.scrollLeft = Math.max(this.container.scrollLeft + event.pixelX, this.state.lockScroll.x);
   }
 
   mouseDownHandler = e => {
@@ -221,13 +224,8 @@ class ZoomableImage extends React.PureComponent {
     const dx = e.clientX - this.state.dragPosition.x;
     const dy = e.clientY - this.state.dragPosition.y;
 
-    if ((this.state.dragPosition.left - dx) >= this.state.lockScroll.x) {
-      this.container.scrollLeft = this.state.dragPosition.left - dx;
-    }
-
-    if ((this.state.dragPosition.top - dy) >= this.state.lockScroll.y) {
-      this.container.scrollTop = this.state.dragPosition.top - dy;
-    }
+    this.container.scrollLeft = Math.max(this.state.dragPosition.left - dx, this.state.lockScroll.x);
+    this.container.scrollTop = Math.max(this.state.dragPosition.top - dy, this.state.lockScroll.y);
 
     this.setState({ dragged: true });
   }
@@ -336,22 +334,26 @@ class ZoomableImage extends React.PureComponent {
     const { scale, zoomMatrix } = this.state;
 
     if ( scale >= zoomMatrix.rate ) {
-      this.setState({ scale: MIN_SCALE }, () => {
-        this.container.scrollLeft = 0;
-        this.container.scrollTop = 0;
-        this.setState({ lockScroll: {
+      this.setState({
+        scale: MIN_SCALE,
+        lockScroll: {
           x: 0,
           y: 0,
-        } });
+        },
+      }, () => {
+        this.container.scrollLeft = 0;
+        this.container.scrollTop = 0;
       });
     } else {
-      this.setState({ scale: zoomMatrix.rate }, () => {
-        this.container.scrollLeft = zoomMatrix.scrollLeft;
-        this.container.scrollTop = zoomMatrix.scrollTop;
-        this.setState({ lockScroll: {
+      this.setState({
+        scale: zoomMatrix.rate,
+        lockScroll: {
           x: zoomMatrix.scrollLeft,
           y: zoomMatrix.scrollTop,
-        } });
+        },
+      }, () => {
+        this.container.scrollLeft = zoomMatrix.scrollLeft;
+        this.container.scrollTop = zoomMatrix.scrollTop;
       });
     }