mouseTargetObject.py (1885B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\util\mouseTargetObject.py 2 from carbonui.uicore import uicore 3 __author__ = 'fridrik' 4 import uthread 5 import blue 6 import geo2 7 import weakref 8 SAMPLESIZE = 10 9 10 class MouseTargetObject(object): 11 _owner = None 12 _mouseTrace = None 13 14 def __init__(self, owner, *args): 15 self._owner = weakref.ref(owner) 16 self._mouseTrace = [] 17 uicore.uilib.AddMouseTargetObject(self) 18 19 def GetOwner(self): 20 if self._owner: 21 owner = self._owner() 22 if owner and not owner.destroyed: 23 return owner 24 self._owner = None 25 26 def IsMouseHeadingTowards(self): 27 owner = self.GetOwner() 28 if owner.destroyed: 29 return False 30 mx, my = uicore.ScaleDpi(uicore.uilib.x), uicore.ScaleDpi(uicore.uilib.y) 31 if len(self._mouseTrace) > SAMPLESIZE: 32 self._mouseTrace.pop(0) 33 self._mouseTrace.append((mx, my)) 34 tl, tt, tw, th = (owner.displayX, 35 owner.displayY, 36 owner.displayWidth, 37 owner.displayHeight) 38 if tl <= mx <= tl + tw and tt <= my <= tt + th: 39 return False 40 oldX, oldY = self._mouseTrace[0] 41 if (oldX, oldY) == (mx, my): 42 return False 43 mouseVector = geo2.Vec2Subtract((oldX, oldY), (mx, my)) 44 dirX, dirY = geo2.Vec2Scale(mouseVector, 1000) 45 hit = intersect((tl, tt), (tl + tw, tt + th), (mx, my), (mx - dirX, my - dirY)) 46 if not hit: 47 hit = intersect((tl + tw, tt), (tl, tt + th), (mx, my), (mx - dirX, my - dirY)) 48 if hit: 49 return True 50 return False 51 52 53 def ccw(A, B, C): 54 return (C[1] - A[1]) * (B[0] - A[0]) > (B[1] - A[1]) * (C[0] - A[0]) 55 56 57 def intersect(A, B, C, D): 58 return ccw(A, C, D) != ccw(B, C, D) and ccw(A, B, C) != ccw(A, B, D)