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

menuDataFactory.py (4746B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\control\contextMenu\menuDataFactory.py
      2 import types
      3 from carbonui.control.contextMenu.menuData import MenuData
      4 from carbonui.control.contextMenu.menuEntryData import MenuEntryData, BaseMenuEntryData
      5 from eve.client.script.ui import menuUtil
      6 from menu import MenuLabel, NO_ARGUMENTS
      7 DISABLED_ENTRY = [-1]
      8 DISABLED_ENTRY2 = [[-1]]
      9 
     10 def CreateMenuDataFromRawTuples(rawTupleDataList):
     11     if isinstance(rawTupleDataList, MenuData):
     12         return rawTupleDataList
     13     rawTupleDataList = _chomplist(rawTupleDataList)
     14     if not rawTupleDataList:
     15         return
     16     menuEntryDataList = []
     17     for data in rawTupleDataList:
     18         if data is None:
     19             menuEntryDataList.append(None)
     20         elif isinstance(data, BaseMenuEntryData):
     21             menuEntryDataList.append(data)
     22         else:
     23             menuEntryData = _GetEntryTupleFromRawTuple(data)
     24             menuEntryDataList.append(menuEntryData)
     25 
     26     return CreateMenuDataWithEntries(menuEntryDataList)
     27 
     28 
     29 def CreateMenuDataWithEntries(menuEntryDataList, iconSize = 16):
     30     menuData = MenuData(iconSize=iconSize)
     31     menuEntryDataList = _SortMenuEntries(menuEntryDataList)
     32     lastMenuEntryData = None
     33     for menuEntryData in menuEntryDataList:
     34         if menuEntryData is None:
     35             menuData.AddSeparator()
     36             continue
     37         if lastMenuEntryData and menuEntryData.GetPrimaryMenuGroupID() != lastMenuEntryData.GetPrimaryMenuGroupID():
     38             menuData.AddSeparator()
     39         lastMenuEntryData = menuEntryData
     40         menuData.AppendMenuEntryData(menuEntryData)
     41 
     42     return menuData
     43 
     44 
     45 def _GetEntryTupleFromRawTuple(each):
     46     menuGroupID = None
     47     quantity = None
     48     menuLabel, value = each[:2]
     49     if isinstance(menuLabel, MenuLabel):
     50         text = menuLabel
     51     else:
     52         if isinstance(menuLabel, basestring):
     53             menuGroupID = menuUtil.GetMenuGroup(menuLabel.lower())
     54         text = menuLabel
     55     if len(each) > 2 and each[2] != NO_ARGUMENTS:
     56         args = each[2]
     57         if args not in (DISABLED_ENTRY, DISABLED_ENTRY2):
     58             value = lambda f = value, args = args: f(*args)
     59         else:
     60             value = None
     61         if len(args) == 2 and type(args[1]) == list and len(args[1]) > 1:
     62             quantity = _GetEntryQuantity(args)
     63     icon = None
     64     if len(each) > 3:
     65         icon = each[3]
     66         if icon is not None:
     67             if isinstance(icon, types.TupleType):
     68                 icon, _ = icon
     69     menuClass = None
     70     if len(each) > 4:
     71         menuClass = each[4]
     72     internalName = ''
     73     if len(each) > 5:
     74         internalName = each[5]
     75     typeID = None
     76     if len(each) > 6:
     77         typeID = each[6]
     78     func = None
     79     subMenuData = None
     80     if callable(value):
     81         func = value
     82     elif isinstance(value, (list, tuple)) and value:
     83         if value[0] == 'isDynamic':
     84             _func = value[1]
     85             args = value[2]
     86             subMenuData = lambda : _func(*args)
     87         else:
     88             subMenuData = value
     89     elif isinstance(value, basestring) and isinstance(text, basestring):
     90         text += ' ( %s )' % value
     91     return MenuEntryData(text=text, func=func, subMenuData=subMenuData, texturePath=icon, menuGroupID=menuGroupID, menuEntryViewClass=menuClass, internalName=internalName, typeID=typeID, quantity=quantity)
     92 
     93 
     94 def _GetEntryQuantity(args):
     95     t = 0
     96     for eacharg in args[1]:
     97         t1 = None
     98         if hasattr(eacharg, 'stacksize'):
     99             t1 = eacharg.stacksize
    100         if t1 is None and hasattr(eacharg, 'quantity'):
    101             t1 = eacharg.quantity
    102         if t1 is not None:
    103             t += t1
    104         else:
    105             t += 1
    106 
    107     return t
    108 
    109 
    110 def _SortMenuEntries(entryList, *args):
    111     entryList.sort(cmp=_CompareGroups)
    112     return entryList
    113 
    114 
    115 def _CompareGroups(x, y):
    116     groupX = x.menuGroupID if x else None
    117     groupY = y.menuGroupID if y else None
    118     if groupX in menuUtil.menuHierarchy:
    119         priorityX = menuUtil.menuHierarchy.index(groupX)
    120     else:
    121         priorityX = -1
    122     if groupY in menuUtil.menuHierarchy:
    123         priorityY = menuUtil.menuHierarchy.index(groupY)
    124     else:
    125         priorityY = -1
    126     if priorityX < priorityY:
    127         return -1
    128     elif priorityX == priorityY:
    129         return 0
    130     else:
    131         return 1
    132 
    133 
    134 def _chomplist(lst):
    135     if not lst:
    136         return
    137     startIdx = 0
    138     lstLen = len(lst)
    139     stopIdx = lstLen
    140     while startIdx < stopIdx:
    141         if lst[startIdx] is None:
    142             startIdx += 1
    143         elif lst[stopIdx - 1] is None:
    144             stopIdx -= 1
    145         else:
    146             break
    147 
    148     if stopIdx <= startIdx:
    149         return
    150     if startIdx == 0 and stopIdx == lstLen:
    151         return lst
    152     return lst[startIdx:stopIdx]