Browse Source

wip, focusZoom action

Alexander Rose 5 years ago
parent
commit
65e1212b2f
2 changed files with 16 additions and 6 deletions
  1. 9 4
      src/mol-canvas3d/controls/bindings.ts
  2. 7 2
      src/mol-canvas3d/controls/trackball.ts

+ 9 - 4
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,
         }
     }
 }

+ 7 - 2
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)
         }