tracker.py (5017B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dynamicresources\client\ess\bracket\tracker.py 2 import functools 3 import weakref 4 import eveui 5 import trinity 6 from carbonui import uiconst 7 8 class TransformTracker(object): 9 10 def __init__(self, parent, transform, curve_set, tracker_parent = None, name = None): 11 self._parent = parent 12 self._curve_set = curve_set 13 self._children = [] 14 self._closed = False 15 self._tracker = trinity.EveProjectBracket() 16 if name is not None: 17 self._tracker.name = name 18 self._tracker.parent = (tracker_parent or parent).GetRenderObject() 19 self._tracker.trackTransform = transform 20 self._tracker.bracketUpdateCallback = functools.partial(self._on_tracker_update, self_ref=weakref.ref(self)) 21 self._tracker.displayChangeCallback = functools.partial(self._on_tracker_display, self_ref=weakref.ref(self)) 22 curve_set.curves.append(self._tracker) 23 24 def __del__(self): 25 self.close() 26 27 def add(self, child, anchor = (0.0, 0.0), offset = (0, 0)): 28 child.align = uiconst.NOALIGN 29 child.SetParent(self._parent) 30 if not self._tracker.isVisible: 31 child.display = False 32 reference = ChildReference(child, anchor, offset) 33 child._OnSizeChange_NoBlock = ChildSizeChangeHandler(tracker=self, child_reference=reference, wrapped_callback=child._OnSizeChange_NoBlock) 34 self._children.append(reference) 35 reference.update_position(self.get_projected_position()) 36 return reference 37 38 def remove(self, child): 39 for child_reference in self._iter_children(): 40 child_candidate = child_reference() 41 if child_candidate is child: 42 self._detach_child(child_reference) 43 break 44 else: 45 return 46 47 self._children.remove(child_reference) 48 49 def close(self): 50 if not self._closed: 51 for child_reference in self._children: 52 self._detach_child(child_reference) 53 54 self._children = None 55 self._curve_set.curves.fremove(self._tracker) 56 self._curve_set = None 57 self._closed = True 58 59 def get_projected_position(self): 60 x, y = self._tracker.projectedPosition 61 x = eveui.reverse_scale_dpi(x) 62 y = eveui.reverse_scale_dpi(y) 63 return (x, y) 64 65 @staticmethod 66 def _on_tracker_update(tracker, self_ref): 67 self = self_ref() 68 if self is None: 69 return 70 projected_position = self.get_projected_position() 71 for child_ref in self._iter_children(): 72 child_ref.update_position(projected_position) 73 74 @staticmethod 75 def _on_tracker_display(tracker, is_visible, self_ref): 76 self = self_ref() 77 if self is None: 78 return 79 for child_ref in self._iter_children(): 80 child_ref().display = is_visible 81 82 @staticmethod 83 def _detach_child(child_reference): 84 child = child_reference() 85 if child is not None: 86 child._OnSizeChange_NoBlock = child._OnSizeChange_NoBlock.wrapped_callback 87 child.SetParent(None) 88 89 def _iter_children(self): 90 children_pending_removal = [] 91 for child_ref in self._children: 92 if not child_ref.is_valid: 93 children_pending_removal.append(child_ref) 94 else: 95 yield child_ref 96 97 for child_ref in children_pending_removal: 98 self._children.remove(child_ref) 99 100 101 class ChildSizeChangeHandler(object): 102 103 def __init__(self, tracker, child_reference, wrapped_callback = None): 104 self._tracker_ref = weakref.ref(tracker) 105 self._child_reference = child_reference 106 self.wrapped_callback = wrapped_callback 107 108 def __call__(self, width, height): 109 tracker = self._tracker_ref() 110 if tracker: 111 self._child_reference.update_position(tracker.get_projected_position()) 112 if self.wrapped_callback: 113 self.wrapped_callback(width, height) 114 115 116 class ChildReference(object): 117 118 def __init__(self, child, anchor, offset): 119 self._child_ref = weakref.ref(child) 120 self.anchor = anchor 121 self.offset = offset 122 123 @property 124 def is_valid(self): 125 return self._child_ref() is not None 126 127 def __call__(self): 128 return self._child_ref() 129 130 def update_position(self, projected_position): 131 child = self._child_ref() 132 if child is None: 133 return 134 x, y = projected_position 135 width, height = child.GetCurrentAbsoluteSize() 136 if width is None: 137 width = 0 138 if height is None: 139 height = 0 140 anchor_x, anchor_y = self.anchor 141 offset_x, offset_y = self.offset 142 child.translation = (eveui.scale_dpi(x - anchor_x * width + offset_x), eveui.scale_dpi(y - anchor_y * height + offset_y)) 143 144 145 from dynamicresources.client.ess.bracket.debug import __reload_update__