multi-user/multi_user/delayable.py

170 lines
5.1 KiB
Python
Raw Normal View History

import logging
2019-08-23 18:28:57 +08:00
2019-09-30 19:35:50 +08:00
import bpy
from . import operators, presence, utils
2019-08-14 03:32:15 +08:00
from .bl_types.bl_user import BlUser
2019-09-24 20:42:59 +08:00
from .libs.replication.replication.constants import FETCHED, RP_COMMON
2019-08-23 18:28:57 +08:00
logger = logging.getLogger(__name__)
class Delayable():
2019-08-14 21:01:30 +08:00
"""Delayable task interface
"""
2019-08-23 18:28:57 +08:00
def register(self):
raise NotImplementedError
def execute(self):
raise NotImplementedError
def unregister(self):
raise NotImplementedError
2019-08-23 18:28:57 +08:00
class Timer(Delayable):
"""Timer binder interface for blender
Run a bpy.app.Timer in the background looping at the given rate
"""
2019-08-23 18:28:57 +08:00
def __init__(self, duration=1):
self._timeout = duration
self._running = True
def register(self):
"""Register the timer into the blender timer system
"""
bpy.app.timers.register(self.main)
def main(self):
self.execute()
if self._running:
return self._timeout
def execute(self):
"""Main timer loop
"""
raise NotImplementedError
def unregister(self):
"""Unnegister the timer of the blender timer system
"""
if bpy.app.timers.is_registered(self.main):
bpy.app.timers.unregister(self.main)
self._running = False
2019-08-23 18:28:57 +08:00
2019-09-30 19:35:50 +08:00
class ApplyTimer(Timer):
2019-08-23 18:28:57 +08:00
def __init__(self, timout=1, target_type=None):
self._type = target_type
super().__init__(timout)
def execute(self):
if operators.client:
nodes = operators.client.list(filter=self._type)
for node in nodes:
node_ref = operators.client.get(uuid=node)
if node_ref.state == FETCHED:
operators.client.apply(uuid=node)
class DynamicRightSelectTimer(Timer):
def __init__(self, timout=1):
super().__init__(timout)
2019-09-30 19:35:50 +08:00
self.last_selection = []
def execute(self):
if operators.client:
users = operators.client.list(filter=BlUser)
for user in users:
user_ref = operators.client.get(uuid=user)
settings = bpy.context.window_manager.session
2019-09-30 19:35:50 +08:00
# Other user
if user_ref.buffer['name'] != settings.username:
2019-09-30 19:35:50 +08:00
user_selection = user_ref.buffer['selected_objects']
for obj in bpy.data.objects:
2019-09-30 19:35:50 +08:00
obj.hide_select = obj.name in user_selection
# Local user
elif user_ref.pointer:
2019-09-30 19:35:50 +08:00
current_selection = utils.get_selected_objects(
bpy.context.scene)
if current_selection != self.last_selection:
user_ref.pointer.update_selected_objects(bpy.context)
2019-09-30 19:35:50 +08:00
right_strategy = operators.client.get_config()[
'right_strategy']
if right_strategy == RP_COMMON:
obj_common = [
o for o in self.last_selection if o not in current_selection]
obj_ours = [
o for o in current_selection if o not in self.last_selection]
2019-09-21 05:58:57 +08:00
2019-09-27 23:54:52 +08:00
# change old selection right to common
2019-09-21 05:58:57 +08:00
for obj in obj_common:
_object = bpy.data.objects.get(obj)
2019-09-30 19:35:50 +08:00
node = operators.client.get(reference=_object)
2019-09-27 23:54:52 +08:00
if node and node.owner == settings.username:
2019-09-30 19:35:50 +08:00
operators.client.change_owner(
node.uuid, RP_COMMON)
2019-09-21 05:58:57 +08:00
2019-09-27 23:54:52 +08:00
# change new selection to our
2019-09-21 05:58:57 +08:00
for obj in obj_ours:
2019-09-30 19:35:50 +08:00
node = operators.client.get(
reference=bpy.data.objects[obj])
2019-09-27 23:54:52 +08:00
if node and node.owner == RP_COMMON:
2019-09-30 19:35:50 +08:00
operators.client.change_owner(
node.uuid, settings.username)
2019-09-27 23:54:52 +08:00
2019-09-21 05:58:57 +08:00
self.last_selection = current_selection
2019-09-16 17:42:53 +08:00
class RedrawTimer(Timer):
def __init__(self, timout=1, target_type=None):
self._type = target_type
super().__init__(timout)
def execute(self):
if presence.renderer:
presence.refresh_3d_view()
2019-08-23 18:28:57 +08:00
class Draw(Delayable):
def __init__(self):
self._handler = None
def register(self):
self._handler = bpy.types.SpaceView3D.draw_handler_add(
2019-08-23 18:28:57 +08:00
self.execute, (), 'WINDOW', 'POST_VIEW')
def execute(self):
raise NotImplementedError()
2019-08-23 18:28:57 +08:00
def unregister(self):
2019-08-14 03:32:15 +08:00
try:
bpy.types.SpaceView3D.draw_handler_remove(
2019-08-23 18:28:57 +08:00
self._handler, "WINDOW")
2019-08-14 03:32:15 +08:00
except:
logger.error("draw already unregistered")
2019-08-23 18:28:57 +08:00
class ClientUpdate(Draw):
def __init__(self, client_uuid=None):
assert(client_uuid)
self._client_uuid = client_uuid
super().__init__()
def execute(self):
if self._client_uuid and operators.client:
client = operators.client.get(uuid=self._client_uuid)
2019-08-14 03:32:15 +08:00
if client:
client.pointer.update_location()