fix: Updates timer doesn't correctly unregister on connection timeout
Close #69
This commit is contained in:
@ -3,7 +3,7 @@ import logging
|
|||||||
import bpy
|
import bpy
|
||||||
|
|
||||||
from . import operators, presence, utils
|
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 = logging.getLogger(__name__)
|
||||||
logger.setLevel(logging.WARNING)
|
logger.setLevel(logging.WARNING)
|
||||||
@ -217,13 +217,14 @@ class DrawClient(Draw):
|
|||||||
class ClientUpdate(Timer):
|
class ClientUpdate(Timer):
|
||||||
def __init__(self, timout=.5):
|
def __init__(self, timout=.5):
|
||||||
super().__init__(timout)
|
super().__init__(timout)
|
||||||
|
self.handle_quit = False
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
settings = bpy.context.window_manager.session
|
settings = bpy.context.window_manager.session
|
||||||
session_info = bpy.context.window_manager.session
|
session_info = bpy.context.window_manager.session
|
||||||
session = getattr(operators, 'client', None)
|
session = getattr(operators, 'client', None)
|
||||||
renderer = getattr(presence, 'renderer', None)
|
renderer = getattr(presence, 'renderer', None)
|
||||||
|
|
||||||
if session and renderer and session.state['STATE'] == STATE_ACTIVE:
|
if session and renderer and session.state['STATE'] == STATE_ACTIVE:
|
||||||
# Check if session has been closes prematurely
|
# Check if session has been closes prematurely
|
||||||
if session.state['STATE'] == 0:
|
if session.state['STATE'] == 0:
|
||||||
@ -276,6 +277,16 @@ class ClientUpdate(Timer):
|
|||||||
|
|
||||||
# TODO: event drivent 3d view refresh
|
# TODO: event drivent 3d view refresh
|
||||||
presence.refresh_3d_view()
|
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:
|
elif session:
|
||||||
presence.refresh_3d_view()
|
presence.refresh_3d_view()
|
@ -30,6 +30,18 @@ ui_context = None
|
|||||||
stop_modal_executor = False
|
stop_modal_executor = False
|
||||||
modal_executor_queue = None
|
modal_executor_queue = None
|
||||||
server_process = 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
|
# OPERATORS
|
||||||
|
|
||||||
|
|
||||||
@ -51,7 +63,7 @@ class SessionStartOperator(bpy.types.Operator):
|
|||||||
|
|
||||||
# TODO: Sync server clients
|
# TODO: Sync server clients
|
||||||
users.clear()
|
users.clear()
|
||||||
|
delayables.clear()
|
||||||
# save config
|
# save config
|
||||||
settings.save(context)
|
settings.save(context)
|
||||||
|
|
||||||
@ -105,8 +117,8 @@ class SessionStartOperator(bpy.types.Operator):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.report({'ERROR'}, repr(e))
|
self.report({'ERROR'}, repr(e))
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
|
finally:
|
||||||
settings.is_admin = True
|
settings.is_admin = True
|
||||||
|
|
||||||
# Join a session
|
# Join a session
|
||||||
else:
|
else:
|
||||||
@ -122,6 +134,8 @@ class SessionStartOperator(bpy.types.Operator):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.report({'ERROR'}, repr(e))
|
self.report({'ERROR'}, repr(e))
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
|
finally:
|
||||||
|
settings.is_admin = False
|
||||||
|
|
||||||
# Background client updates service
|
# Background client updates service
|
||||||
#TODO: Refactoring
|
#TODO: Refactoring
|
||||||
@ -158,18 +172,8 @@ class SessionStopOperator(bpy.types.Operator):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
global client, delayables, stop_modal_executor, server_process
|
global client, delayables, stop_modal_executor
|
||||||
assert(client)
|
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()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
client.disconnect()
|
client.disconnect()
|
||||||
|
Reference in New Issue
Block a user