fleetCompositionWnd.py (13518B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fleet\fleetCompositionWnd.py 2 from collections import defaultdict 3 import dogma.data 4 import evetypes 5 import localization 6 from carbonui import uiconst, TextColor 7 from carbonui.control.button import Button 8 from carbonui.control.dragResizeCont import DragResizeCont 9 from carbonui.primitives.container import Container 10 from carbonui.primitives.containerAutoSize import ContainerAutoSize 11 from dogma.attributes.format import GetFormattedAttributeAndValue 12 from dogma.const import attributeBaseJumpBridgeCapacitorCost 13 from eve.client.script.ui.control import eveLabel, eveScroll 14 from eve.client.script.ui.control.entries.generic import Generic 15 from eve.client.script.ui.control.entries.util import GetFromClass 16 from carbonui.control.window import Window 17 from carbonui.control.tabGroup import TabGroup 18 from eve.client.script.ui.quickFilter import QuickFilterEdit 19 from eve.client.script.ui.shared.fleet import fleetbroadcastexports 20 from eve.client.script.ui.shared.fleet.entries import FleetCompositionEntry, FleetCompSummaryEntry 21 from eveexceptions import UserError 22 from eveservices.menu import GetMenuService 23 from menu import MenuLabel 24 from utillib import KeyVal 25 import blue 26 27 class FleetComposition(Window): 28 default_windowID = 'FleetComposition' 29 default_captionLabelPath = 'UI/Fleet/FleetComposition/FleetComposition' 30 default_iconNum = 'res:/ui/Texture/WindowIcons/fleet.png' 31 default_minSize = (390, 300) 32 33 def ApplyAttributes(self, attributes): 34 super(FleetComposition, self).ApplyAttributes(attributes) 35 self.ConstructTop() 36 self.tabGroup = TabGroup(name='tabGroup', parent=self.sr.main, settingsID='fleetComp') 37 fleetComp = self.ConstructFleetComp() 38 fleetSummary = self.ConstructFleetSummary() 39 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/FleetComposition/FleetComposition'), fleetComp, self, 'fleetComp') 40 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/FleetComposition/FleetSummary'), fleetSummary, self, 'fleetSummary') 41 self.tabGroup.AutoSelect() 42 43 def ConstructTop(self): 44 self.sr.top = ContainerAutoSize(name='topCont', parent=self.sr.main, align=uiconst.TOTOP, alignMode=uiconst.TOTOP) 45 refreshButtCont = Container(name='refreshButtCont', parent=self.sr.top, align=uiconst.TORIGHT, width=80) 46 self.sr.refreshBtn = Button(parent=refreshButtCont, label=localization.GetByLabel('UI/Commands/Refresh'), left=2, func=self.RefreshClick, align=uiconst.TOPRIGHT) 47 eveLabel.EveLabelMedium(text=localization.GetByLabel('UI/Fleet/FleetComposition/FleetCompositionHelp'), parent=self.sr.top, align=uiconst.TOTOP, color=TextColor.SECONDARY, padding=(0, 0, 0, 8)) 48 49 def ConstructFleetComp(self): 50 fleetComp = Container(name='fleetComp', parent=self.sr.main) 51 self.topCont = Container(name='topCont', parent=fleetComp, align=uiconst.TOTOP) 52 self.filterEdit = QuickFilterEdit(name='filterEdit', parent=self.topCont, hintText=localization.GetByLabel('UI/Inventory/Filter'), maxLength=64, left=4, align=uiconst.TOPRIGHT, OnClearFilter=self.OnFilterEditCleared, width=120) 53 self.topCont.height = self.filterEdit.height + 4 54 self.filterEdit.ReloadFunction = self.OnFilterEdit 55 self.sr.bottom = Container(name='bottomCont', parent=fleetComp, align=uiconst.TOALL, pos=(0, 0, 0, 0)) 56 self.counterLabel = eveLabel.EveLabelMedium(text='', parent=self.sr.bottom, align=uiconst.TOBOTTOM, padRight=4, padTop=4) 57 self.sr.fleetCompScroll = eveScroll.Scroll(name='scrollComposition', parent=self.sr.bottom) 58 self.sr.fleetCompScroll.OnSelectionChange = self.OnScrollSelectionChange 59 self.sr.fleetCompScroll.sr.id = 'scrollComposition' 60 return fleetComp 61 62 def ConstructFleetSummary(self): 63 fleetSummary = Container(name='fleetSummary', parent=self.sr.main) 64 bytGroupCont = DragResizeCont(name='bytGroupCont', parent=fleetSummary, align=uiconst.TOBOTTOM, settingsID='fleetcompsummary_ContProporations', minSize=0.2, maxSize=0.8) 65 byTypeCont = Container(name='bytGroupCont', parent=fleetSummary) 66 self.fleetSummaryTypeScroll = eveScroll.Scroll(name='fleeSummaryTypeScroll', parent=byTypeCont) 67 self.fleetSummaryTypeScroll.sr.id = 'fleeSummaryTypeScroll' 68 self.fleetSummaryGroupScroll = eveScroll.Scroll(name='fleeSummaryGroupScroll', parent=bytGroupCont) 69 self.fleetSummaryGroupScroll.sr.id = 'fleeSummaryGroupScroll' 70 return fleetSummary 71 72 def Load(self, key): 73 if key == 'fleetComp': 74 self.LoadComposition() 75 elif key == 'fleetSummary': 76 self.LoadSummary() 77 78 def LoadComposition(self): 79 fleetSvc = sm.GetService('fleet') 80 if not fleetSvc.IsCommanderOrBoss(): 81 raise UserError('FleetNotCommanderOrBoss') 82 filterText = self.filterEdit.GetValue() 83 scrolllist = [] 84 composition = fleetSvc.GetFleetComposition() 85 fleetHierarchy = fleetSvc.GetFleetHierarchy() 86 fleetPositionText = localization.GetByLabel('UI/Fleet/FleetWindow/FleetPosition') 87 for kv in composition: 88 blue.pyos.BeNice() 89 member = fleetSvc.GetMemberInfo(kv.characterID, fleetHierarchy) 90 if member is None: 91 continue 92 if not fleetSvc.IsMySubordinate(kv.characterID) and not fleetSvc.IsBoss(): 93 continue 94 data = KeyVal() 95 charName = localization.GetByLabel('UI/Common/CharacterNameLabel', charID=kv.characterID) 96 locationName = localization.GetByLabel('UI/Common/LocationDynamic', location=kv.solarSystemID) 97 if kv.stationID: 98 locationName = '%s %s' % (locationName, localization.GetByLabel('UI/Fleet/FleetComposition/Docked')) 99 if kv.shipTypeID is not None: 100 shipTypeName = evetypes.GetName(kv.shipTypeID) 101 shipGroupName = evetypes.GetGroupName(kv.shipTypeID) 102 else: 103 shipTypeName = '' 104 shipGroupName = '' 105 if kv.skills: 106 skillLevels = localization.GetByLabel('UI/Fleet/FleetComposition/SkillLevels', skillLevelA=kv.skills[2], skillLevelB=kv.skills[1], skillLevelC=kv.skills[0]) 107 data.hint = localization.GetByLabel('UI/Fleet/FleetComposition/SkillsHint', skillTypeA=kv.skillIDs[2], skillLevelA=kv.skills[2], skillTypeB=kv.skillIDs[1], skillLevelB=kv.skills[1], skillTypeC=kv.skillIDs[0], skillLevelC=kv.skills[0]) 108 else: 109 skillLevels = '' 110 if not member.wingName: 111 fleetPosition = '' 112 positionSortValue = (None, None) 113 elif not member.squadName: 114 fleetPosition = member.wingName 115 positionSortValue = (fleetPosition, None) 116 else: 117 fleetPosition = '%s / %s ' % (member.wingName, member.squadName) 118 positionSortValue = (member.wingName, member.squadName) 119 data.label = '<t>'.join([charName, 120 locationName, 121 shipTypeName, 122 shipGroupName, 123 member.roleName, 124 skillLevels, 125 fleetPosition]) 126 if filterText and data.label.lower().find(filterText) < 0: 127 continue 128 data.GetMenu = self.OnCompositionEntryMenu 129 data.cfgname = charName 130 data.retval = None 131 data.charID = kv.characterID 132 data.shipTypeID = kv.shipTypeID 133 data.solarSystemID = kv.solarSystemID 134 data.info = cfg.eveowners.Get(kv.characterID) 135 data.Set('sort_%s' % fleetPositionText, positionSortValue) 136 scrolllist.append(GetFromClass(FleetCompositionEntry, data)) 137 138 self.counterLabel.text = localization.GetByLabel('UI/Fleet/FleetComposition/PilotsSelected', numSelected=0, numTotalPilots=len(scrolllist)) 139 headers = [localization.GetByLabel('UI/Common/Name'), 140 localization.GetByLabel('UI/Common/Location'), 141 localization.GetByLabel('UI/Fleet/FleetComposition/ShipType'), 142 localization.GetByLabel('UI/Fleet/FleetComposition/ShipGroup'), 143 localization.GetByLabel('UI/Fleet/FleetComposition/FleetRole'), 144 localization.GetByLabel('UI/Fleet/FleetComposition/FleetSkills'), 145 fleetPositionText] 146 self.sr.fleetCompScroll.Load(headers=headers, contentList=scrolllist, noContentHint=localization.GetByLabel('UI/Common/NothingFound')) 147 148 def OnScrollSelectionChange(self, selectedList, *args): 149 totalPilots = len(self.sr.fleetCompScroll.GetNodes()) 150 selectedPilots = len(selectedList) 151 self.counterLabel.text = localization.GetByLabel('UI/Fleet/FleetComposition/PilotsSelected', numSelected=selectedPilots, numTotalPilots=totalPilots) 152 153 def OnCompositionEntryMenu(self, entry): 154 m = [] 155 data = entry.sr.node 156 m += fleetbroadcastexports.GetMenu_Member(data.charID) 157 if data.solarSystemID: 158 m += [(MenuLabel('UI/Common/SolarSystem'), GetMenuService().CelestialMenu(data.solarSystemID))] 159 if data.shipTypeID: 160 m += [(MenuLabel('UI/Common/Ship'), GetMenuService().GetMenuFromItemIDTypeID(None, data.shipTypeID, includeMarketDetails=True))] 161 return m 162 163 def RefreshClick(self, *args): 164 self.LoadComposition() 165 166 def OnFilterEditCleared(self): 167 self.LoadComposition() 168 169 def OnFilterEdit(self): 170 self.LoadComposition() 171 172 def LoadSummary(self): 173 composition = sm.GetService('fleet').GetFleetComposition() 174 unknownNum = 0 175 numByShipTypeID = defaultdict(int) 176 numByShipGroupID = defaultdict(int) 177 for kv in composition: 178 if kv.shipTypeID is None: 179 unknownNum += 1 180 else: 181 numByShipTypeID[kv.shipTypeID] += 1 182 numByShipGroupID[evetypes.GetGroupID(kv.shipTypeID)] += 1 183 184 byTypeScrollList = [] 185 totalCost = 0 186 unknownJumpCostLocalization = localization.GetByLabel('UI/Fleet/FleetComposition/UnknownJumpCost') 187 for shipTypeID, numShip in numByShipTypeID.iteritems(): 188 sort_key = 'sort_%s' % localization.GetByLabel('UI/Fleet/FleetComposition/NumShips') 189 base_jump_cost = dogma.data.get_type_attribute(shipTypeID, attributeBaseJumpBridgeCapacitorCost) 190 if base_jump_cost is not None: 191 group_base_jump_cost = base_jump_cost * numShip 192 totalCost += group_base_jump_cost 193 formatted_jump_cost_text = GetFormattedAttributeAndValue(attributeBaseJumpBridgeCapacitorCost, group_base_jump_cost).value 194 else: 195 formatted_jump_cost_text = unknownJumpCostLocalization 196 entry = GetFromClass(FleetCompSummaryEntry, {'typeID': shipTypeID, 197 'label': '<t>'.join([evetypes.GetName(shipTypeID), 198 evetypes.GetGroupName(shipTypeID), 199 '<right>%s</right>' % numShip, 200 '<right>%s</right>' % formatted_jump_cost_text]), 201 sort_key: numShip}) 202 byTypeScrollList.append(entry) 203 204 byGroupScrollList = [] 205 for groupID, numShip in numByShipGroupID.iteritems(): 206 entry = GetFromClass(Generic, {'label': '<t>'.join([evetypes.GetGroupNameByGroup(groupID), '<right>%s</right>' % numShip]), 207 'sort_%s' % localization.GetByLabel('UI/Fleet/FleetComposition/NumShips'): numShip}) 208 byGroupScrollList.append(entry) 209 210 if unknownNum: 211 entry = GetFromClass(Generic, {'label': '<t>'.join([localization.GetByLabel('UI/Fleet/FleetComposition/UnknownShipTypeID'), 212 '', 213 '<right>%s</right>' % unknownNum, 214 '']), 215 'sort_%s' % localization.GetByLabel('UI/Fleet/FleetComposition/NumShips'): unknownNum}) 216 byTypeScrollList.append(entry) 217 entry = GetFromClass(Generic, {'label': '<t>'.join([localization.GetByLabel('UI/Fleet/FleetComposition/UnknownShipTypeID'), '<right>%s</right>' % unknownNum]), 218 'sort_%s' % localization.GetByLabel('UI/Fleet/FleetComposition/NumShips'): unknownNum}) 219 byGroupScrollList.append(entry) 220 formatted_total_cost_text = GetFormattedAttributeAndValue(attributeBaseJumpBridgeCapacitorCost, totalCost).value 221 total_text = localization.GetByLabel('UI/Fleet/FleetComposition/UpwellJumpCostTotal', totalCost=formatted_total_cost_text) 222 entry = GetFromClass(Generic, {'label': '<t>'.join(['', 223 '', 224 '', 225 '<right>%s</right>' % total_text]), 226 'sort_%s' % localization.GetByLabel('UI/Fleet/FleetComposition/NumShips'): unknownNum}) 227 byTypeScrollList.append(entry) 228 headers = [localization.GetByLabel('UI/Fleet/FleetComposition/ShipType'), 229 localization.GetByLabel('UI/Fleet/FleetComposition/ShipGroup'), 230 localization.GetByLabel('UI/Fleet/FleetComposition/NumShips'), 231 localization.GetByLabel('UI/Fleet/FleetComposition/BaseUpwellJumpCost')] 232 self.fleetSummaryTypeScroll.Load(headers=headers, contentList=byTypeScrollList) 233 headers = [localization.GetByLabel('UI/Fleet/FleetComposition/ShipGroup'), localization.GetByLabel('UI/Fleet/FleetComposition/NumShips')] 234 self.fleetSummaryGroupScroll.Load(headers=headers, contentList=byGroupScrollList)