[Bf-extensions-cvs] [d910724] master: Stop CursorMonitor on "script.reload" keypress (e.g. F8)
dairin0d
noreply at git.blender.org
Sat Sep 13 20:25:46 CEST 2014
Commit: d910724e53ff51f810e0c5a9075a31d235907025
Author: dairin0d
Date: Sat Sep 13 21:25:44 2014 +0300
Branches: master
https://developer.blender.org/rBACd910724e53ff51f810e0c5a9075a31d235907025
Stop CursorMonitor on "script.reload" keypress (e.g. F8)
===================================================================
M space_view3d_enhanced_3d_cursor.py
===================================================================
diff --git a/space_view3d_enhanced_3d_cursor.py b/space_view3d_enhanced_3d_cursor.py
index 4580902..a0d0063 100644
--- a/space_view3d_enhanced_3d_cursor.py
+++ b/space_view3d_enhanced_3d_cursor.py
@@ -21,7 +21,7 @@ bl_info = {
"name": "Enhanced 3D Cursor",
"description": "Cursor history and bookmarks; drag/snap cursor.",
"author": "dairin0d",
- "version": (2, 9, 4),
+ "version": (2, 9, 5),
"blender": (2, 7, 0),
"location": "View3D > Action mouse; F10; Properties panel",
"warning": "",
@@ -364,11 +364,10 @@ class EnhancedSetCursor(bpy.types.Operator):
wm = context.window_manager
if '3D View' in wm.keyconfigs.user.keymaps:
km = wm.keyconfigs.user.keymaps['3D View']
- for kmi in km.keymap_items:
- if kmi.idname == 'view3d.cursor3d_enhanced':
- if kmi.map_type == 'KEYBOARD':
- self.key_map["free_mouse"] = {kmi.type,}
- break
+ for kmi in KeyMapItemSearch(EnhancedSetCursor.bl_idname, km):
+ if kmi.map_type == 'KEYBOARD':
+ self.key_map["free_mouse"] = {kmi.type,}
+ break
def try_process_input(self, context, event, initial_run=False):
try:
@@ -4494,6 +4493,8 @@ class CursorMonitor(bpy.types.Operator):
_handle_px = None
_handle_header_px = None
+ script_reload_kmis = []
+
@staticmethod
def handle_add(self, context):
CursorMonitor._handle_view = bpy.types.SpaceView3D.draw_handler_add(
@@ -4532,6 +4533,13 @@ class CursorMonitor(bpy.types.Operator):
return False
def modal(self, context, event):
+ # Scripts cannot be reloaded while modal operators are running
+ # Intercept the corresponding event and shut down CursorMonitor
+ # (it would be relaunched automatically afterwards)
+ for kmi in CursorMonitor.script_reload_kmis:
+ if IsKeyMapItemEvent(kmi, event):
+ return {'CANCELLED'}
+
try:
return self._modal(context, event)
except Exception as e:
@@ -4677,6 +4685,8 @@ class CursorMonitor(bpy.types.Operator):
def execute(self, context):
print("Cursor monitor: launched")
+ CursorMonitor.script_reload_kmis = list(KeyMapItemSearch('script.reload'))
+
runtime_settings = find_runtime_settings()
self.just_initialized = True
@@ -5257,7 +5267,6 @@ def draw_callback_px(self, context):
# ===== UTILITY FUNCTIONS ===== #
-
cursor_stick_pos_cache = None
def update_stick_to_obj(context):
global cursor_stick_pos_cache
@@ -5358,18 +5367,38 @@ def find_runtime_settings():
return runtime_settings
-# ===== REGISTRATION ===== #
-def find_keymap_items(km, idname):
- items = []
- for kmi in km.keymap_items:
- if kmi.idname == idname:
- items.append(kmi)
- return items
+def KeyMapItemSearch(idname, place=None):
+ if isinstance(place, bpy.types.KeyMap):
+ for kmi in place.keymap_items:
+ if kmi.idname == idname:
+ yield kmi
+ elif isinstance(place, bpy.types.KeyConfig):
+ for keymap in place.keymaps:
+ for kmi in KeyMapItemSearch(idname, keymap):
+ yield kmi
+ else:
+ wm = bpy.context.window_manager
+ for keyconfig in wm.keyconfigs:
+ for kmi in KeyMapItemSearch(idname, keyconfig):
+ yield kmi
+
+def IsKeyMapItemEvent(kmi, event):
+ event_any = (event.shift or event.ctrl or event.alt or event.oskey)
+ event_key_modifier = 'NONE' # no such info in event
+ return ((kmi.type == event.type) and
+ (kmi.value == event.value) and
+ (kmi.shift == event.shift) and
+ (kmi.ctrl == event.ctrl) and
+ (kmi.alt == event.alt) and
+ (kmi.oskey == event.oskey) and
+ (kmi.any == event_any) and
+ (kmi.key_modifier == event_key_modifier))
+# ===== REGISTRATION ===== #
def update_keymap(activate):
- #if activate:
- # if bpy.ops.view3d.cursor3d_monitor.poll():
- # bpy.ops.view3d.cursor3d_monitor()
+ reg_idname = DelayRegistrationOperator.bl_idname
+ enh_idname = EnhancedSetCursor.bl_idname
+ cur_idname = 'view3d.cursor3d'
wm = bpy.context.window_manager
@@ -5380,9 +5409,7 @@ def update_keymap(activate):
if activate:
# activate temporary operator
km = wm.keyconfigs.active.keymaps['Window']
- kmi = km.keymap_items.new( \
- 'wm.enhanced_3d_cursor_registration', \
- 'MOUSEMOVE', 'ANY')
+ kmi = km.keymap_items.new(reg_idname, 'MOUSEMOVE', 'ANY')
return
# We need for the enhanced operator to take precedence over
@@ -5393,41 +5420,21 @@ def update_keymap(activate):
# However, we may just simply turn it off or remove
# (depending on what saves with blend).
- items = find_keymap_items(km, 'view3d.cursor3d_enhanced')
+ items = list(KeyMapItemSearch(enh_idname, km))
if activate and (len(items) == 0):
- kmi = km.keymap_items.new('view3d.cursor3d_enhanced', \
- 'ACTIONMOUSE', 'PRESS')
+ kmi = km.keymap_items.new(enh_idname, 'ACTIONMOUSE', 'PRESS')
for key in EnhancedSetCursor.key_map["free_mouse"]:
- kmi = km.keymap_items.new('view3d.cursor3d_enhanced', \
- key, 'PRESS')
+ kmi = km.keymap_items.new(enh_idname, key, 'PRESS')
else:
- if activate:
- for kmi in items:
+ for kmi in items:
+ if activate:
kmi.active = activate
- else:
- for kmi in items:
+ else:
km.keymap_items.remove(kmi)
- for kmi in find_keymap_items(km, 'view3d.cursor3d'):
+ for kmi in KeyMapItemSearch(cur_idname):
kmi.active = not activate
- try:
- km = wm.keyconfigs.active.keymaps['3D View']
- for kmi in find_keymap_items(km, 'view3d.cursor3d'):
- kmi.active = not activate
- except KeyError:
- # seems like in recent builds (after 2.63a)
- # 'bpy_prop_collection[key]: key "3D View" not found'
- pass
-
- try:
- km = wm.keyconfigs.default.keymaps['3D View']
- for kmi in find_keymap_items(km, 'view3d.cursor3d'):
- kmi.active = not activate
- except KeyError:
- pass
-
-
class DelayRegistrationOperator(bpy.types.Operator):
bl_idname = "wm.enhanced_3d_cursor_registration"
bl_label = "[Enhanced 3D Cursor] registration delayer"
@@ -5449,31 +5456,8 @@ class DelayRegistrationOperator(bpy.types.Operator):
if (not self.keymap_updated) and \
((event.type == 'TIMER') or ("MOVE" in event.type)):
# clean up (we don't need this operator to run anymore)
- wm = bpy.context.window_manager
-
- for kcfg in wm.keyconfigs.values():
- for km in kcfg.keymaps.values():
- items = find_keymap_items(km,
- 'wm.enhanced_3d_cursor_registration')
- for kmi in items:
- km.keymap_items.remove(kmi)
-
- """
- try:
- # A bug when using Maya keymap presets
- # (reported by chafouin in BlenderArtists thread)
- # KeyError: key "Window" not found'
- # Circumvent for now.
- km = wm.keyconfigs.active.keymaps['Window']
- except KeyError:
- km = None
-
- if km:
- items = find_keymap_items(km,
- 'wm.enhanced_3d_cursor_registration')
- for kmi in items:
- km.keymap_items.remove(kmi)
- """
+ for kmi in KeyMapItemSearch(self.bl_idname):
+ km.keymap_items.remove(kmi)
update_keymap(True)
More information about the Bf-extensions-cvs
mailing list