From 65e1212b2f704fa61f13517c71bf8454d55d0b9a Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Fri, 13 Sep 2019 16:30:55 -0700
Subject: [PATCH] wip, focusZoom action

---
 src/mol-canvas3d/controls/bindings.ts  | 13 +++++++++----
 src/mol-canvas3d/controls/trackball.ts |  9 +++++++--
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/mol-canvas3d/controls/bindings.ts b/src/mol-canvas3d/controls/bindings.ts
index e6e558e1b..923b2824d 100644
--- a/src/mol-canvas3d/controls/bindings.ts
+++ b/src/mol-canvas3d/controls/bindings.ts
@@ -14,17 +14,20 @@ export interface Bindings {
         rotate: Bindings.Trigger
         rotateZ: Bindings.Trigger
         pan: Bindings.Trigger
-        focus: Bindings.Trigger
         zoom: Bindings.Trigger
+        focus: Bindings.Trigger
+        focusZoom: Bindings.Trigger
     },
     scroll: {
-        focus: Bindings.Trigger
         zoom: Bindings.Trigger
+        focus: Bindings.Trigger
+        focusZoom: Bindings.Trigger
     }
 }
 
 export namespace Bindings {
     export type Trigger = { buttons: ButtonsType, modifiers?: ModifiersKeys }
+    export const EmptyTrigger = { buttons: ButtonsType.Flag.None }
 
     export function match(trigger: Trigger, buttons: ButtonsType, modifiers: ModifiersKeys) {
         const { buttons: b, modifiers: m } = trigger
@@ -37,12 +40,14 @@ export namespace Bindings {
             rotate: { buttons: B.Flag.Primary, modifiers: M.create() },
             rotateZ: { buttons: B.Flag.Primary, modifiers: M.create({ shift: true }) },
             pan: { buttons: B.Flag.Secondary, modifiers: M.create() },
+            zoom: EmptyTrigger,
             focus: { buttons: B.Flag.Forth, modifiers: M.create() },
-            zoom: { buttons: B.Flag.Auxilary, modifiers: M.create() },
+            focusZoom: { buttons: B.Flag.Auxilary, modifiers: M.create() },
         },
         scroll: {
-            focus: { buttons: B.Flag.Auxilary, modifiers: M.create({ shift: true }) },
             zoom: { buttons: B.Flag.Auxilary, modifiers: M.create() },
+            focus: { buttons: B.Flag.Auxilary, modifiers: M.create({ shift: true }) },
+            focusZoom: EmptyTrigger,
         }
     }
 }
\ No newline at end of file
diff --git a/src/mol-canvas3d/controls/trackball.ts b/src/mol-canvas3d/controls/trackball.ts
index d88933af0..6898857e0 100644
--- a/src/mol-canvas3d/controls/trackball.ts
+++ b/src/mol-canvas3d/controls/trackball.ts
@@ -292,6 +292,7 @@ namespace TrackballControls {
             const dragPan = Bindings.match(p.bindings.drag.pan, buttons, modifiers)
             const dragZoom = Bindings.match(p.bindings.drag.zoom, buttons, modifiers)
             const dragFocus = Bindings.match(p.bindings.drag.focus, buttons, modifiers)
+            const dragFocusZoom = Bindings.match(p.bindings.drag.focusZoom, buttons, modifiers)
 
             getMouseOnCircle(pageX, pageY)
             getMouseOnScreen(pageX, pageY)
@@ -305,7 +306,7 @@ namespace TrackballControls {
                     Vec2.copy(_zRotCurr, mouseOnCircleVec2)
                     Vec2.copy(_zRotPrev, _zRotCurr)
                 }
-                if (dragZoom) {
+                if (dragZoom || dragFocusZoom) {
                     Vec2.copy(_zoomStart, mouseOnScreenVec2)
                     Vec2.copy(_zoomEnd, _zoomStart)
                 }
@@ -321,8 +322,12 @@ namespace TrackballControls {
 
             if (dragRotate) Vec2.copy(_rotCurr, mouseOnCircleVec2)
             if (dragRotateZ) Vec2.copy(_zRotCurr, mouseOnCircleVec2)
-            if (dragZoom) Vec2.copy(_zoomEnd, mouseOnScreenVec2)
+            if (dragZoom || dragFocusZoom) Vec2.copy(_zoomEnd, mouseOnScreenVec2)
             if (dragFocus) Vec2.copy(_focusEnd, mouseOnScreenVec2)
+            if (dragFocusZoom) {
+                const dist = Vec3.distance(camera.state.position, camera.state.target);
+                camera.setState({ radius: dist / 5 })
+            }
             if (dragPan) Vec2.copy(_panEnd, mouseOnScreenVec2)
         }
 
-- 
GitLab