NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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__