fix: get undo handlers back to fix undo crashes

related to #32
This commit is contained in:
Swann
2020-05-28 12:59:05 +02:00
parent 8027e541c3
commit 258f27d96e

View File

@ -47,14 +47,15 @@ stop_modal_executor = False
modal_executor_queue = None modal_executor_queue = None
server_process = None server_process = None
def unregister_delayables(): def unregister_delayables():
global delayables, stop_modal_executor global delayables, stop_modal_executor
for d in delayables: for d in delayables:
try: try:
d.unregister() d.unregister()
except: except:
continue continue
stop_modal_executor = True stop_modal_executor = True
@ -200,6 +201,7 @@ class SessionStopOperator(bpy.types.Operator):
return {"FINISHED"} return {"FINISHED"}
class SessionKickOperator(bpy.types.Operator): class SessionKickOperator(bpy.types.Operator):
bl_idname = "session.kick" bl_idname = "session.kick"
bl_label = "Kick" bl_label = "Kick"
@ -226,10 +228,10 @@ class SessionKickOperator(bpy.types.Operator):
def invoke(self, context, event): def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self) return context.window_manager.invoke_props_dialog(self)
def draw(self, context): def draw(self, context):
row = self.layout row = self.layout
row.label(text=f" Do you really want to kick {self.user} ? " ) row.label(text=f" Do you really want to kick {self.user} ? ")
class SessionPropertyRemoveOperator(bpy.types.Operator): class SessionPropertyRemoveOperator(bpy.types.Operator):
bl_idname = "session.remove_prop" bl_idname = "session.remove_prop"
@ -337,7 +339,7 @@ class SessionSnapUserOperator(bpy.types.Operator):
if target_ref: if target_ref:
target_scene = target_ref['metadata']['scene_current'] target_scene = target_ref['metadata']['scene_current']
if target_scene != context.scene.name: if target_scene != context.scene.name:
bpy.context.window.scene = bpy.data.scenes[target_scene] bpy.context.window.scene = bpy.data.scenes[target_scene]
rv3d.view_matrix = mathutils.Matrix( rv3d.view_matrix = mathutils.Matrix(
@ -498,6 +500,20 @@ classes = (
) )
@persistent
def sanitize_deps_graph(dummy):
"""sanitize deps graph
Temporary solution to resolve each node pointers after a Undo.
A future solution should be to avoid storing dataclock reference...
"""
global client
if client and client.state['STATE'] == STATE_ACTIVE:
for node_key in client.list():
client.get(node_key).resolve()
@persistent @persistent
def load_pre_handler(dummy): def load_pre_handler(dummy):
@ -507,9 +523,6 @@ def load_pre_handler(dummy):
bpy.ops.session.stop() bpy.ops.session.stop()
@persistent @persistent
def update_client_frame(scene): def update_client_frame(scene):
if client and client.state['STATE'] == STATE_ACTIVE: if client and client.state['STATE'] == STATE_ACTIVE:
@ -523,12 +536,15 @@ def register():
for cls in classes: for cls in classes:
register_class(cls) register_class(cls)
bpy.app.handlers.undo_post.append(sanitize_deps_graph)
bpy.app.handlers.redo_post.append(sanitize_deps_graph)
bpy.app.handlers.load_pre.append(load_pre_handler) bpy.app.handlers.load_pre.append(load_pre_handler)
bpy.app.handlers.frame_change_pre.append(update_client_frame) bpy.app.handlers.frame_change_pre.append(update_client_frame)
def unregister(): def unregister():
global client global client
@ -540,9 +556,11 @@ def unregister():
for cls in reversed(classes): for cls in reversed(classes):
unregister_class(cls) unregister_class(cls)
bpy.app.handlers.undo_post.remove(sanitize_deps_graph)
bpy.app.handlers.redo_post.remove(sanitize_deps_graph)
bpy.app.handlers.load_pre.remove(load_pre_handler) bpy.app.handlers.load_pre.remove(load_pre_handler)
bpy.app.handlers.frame_change_pre.remove(update_client_frame) bpy.app.handlers.frame_change_pre.remove(update_client_frame)