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

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)