git.lucas.co / hou-control
git clone https://git.lucas.co/hou-control.git

commitc8d32216978a4a8ff92d7fce95e8fa7fb15ad409
parent803c61e07d
authorLucas Galante <lsgalante12@gmail.com>
date2026-04-16 22:17
keycam: integrate zoom controls into the official hotkey system

 viewer_states/keycam.py | 70 +++++++++++++++++++++++++++++--------------------
 1 file changed, 42 insertions(+), 28 deletions(-)

diff --git a/viewer_states/keycam.py b/viewer_states/keycam.py
index 90440ae..a8d4c53 100644
--- a/viewer_states/keycam.py
+++ b/viewer_states/keycam.py
@@ -89,7 +89,43 @@ class State(object):
             'J': self.cam.translateDown,
         }
 
-        # 1. Handle Navigation
+        ctx = 'h.pane.gview.state.obj.keycam'
+
+        # 1. Define zoom behavior based on projection
+        def zoom_in():
+            self.cam.zoom('in') if self.cam.projection == 'perspective' else self.cam.zoomOrtho('in')
+        def zoom_out():
+            self.cam.zoom('out') if self.cam.projection == 'perspective' else self.cam.zoomOrtho('out')
+        def zoom_shift_in():
+            self.cam.zoomOrtho('in') if self.cam.projection == 'perspective' else self.cam.zoom('in')
+        def zoom_shift_out():
+            self.cam.zoomOrtho('out') if self.cam.projection == 'perspective' else self.cam.zoom('out')
+
+        # 2. Check defined plugin hotkeys
+        hc_symbol_map = {
+            f'{ctx}.rotate_left':   self.cam.rotateLeft,
+            f'{ctx}.rotate_right':  self.cam.rotateRight,
+            f'{ctx}.rotate_up':     self.cam.rotateUp,
+            f'{ctx}.rotate_down':   self.cam.rotateDown,
+            f'{ctx}.trans_left':    self.cam.translateLeft,
+            f'{ctx}.trans_right':   self.cam.translateRight,
+            f'{ctx}.trans_up':      self.cam.translateUp,
+            f'{ctx}.trans_down':    self.cam.translateDown,
+            f'{ctx}.frame':         self.cam.frame,
+            f'{ctx}.toggle_proj':   self.cam.toggleProjection,
+            f'{ctx}.zoom_in':       zoom_in,
+            f'{ctx}.zoom_out':      zoom_out,
+            f'{ctx}.zoom_ortho_in': zoom_shift_in,
+            f'{ctx}.zoom_ortho_out':zoom_shift_out,
+        }
+
+        for symbol, func in hc_symbol_map.items():
+            if hou.hotkeys.isKeyMatch(ui_event, symbol):
+                func()
+                self.guides.update()
+                return True
+
+        # 3. Handle Navigation Fallback
         if is_shift:
             # Shift+K might come through as 'K' or 'Shift+K'
             # We strip 'Shift+' and use uppercase
@@ -105,33 +141,7 @@ class State(object):
                 self.guides.update()
                 return True
 
-        # 2. Zoom mappings
-        zoom_map_persp = {
-            '-': lambda: self.cam.zoom('out'),
-            '=': lambda: self.cam.zoom('in'),
-            'Shift+-': lambda: self.cam.zoomOrtho('out'),
-            'Shift+=': lambda: self.cam.zoomOrtho('in')
-        }
-        zoom_map_ortho = {
-            '-': lambda: self.cam.zoomOrtho('out'),
-            '=': lambda: self.cam.zoomOrtho('in'),
-            'Shift+-': lambda: self.cam.zoom('out'),
-            'Shift+=': lambda: self.cam.zoom('in')
-        }
-
-        zoom_map = zoom_map_persp if self.cam.projection == 'perspective' else zoom_map_ortho
-        
-        if key in zoom_map:
-            zoom_map[key]()
-            self.guides.update()
-            return True
-        
-        if key.lower() in zoom_map:
-            zoom_map[key.lower()]()
-            self.guides.update()
-            return True
-        
-        # 3. Explicitly consume 'j' to prevent "Modify Channels"
+        # 4. Explicitly consume 'j' to prevent "Modify Channels"
         if key.lower() == 'j':
             return True
 
@@ -318,6 +328,10 @@ def createViewerStateTemplate():
         'trans_down':    ('Translate Down', ['Shift+j']),
         'frame':         ('Frame',         ['f']),
         'toggle_proj':   ('Toggle Projection', ['o']),
+        'zoom_in':       ('Zoom In',       ['=']),
+        'zoom_out':      ('Zoom Out',      ['-']),
+        'zoom_ortho_in': ('Zoom Ortho In', ['Shift+=']),
+        'zoom_ortho_out':('Zoom Ortho Out',['Shift+-']),
     }
     
     for cmd_id, (label, defaults) in commands.items():