diff --git a/multi_user/delayable.py b/multi_user/delayable.py index de82495..c18c6e4 100644 --- a/multi_user/delayable.py +++ b/multi_user/delayable.py @@ -3,7 +3,7 @@ import logging import bpy from . import operators, presence, utils -from .libs.replication.replication.constants import FETCHED, RP_COMMON, STATE_ACTIVE, STATE_SYNCING, STATE_SRV_SYNC +from .libs.replication.replication.constants import FETCHED, RP_COMMON, STATE_INITIAL,STATE_QUITTING, STATE_ACTIVE, STATE_SYNCING, STATE_SRV_SYNC logger = logging.getLogger(__name__) logger.setLevel(logging.WARNING) @@ -217,13 +217,14 @@ class DrawClient(Draw): class ClientUpdate(Timer): def __init__(self, timout=.5): super().__init__(timout) + self.handle_quit = False def execute(self): settings = bpy.context.window_manager.session session_info = bpy.context.window_manager.session session = getattr(operators, 'client', None) renderer = getattr(presence, 'renderer', None) - + if session and renderer and session.state['STATE'] == STATE_ACTIVE: # Check if session has been closes prematurely if session.state['STATE'] == 0: @@ -276,6 +277,16 @@ class ClientUpdate(Timer): # TODO: event drivent 3d view refresh presence.refresh_3d_view() - # ui update + elif session.state['STATE'] == STATE_QUITTING: + presence.refresh_3d_view() + self.handle_quit = True + elif session.state['STATE'] == STATE_INITIAL and self.handle_quit: + self.handle_quit = False + presence.refresh_3d_view() + + operators.unregister_delayables() + + presence.renderer.stop() + # # ui update elif session: presence.refresh_3d_view() \ No newline at end of file diff --git a/multi_user/operators.py b/multi_user/operators.py index 72485ab..4ccd168 100644 --- a/multi_user/operators.py +++ b/multi_user/operators.py @@ -30,6 +30,18 @@ ui_context = None stop_modal_executor = False modal_executor_queue = None server_process = None + +def unregister_delayables(): + global delayables, stop_modal_executor + + for d in delayables: + try: + d.unregister() + except: + continue + + stop_modal_executor = True + # OPERATORS @@ -51,7 +63,7 @@ class SessionStartOperator(bpy.types.Operator): # TODO: Sync server clients users.clear() - + delayables.clear() # save config settings.save(context) @@ -105,8 +117,8 @@ class SessionStartOperator(bpy.types.Operator): except Exception as e: self.report({'ERROR'}, repr(e)) logger.error(f"Error: {e}") - - settings.is_admin = True + finally: + settings.is_admin = True # Join a session else: @@ -122,6 +134,8 @@ class SessionStartOperator(bpy.types.Operator): except Exception as e: self.report({'ERROR'}, repr(e)) logger.error(f"Error: {e}") + finally: + settings.is_admin = False # Background client updates service #TODO: Refactoring @@ -158,18 +172,8 @@ class SessionStopOperator(bpy.types.Operator): return True def execute(self, context): - global client, delayables, stop_modal_executor, server_process - assert(client) - stop_modal_executor = True - settings = context.window_manager.session - settings.is_admin = False - - for d in delayables: - try: - d.unregister() - except: - continue - presence.renderer.stop() + global client, delayables, stop_modal_executor + assert(client) try: client.disconnect()