refactor: interface api changes

This commit is contained in:
Swann 2021-03-04 14:22:54 +01:00
parent 0ccd0563ea
commit 2d638ef76f
No known key found for this signature in database
GPG Key ID: E1D3641A7C43AACB
5 changed files with 56 additions and 55 deletions

View File

@ -48,7 +48,7 @@ if bpy.app.version[1] >= 91:
__all__.append('bl_volume') __all__.append('bl_volume')
from . import * from . import *
from replication.data import ReplicatedDataFactory from replication.data import DataTranslationProtocol
def types_to_register(): def types_to_register():
return __all__ return __all__

View File

@ -44,9 +44,10 @@ from bpy.app.handlers import persistent
from bpy_extras.io_utils import ExportHelper, ImportHelper from bpy_extras.io_utils import ExportHelper, ImportHelper
from replication.constants import (COMMITED, FETCHED, RP_COMMON, STATE_ACTIVE, from replication.constants import (COMMITED, FETCHED, RP_COMMON, STATE_ACTIVE,
STATE_INITIAL, STATE_SYNCING, UP) STATE_INITIAL, STATE_SYNCING, UP)
from replication.data import ReplicatedDataFactory from replication.data import DataTranslationProtocol
from replication.repository import Repository
from replication.exception import NonAuthorizedOperationError, ContextError from replication.exception import NonAuthorizedOperationError, ContextError
from replication.interface import session from replication.interface import session, add
from . import bl_types, environment, timers, ui, utils from . import bl_types, environment, timers, ui, utils
from .presence import SessionStatusWidget, renderer, view3d_find from .presence import SessionStatusWidget, renderer, view3d_find
@ -186,7 +187,7 @@ class SessionStartOperator(bpy.types.Operator):
handler.setFormatter(formatter) handler.setFormatter(formatter)
bpy_factory = ReplicatedDataFactory() bpy_protocol = DataTranslationProtocol()
supported_bl_types = [] supported_bl_types = []
# init the factory with supported types # init the factory with supported types
@ -205,7 +206,7 @@ class SessionStartOperator(bpy.types.Operator):
type_local_config = settings.supported_datablocks[type_impl_name] type_local_config = settings.supported_datablocks[type_impl_name]
bpy_factory.register_type( bpy_protocol.register_type(
type_module_class.bl_class, type_module_class.bl_class,
type_module_class, type_module_class,
check_common=type_module_class.bl_check_common) check_common=type_module_class.bl_check_common)
@ -217,10 +218,7 @@ class SessionStartOperator(bpy.types.Operator):
else: else:
python_binary_path = bpy.app.binary_path_python python_binary_path = bpy.app.binary_path_python
session.configure( repo = Repository(data_protocol=bpy_protocol)
factory=bpy_factory,
python_path=python_binary_path,
external_update_handling=True)
# Host a session # Host a session
if self.host: if self.host:
@ -231,13 +229,14 @@ class SessionStartOperator(bpy.types.Operator):
runtime_settings.internet_ip = environment.get_ip() runtime_settings.internet_ip = environment.get_ip()
try: try:
# Init repository
for scene in bpy.data.scenes: for scene in bpy.data.scenes:
session.add(scene) add(repo, scene)
session.host( session.host(
repository= repo,
id=settings.username, id=settings.username,
port=settings.port, port=settings.port,
ipc_port=settings.ipc_port,
timeout=settings.connection_timeout, timeout=settings.connection_timeout,
password=admin_pass, password=admin_pass,
cache_directory=settings.cache_directory, cache_directory=settings.cache_directory,
@ -258,10 +257,10 @@ class SessionStartOperator(bpy.types.Operator):
try: try:
session.connect( session.connect(
repository= repo,
id=settings.username, id=settings.username,
address=settings.ip, address=settings.ip,
port=settings.port, port=settings.port,
ipc_port=settings.ipc_port,
timeout=settings.connection_timeout, timeout=settings.connection_timeout,
password=admin_pass password=admin_pass
) )
@ -272,15 +271,13 @@ class SessionStartOperator(bpy.types.Operator):
# Background client updates service # Background client updates service
deleyables.append(timers.ClientUpdate()) deleyables.append(timers.ClientUpdate())
deleyables.append(timers.DynamicRightSelectTimer()) deleyables.append(timers.DynamicRightSelectTimer())
# deleyables.append(timers.PushTimer(
# queue=stagging,
# timeout=settings.depsgraph_update_rate
# ))
session_update = timers.SessionStatusUpdate() session_update = timers.SessionStatusUpdate()
session_user_sync = timers.SessionUserSync() session_user_sync = timers.SessionUserSync()
session_background_executor = timers.MainThreadExecutor( session_background_executor = timers.MainThreadExecutor(
execution_queue=background_execution_queue) execution_queue=background_execution_queue)
session_listen = timers.SessionListenTimer()
session_listen.register()
session_update.register() session_update.register()
session_user_sync.register() session_user_sync.register()
session_background_executor.register() session_background_executor.register()
@ -288,7 +285,7 @@ class SessionStartOperator(bpy.types.Operator):
deleyables.append(session_background_executor) deleyables.append(session_background_executor)
deleyables.append(session_update) deleyables.append(session_update)
deleyables.append(session_user_sync) deleyables.append(session_user_sync)
deleyables.append(session_listen)
self.report( self.report(
@ -650,7 +647,7 @@ class ApplyArmatureOperator(bpy.types.Operator):
return {'CANCELLED'} return {'CANCELLED'}
if event.type == 'TIMER': if event.type == 'TIMER':
if session and session.state['STATE'] == STATE_ACTIVE: if session and session.state == STATE_ACTIVE:
nodes = session.list(filter=bl_types.bl_armature.BlArmature) nodes = session.list(filter=bl_types.bl_armature.BlArmature)
for node in nodes: for node in nodes:
@ -795,7 +792,7 @@ class SessionSaveBackupOperator(bpy.types.Operator, ExportHelper):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return session.state['STATE'] == STATE_ACTIVE return session.state == STATE_ACTIVE
class SessionStopAutoSaveOperator(bpy.types.Operator): class SessionStopAutoSaveOperator(bpy.types.Operator):
bl_idname = "session.cancel_autosave" bl_idname = "session.cancel_autosave"
@ -804,7 +801,7 @@ class SessionStopAutoSaveOperator(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return (session.state['STATE'] == STATE_ACTIVE and 'SessionBackupTimer' in registry) return (session.state == STATE_ACTIVE and 'SessionBackupTimer' in registry)
def execute(self, context): def execute(self, context):
autosave_timer = registry.get('SessionBackupTimer') autosave_timer = registry.get('SessionBackupTimer')
@ -829,7 +826,7 @@ class SessionLoadSaveOperator(bpy.types.Operator, ImportHelper):
) )
def execute(self, context): def execute(self, context):
from replication.graph import ReplicationGraph from replication.repository import Repository
# TODO: add filechecks # TODO: add filechecks
@ -849,7 +846,7 @@ class SessionLoadSaveOperator(bpy.types.Operator, ImportHelper):
# init the factory with supported types # init the factory with supported types
bpy_factory = ReplicatedDataFactory() bpy_protocol = DataTranslationProtocol()
for type in bl_types.types_to_register(): for type in bl_types.types_to_register():
type_module = getattr(bl_types, type) type_module = getattr(bl_types, type)
name = [e.capitalize() for e in type.split('_')[1:]] name = [e.capitalize() for e in type.split('_')[1:]]
@ -857,16 +854,16 @@ class SessionLoadSaveOperator(bpy.types.Operator, ImportHelper):
type_module_class = getattr(type_module, type_impl_name) type_module_class = getattr(type_module, type_impl_name)
bpy_factory.register_type( bpy_protocol.register_type(
type_module_class.bl_class, type_module_class.bl_class,
type_module_class) type_module_class)
graph = ReplicationGraph() graph = Repository()
for node, node_data in nodes: for node, node_data in nodes:
node_type = node_data.get('str_type') node_type = node_data.get('str_type')
impl = bpy_factory.get_implementation_from_net(node_type) impl = bpy_protocol.get_implementation_from_net(node_type)
if impl: if impl:
logging.info(f"Loading {node}") logging.info(f"Loading {node}")
@ -932,7 +929,7 @@ def update_external_dependencies():
def sanitize_deps_graph(remove_nodes: bool = False): def sanitize_deps_graph(remove_nodes: bool = False):
""" Cleanup the replication graph """ Cleanup the replication graph
""" """
if session and session.state['STATE'] == STATE_ACTIVE: if session and session.state == STATE_ACTIVE:
start = utils.current_milli_time() start = utils.current_milli_time()
rm_cpt = 0 rm_cpt = 0
for node_key in session.list(): for node_key in session.list():
@ -957,18 +954,18 @@ def resolve_deps_graph(dummy):
A future solution should be to avoid storing dataclock reference... A future solution should be to avoid storing dataclock reference...
""" """
if session and session.state['STATE'] == STATE_ACTIVE: if session and session.state == STATE_ACTIVE:
sanitize_deps_graph(remove_nodes=True) sanitize_deps_graph(remove_nodes=True)
@persistent @persistent
def load_pre_handler(dummy): def load_pre_handler(dummy):
if session and session.state['STATE'] in [STATE_ACTIVE, STATE_SYNCING]: if session and session.state in [STATE_ACTIVE, STATE_SYNCING]:
bpy.ops.session.stop() bpy.ops.session.stop()
@persistent @persistent
def update_client_frame(scene): def update_client_frame(scene):
if session and session.state['STATE'] == STATE_ACTIVE: if session and session.state == STATE_ACTIVE:
session.update_user_metadata({ session.update_user_metadata({
'frame_current': scene.frame_current 'frame_current': scene.frame_current
}) })
@ -976,7 +973,7 @@ def update_client_frame(scene):
@persistent @persistent
def depsgraph_evaluation(scene): def depsgraph_evaluation(scene):
if session and session.state['STATE'] == STATE_ACTIVE: if session and session.state == STATE_ACTIVE:
context = bpy.context context = bpy.context
blender_depsgraph = bpy.context.view_layer.depsgraph blender_depsgraph = bpy.context.view_layer.depsgraph
dependency_updates = [u for u in blender_depsgraph.updates] dependency_updates = [u for u in blender_depsgraph.updates]
@ -1035,7 +1032,7 @@ def register():
def unregister(): def unregister():
if session and session.state['STATE'] == STATE_ACTIVE: if session and session.state == STATE_ACTIVE:
session.disconnect() session.disconnect()
from bpy.utils import unregister_class from bpy.utils import unregister_class

View File

@ -399,7 +399,7 @@ class SessionStatusWidget(Widget):
text_scale = self.preferences.presence_hud_scale text_scale = self.preferences.presence_hud_scale
ui_scale = bpy.context.preferences.view.ui_scale ui_scale = bpy.context.preferences.view.ui_scale
color = [1, 1, 0, 1] color = [1, 1, 0, 1]
state = session.state.get('STATE') state = session.state
state_str = f"{get_state_str(state)}" state_str = f"{get_state_str(state)}"
if state == STATE_ACTIVE: if state == STATE_ACTIVE:

View File

@ -23,7 +23,7 @@ from replication.constants import (FETCHED, RP_COMMON, STATE_ACTIVE,
STATE_INITIAL, STATE_LOBBY, STATE_QUITTING, STATE_INITIAL, STATE_LOBBY, STATE_QUITTING,
STATE_SRV_SYNC, STATE_SYNCING, UP) STATE_SRV_SYNC, STATE_SYNCING, UP)
from replication.exception import NonAuthorizedOperationError, ContextError from replication.exception import NonAuthorizedOperationError, ContextError
from replication.interface import session from replication.interface import session, add
from . import operators, utils from . import operators, utils
from .presence import (UserFrustumWidget, UserNameWidget, UserSelectionWidget, from .presence import (UserFrustumWidget, UserNameWidget, UserSelectionWidget,
@ -71,7 +71,7 @@ class Timer(object):
except Exception as e: except Exception as e:
logging.error(e) logging.error(e)
self.unregister() self.unregister()
session.disconnect() session.disconnect(reason=f"Error during timer {self.id} execution")
else: else:
if self.is_running: if self.is_running:
return self._timeout return self._timeout
@ -100,9 +100,13 @@ class SessionBackupTimer(Timer):
def execute(self): def execute(self):
session.save(self._filepath) session.save(self._filepath)
class SessionListenTimer(Timer):
def execute(self):
session.listen()
class ApplyTimer(Timer): class ApplyTimer(Timer):
def execute(self): def execute(self):
if session and session.state['STATE'] == STATE_ACTIVE: if session and session.state == STATE_ACTIVE:
nodes = session.list() nodes = session.list()
for node in nodes: for node in nodes:
@ -130,7 +134,7 @@ class DynamicRightSelectTimer(Timer):
def execute(self): def execute(self):
settings = utils.get_preferences() settings = utils.get_preferences()
if session and session.state['STATE'] == STATE_ACTIVE: if session and session.state == STATE_ACTIVE:
# Find user # Find user
if self._user is None: if self._user is None:
self._user = session.online_users.get(settings.username) self._user = session.online_users.get(settings.username)
@ -262,7 +266,7 @@ class ClientUpdate(Timer):
settings = utils.get_preferences() settings = utils.get_preferences()
if session and renderer: if session and renderer:
if session.state['STATE'] in [STATE_ACTIVE, STATE_LOBBY]: if session.state in [STATE_ACTIVE, STATE_LOBBY]:
local_user = session.online_users.get( local_user = session.online_users.get(
settings.username) settings.username)

View File

@ -71,9 +71,9 @@ class SESSION_PT_settings(bpy.types.Panel):
def draw_header(self, context): def draw_header(self, context):
layout = self.layout layout = self.layout
if session and session.state['STATE'] != STATE_INITIAL: if session and session.state != STATE_INITIAL:
cli_state = session.state cli_state = session.state
state = session.state.get('STATE') state = session.state
connection_icon = "KEYTYPE_MOVING_HOLD_VEC" connection_icon = "KEYTYPE_MOVING_HOLD_VEC"
if state == STATE_ACTIVE: if state == STATE_ACTIVE:
@ -81,7 +81,7 @@ class SESSION_PT_settings(bpy.types.Panel):
else: else:
connection_icon = 'PROP_CON' connection_icon = 'PROP_CON'
layout.label(text=f"Session - {get_state_str(cli_state['STATE'])}", icon=connection_icon) layout.label(text=f"Session - {get_state_str(cli_state)}", icon=connection_icon)
else: else:
layout.label(text=f"Session - v{__version__}",icon="PROP_OFF") layout.label(text=f"Session - v{__version__}",icon="PROP_OFF")
@ -94,13 +94,13 @@ class SESSION_PT_settings(bpy.types.Panel):
if hasattr(context.window_manager, 'session'): if hasattr(context.window_manager, 'session'):
# STATE INITIAL # STATE INITIAL
if not session \ if not session \
or (session and session.state['STATE'] == STATE_INITIAL): or (session and session.state == STATE_INITIAL):
pass pass
else: else:
cli_state = session.state progress = session.state_progress
row = layout.row() row = layout.row()
current_state = cli_state['STATE'] current_state = session.state
info_msg = None info_msg = None
if current_state in [STATE_ACTIVE]: if current_state in [STATE_ACTIVE]:
@ -124,8 +124,8 @@ class SESSION_PT_settings(bpy.types.Panel):
if current_state in [STATE_SYNCING, STATE_SRV_SYNC, STATE_WAITING]: if current_state in [STATE_SYNCING, STATE_SRV_SYNC, STATE_WAITING]:
info_box = row.box() info_box = row.box()
info_box.row().label(text=printProgressBar( info_box.row().label(text=printProgressBar(
cli_state['CURRENT'], progress['current'],
cli_state['TOTAL'], progress['total'],
length=16 length=16
)) ))
@ -141,7 +141,7 @@ class SESSION_PT_settings_network(bpy.types.Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return not session \ return not session \
or (session and session.state['STATE'] == 0) or (session and session.state == 0)
def draw_header(self, context): def draw_header(self, context):
self.layout.label(text="", icon='URL') self.layout.label(text="", icon='URL')
@ -199,7 +199,7 @@ class SESSION_PT_settings_user(bpy.types.Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return not session \ return not session \
or (session and session.state['STATE'] == 0) or (session and session.state == 0)
def draw_header(self, context): def draw_header(self, context):
self.layout.label(text="", icon='USER') self.layout.label(text="", icon='USER')
@ -230,7 +230,7 @@ class SESSION_PT_advanced_settings(bpy.types.Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return not session \ return not session \
or (session and session.state['STATE'] == 0) or (session and session.state == 0)
def draw_header(self, context): def draw_header(self, context):
self.layout.label(text="", icon='PREFERENCES') self.layout.label(text="", icon='PREFERENCES')
@ -322,7 +322,7 @@ class SESSION_PT_user(bpy.types.Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return session and session.state['STATE'] in [STATE_ACTIVE, STATE_LOBBY] return session and session.state in [STATE_ACTIVE, STATE_LOBBY]
def draw_header(self, context): def draw_header(self, context):
self.layout.label(text="", icon='USER') self.layout.label(text="", icon='USER')
@ -353,7 +353,7 @@ class SESSION_PT_user(bpy.types.Panel):
if active_user != 0 and active_user.username != settings.username: if active_user != 0 and active_user.username != settings.username:
row = layout.row() row = layout.row()
user_operations = row.split() user_operations = row.split()
if session.state['STATE'] == STATE_ACTIVE: if session.state == STATE_ACTIVE:
user_operations.alert = context.window_manager.session.time_snap_running user_operations.alert = context.window_manager.session.time_snap_running
user_operations.operator( user_operations.operator(
@ -411,7 +411,7 @@ class SESSION_PT_presence(bpy.types.Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return not session \ return not session \
or (session and session.state['STATE'] in [STATE_INITIAL, STATE_ACTIVE]) or (session and session.state in [STATE_INITIAL, STATE_ACTIVE])
def draw_header(self, context): def draw_header(self, context):
self.layout.prop(context.window_manager.session, self.layout.prop(context.window_manager.session,
@ -519,8 +519,8 @@ class SESSION_PT_repository(bpy.types.Panel):
admin = usr['admin'] admin = usr['admin']
return hasattr(context.window_manager, 'session') and \ return hasattr(context.window_manager, 'session') and \
session and \ session and \
(session.state['STATE'] == STATE_ACTIVE or \ (session.state == STATE_ACTIVE or \
session.state['STATE'] == STATE_LOBBY and admin) session.state == STATE_LOBBY and admin)
def draw_header(self, context): def draw_header(self, context):
self.layout.label(text="", icon='OUTLINER_OB_GROUP_INSTANCE') self.layout.label(text="", icon='OUTLINER_OB_GROUP_INSTANCE')
@ -536,7 +536,7 @@ class SESSION_PT_repository(bpy.types.Panel):
row = layout.row() row = layout.row()
if session.state['STATE'] == STATE_ACTIVE: if session.state == STATE_ACTIVE:
if 'SessionBackupTimer' in registry: if 'SessionBackupTimer' in registry:
row.alert = True row.alert = True
row.operator('session.cancel_autosave', icon="CANCEL") row.operator('session.cancel_autosave', icon="CANCEL")
@ -579,7 +579,7 @@ class SESSION_PT_repository(bpy.types.Panel):
else: else:
row.label(text="Empty") row.label(text="Empty")
elif session.state['STATE'] == STATE_LOBBY and usr and usr['admin']: elif session.state == STATE_LOBBY and usr and usr['admin']:
row.operator("session.init", icon='TOOL_SETTINGS', text="Init") row.operator("session.init", icon='TOOL_SETTINGS', text="Init")
else: else:
row.label(text="Waiting to start") row.label(text="Waiting to start")