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]