git clone https://git.lucas.co/hou-control.git
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():