diff --git a/multi_user/delayable.py b/multi_user/delayable.py index e0ae8b2..f50c981 100644 --- a/multi_user/delayable.py +++ b/multi_user/delayable.py @@ -83,26 +83,21 @@ class DynamicRightSelectTimer(Timer): super().__init__(timout) self._last_selection = [] self._user = None - self._user_node = None + self._user_metadata = None self._right_strategy = RP_COMMON def execute(self): - repo = operators.client - if repo: - settings = bpy.context.window_manager.session + session = operators.client + settings = bpy.context.window_manager.session + if session: # Find user if self._user is None: - users = repo.list(filter=BlUser) - - for user in users: - user_node = repo.get(uuid=user) - if user_node.pointer: - self._user = user_node.pointer - self._user_node = user_node + self._user = session.online_users.get(settings.username) + self._user_metadata = self._user.get('metadata') if self._right_strategy is None: - self._right_strategy = repo.get_config()[ + self._right_strategy = session.get_config()[ 'right_strategy'] if self._user: @@ -117,27 +112,27 @@ class DynamicRightSelectTimer(Timer): # change old selection right to common for obj in obj_common: - node = repo.get(uuid=obj) + node = session.get(uuid=obj) if node and (node.owner == settings.username or node.owner == RP_COMMON): recursive = True if node.data and 'instance_type' in node.data.keys(): recursive = node.data['instance_type'] != 'COLLECTION' - repo.change_owner( + session.change_owner( node.uuid, RP_COMMON, recursive=recursive) # change new selection to our for obj in obj_ours: - node = repo.get(uuid=obj) + node = session.get(uuid=obj) if node and node.owner == RP_COMMON: recursive = True if node.data and 'instance_type' in node.data.keys(): recursive = node.data['instance_type'] != 'COLLECTION' - repo.change_owner( + session.change_owner( node.uuid, settings.username, recursive=recursive) @@ -145,22 +140,34 @@ class DynamicRightSelectTimer(Timer): return self._last_selection = current_selection - self._user.update_selected_objects( - bpy.context) - repo.push(self._user_node.uuid) + self._user_metadata['selected_objects'] = current_selection + session.update_user_metadata(self._user_metadata) + logger.info("Update selection") # Fix deselection until right managment refactoring (with Roles concepts) if len(current_selection) == 0 and self._right_strategy == RP_COMMON: - owned_keys = repo.list( + owned_keys = session.list( filter_owner=settings.username) for key in owned_keys: - node = repo.get(uuid=key) + node = session.get(uuid=key) if not isinstance(node, BlUser): - repo.change_owner( + session.change_owner( key, RP_COMMON, recursive=recursive) + for user, user_info in session.online_users.items(): + if user != settings.username: + metadata = user_info.get('metadata') + + if 'selected_objects' in metadata: + # Update selectionnable objects + for obj in bpy.data.objects: + if obj.hide_select and obj.uuid not in metadata['selected_objects']: + obj.hide_select = False + elif not obj.hide_select and obj.uuid in metadata['selected_objects']: + obj.hide_select = True + class Draw(Delayable): def __init__(self): @@ -191,27 +198,25 @@ class DrawClient(Draw): for user in users.values(): metadata = user.get('metadata') - # if settings.presence_show_selected: - # presence.renderer.draw_client_selection( - # cli_ref.data['name'], cli_ref.data['color'], cli_ref.data['selected_objects']) - if settings.presence_show_user: + if settings.presence_show_selected and 'selected_objects' in metadata.keys(): + presence.renderer.draw_client_selection( + user['id'], metadata['color'], metadata['selected_objects']) + if settings.presence_show_user and 'view_corners' in metadata: presence.renderer.draw_client_camera( user['id'], metadata['view_corners'], metadata['color']) class ClientUpdate(Timer): - def __init__(self, timout=1, client_uuid=None): - assert(client_uuid) - self._client_uuid = client_uuid + def __init__(self, timout=1): super().__init__(timout) def execute(self): settings = bpy.context.window_manager.session session_info = bpy.context.window_manager.session session = operators.client - if self._client_uuid and operators.client: - client = operators.client.get(uuid=self._client_uuid) - local_user = operators.client.online_users[session_info.username] + if session: + local_user = operators.client.online_users.get( + session_info.username) metadata = { 'view_corners': presence.get_view_corners(), @@ -220,14 +225,11 @@ class ClientUpdate(Timer): settings.client_color.g, settings.client_color.b, 1), - 'selected_objects':utils.get_selected_objects(bpy.context.scene) } session.update_user_metadata(metadata) logger.info("{}".format(local_user)) - if client: - client.pointer.update_location() # sync online users session_users = operators.client.online_users diff --git a/multi_user/libs/replication b/multi_user/libs/replication index d5a24da..20c122a 160000 --- a/multi_user/libs/replication +++ b/multi_user/libs/replication @@ -1 +1 @@ -Subproject commit d5a24da5fcbd2d697f9384a4638486c50d62db08 +Subproject commit 20c122a522dea6c1d4991b30be548c3e1e81857c diff --git a/multi_user/operators.py b/multi_user/operators.py index c7dcfad..9f1ae5e 100644 --- a/multi_user/operators.py +++ b/multi_user/operators.py @@ -57,11 +57,6 @@ class SessionStartOperator(bpy.types.Operator): users.clear() - # #load our infos into the local user list - # local_user = users.add() - # local_user.name = 'localhost' - # local_user.username = settings.username - # local_user.current_frame = context.scene.frame_current # save config settings.save(context) @@ -141,8 +136,8 @@ class SessionStartOperator(bpy.types.Operator): # for node in client.list(): client.commit(scene_uuid) - delayables.append(delayable.ClientUpdate( - client_uuid=settings.user_uuid)) + + delayables.append(delayable.ClientUpdate()) delayables.append(delayable.DrawClient()) delayables.append(delayable.DynamicRightSelectTimer())