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

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)