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

killReport.py (54307B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\killReport.py
      2 from carbonui.primitives.frame import Frame
      3 from collections import defaultdict
      4 import blue
      5 import carbonui.control.button
      6 import eveformat.client
      7 import evelink.client
      8 import evetypes
      9 import inventorycommon.const as inventoryConst
     10 import localization
     11 import trinity
     12 import uthread
     13 import utillib
     14 from carbon.common.script.util.format import FmtDate
     15 from carbonui import uiconst
     16 from carbonui.control.scrollentries import SE_BaseClassCore
     17 from carbonui.control.window import Window
     18 from carbonui.primitives.container import Container
     19 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     20 from carbonui.primitives.fill import Fill
     21 from carbonui.primitives.line import Line
     22 from carbonui.primitives.sprite import Sprite
     23 from carbonui.util import bunch
     24 from eve.client.script.ui.control import eveIcon, eveLabel, eveLoadingWheel, eveScroll
     25 from eve.client.script.ui.control.entries.generic import Generic
     26 from eve.client.script.ui.control.entries.header import Header
     27 from eve.client.script.ui.control.entries.util import GetFromClass
     28 from eve.client.script.ui.control.eveScroll import Scroll
     29 from eve.client.script.ui.control.themeColored import LineThemeColored
     30 from eve.client.script.ui.services.menuSvcExtras.openFunctions import SimulateFitting
     31 from eve.client.script.ui.shared import killReportUtil
     32 from eve.client.script.ui.util import uix
     33 from eve.common.lib.appConst import defaultPadding, singletonBlueprintCopy
     34 from eve.common.script.sys import eveCfg, idCheckers
     35 from eve.common.script.sys.idCheckers import IsVoidSpaceSystem, IsHiddenSpaceSystem
     36 from eve.common.script.util import eveCommonUtils
     37 from eve.common.script.util.esiUtils import CopyESIKillmailUrlToClipboard
     38 from eve.common.script.sys.idCheckers import IsAbyssalSpaceSystem, IsFaction
     39 from eveservices.menu import GetMenuService
     40 from inventorycommon.util import IsSubsystemFlag
     41 from menu import MenuLabel
     42 from shipfitting.multiBuyUtil import BuyMultipleTypesWithQty
     43 
     44 class KillReportWnd(Window):
     45     __guid__ = 'form.KillReportWnd'
     46     __notifyevents__ = []
     47     default_windowID = 'KillReportWnd'
     48     default_width = 650
     49     default_height = 640
     50     default_minSize = (default_width, default_height)
     51     default_iconNum = 'res:/UI/Texture/WindowICons/killreport.png'
     52 
     53     def ApplyAttributes(self, attributes):
     54         Window.ApplyAttributes(self, attributes)
     55         killmail = attributes.Get('killmail', None)
     56         self.windowID = attributes.windowID
     57         self.rawKillmail = None
     58         self.SetCaption(localization.GetByLabel('UI/Corporations/Wars/Killmails/KillReport'))
     59         self.ConstructLayout()
     60         self.LoadInfo(killmail)
     61 
     62     def ConstructLayout(self):
     63         topCont = Container(name='topCont', parent=self.sr.main, align=uiconst.TOTOP, height=138, padding=defaultPadding)
     64         Line(parent=topCont, align=uiconst.TOBOTTOM)
     65         topLeftCont = Container(name='topLeftCont', parent=topCont, align=uiconst.TOLEFT, width=260, padLeft=defaultPadding)
     66         topRightCont = Container(name='topRightCont', parent=topCont, align=uiconst.TOALL)
     67         self.guyCont = Container(name='guyCont', parent=topLeftCont, align=uiconst.TOLEFT, width=128)
     68         self.shipCont = Container(name='shipCont', parent=topLeftCont, align=uiconst.TOLEFT, width=128)
     69         self.infoCont = Container(name='infoCont', parent=topRightCont, align=uiconst.TOALL, padLeft=6, padRight=4, clipChildren=True)
     70         victimCont = Container(name='victimCont', parent=self.infoCont, align=uiconst.TOTOP, height=68)
     71         victimNameCont = Container(name='victimNameCont', parent=victimCont, align=uiconst.TOTOP, height=24, clipChildren=True)
     72         victimCorpCont = Container(name='victimCorpCont', parent=victimCont, align=uiconst.TOALL)
     73         self.victimCorpLogoCont = Container(name='victimCorpLogoCont', parent=victimCorpCont, align=uiconst.TOLEFT, width=32)
     74         self.victimAllianceLogoCont = Container(name='victimAllianceLogoCont', parent=victimCorpCont, align=uiconst.TOLEFT, width=32)
     75         victimCorpTextCont = Container(name='victimCorpTextCont', parent=victimCorpCont, align=uiconst.TOALL, padLeft=defaultPadding)
     76         shipCont = Container(name='damageCont', parent=self.infoCont, align=uiconst.TOTOP, height=32)
     77         dateCont = Container(name='dateCont', parent=self.infoCont, align=uiconst.TOALL)
     78         self.victimName = eveLabel.EveCaptionSmall(text='', parent=victimNameCont, name='victimName', state=uiconst.UI_NORMAL)
     79         self.victimCorpName = eveLabel.EveLabelMedium(text='', parent=victimCorpTextCont, name='victimCorpName', align=uiconst.TOTOP, state=uiconst.UI_NORMAL, top=defaultPadding)
     80         self.victimAllianceName = eveLabel.EveLabelMedium(text='', parent=victimCorpTextCont, name='victimAllianceName', align=uiconst.TOTOP, state=uiconst.UI_NORMAL)
     81         self.shipName = eveLabel.EveLabelMedium(text='', parent=shipCont, name='shipName', state=uiconst.UI_NORMAL, autoFadeSides=True)
     82         self.killDate = eveLabel.EveLabelMedium(text='', parent=dateCont, name='killDate', autoFadeSides=True)
     83         self.locationName = eveLabel.EveLabelMedium(text='', parent=dateCont, name='locationName', top=14, state=uiconst.UI_NORMAL, autoFadeSides=True)
     84         infoCont = Container(name='infoCont', parent=self.sr.main, align=uiconst.TOALL, padding=(defaultPadding,
     85          0,
     86          defaultPadding,
     87          defaultPadding))
     88         bottomLeftCont = Container(name='bottomLeftCont', parent=infoCont, align=uiconst.TOLEFT, width=260, padLeft=defaultPadding)
     89         bottomRightCont = Container(name='bottomRightCont', padLeft=5, parent=infoCont, align=uiconst.TOALL)
     90         killersCont = Container(name='killersCont', parent=bottomLeftCont, align=uiconst.TOALL)
     91         self.killedOnBehalfCont = Container(name='killedOnBehalfCont', parent=killersCont, align=uiconst.TOTOP, height=90)
     92         eveLabel.EveLabelLarge(text=localization.GetByLabel('UI/Corporations/Wars/Killmails/KilledOnBehalf'), parent=self.killedOnBehalfCont, align=uiconst.TOTOP)
     93         self.behalfCont = KilledOnBehalfContainer(name='behalfCont', parent=self.killedOnBehalfCont, align=uiconst.TOTOP)
     94         self.killedOnBehalfCont.display = False
     95         self.involvedParties = eveLabel.EveLabelLarge(text='', parent=killersCont, name='involvedParties', align=uiconst.TOTOP)
     96         self.damageTaken = eveLabel.EveLabelMedium(text='', parent=killersCont, name='damageTaken', align=uiconst.TOTOP, color=(1.0, 0.0, 0.0))
     97         finalBlowCont = Container(name='finalBlowCont', parent=killersCont, align=uiconst.TOTOP, height=84, top=8)
     98         eveLabel.EveLabelMedium(text=localization.GetByLabel('UI/Corporations/Wars/Killmails/FinalBlow'), parent=finalBlowCont, align=uiconst.TOTOP)
     99         self.finalBlowCont = KillerContainer(name='topKiller', parent=finalBlowCont, align=uiconst.TOTOP)
    100         topDamageCont = Container(name='topDamageCont', parent=killersCont, align=uiconst.TOTOP, height=94, top=12)
    101         eveLabel.EveLabelMedium(text=localization.GetByLabel('UI/Corporations/Wars/Killmails/TopDamage'), parent=topDamageCont, align=uiconst.TOTOP)
    102         self.topDamageCont = KillerContainer(name='topDamageCont', parent=topDamageCont, align=uiconst.TOTOP)
    103         self.killersScrollLine = Line(parent=killersCont, align=uiconst.TOTOP, padBottom=6, state=uiconst.UI_DISABLED)
    104         self.killersScroll = Scroll(name='killersScroll', parent=killersCont, align=uiconst.TOALL, state=uiconst.UI_NORMAL)
    105         self.sr.maincontainer.padLeft = self.sr.maincontainer.padTop = 0
    106         self.killersScroll.HideBackground()
    107         self.loadingWheel = eveLoadingWheel.LoadingWheel(parent=killersCont, align=uiconst.CENTER, state=uiconst.UI_DISABLED, idx=0, top=50)
    108         self.loadingWheel.display = False
    109         itemsCont = Container(name='itemsCont', parent=bottomRightCont, align=uiconst.TOALL)
    110         topItemsCont = Container(name='topItemsCont', parent=itemsCont, align=uiconst.TOTOP, height=28, padBottom=defaultPadding)
    111         eveLabel.EveLabelLarge(text=localization.GetByLabel('UI/Corporations/Wars/Killmails/FittingAndContent'), parent=topItemsCont, name='fittingLabel', align=uiconst.TOPLEFT, top=3)
    112         self.buttonCont = Container(name='buttonCont', parent=itemsCont, align=uiconst.TOBOTTOM, height=50)
    113         LineThemeColored(parent=self.buttonCont, align=uiconst.TOTOP, colorType=uiconst.COLORTYPE_UIBASECONTRAST, blendMode=trinity.TR2_SBM_ADD)
    114         self.savefittingBtn = carbonui.control.button.Button(label=localization.GetByLabel('UI/Corporations/Wars/Killmails/SaveFitting'), parent=self.buttonCont, align=uiconst.CENTERLEFT, func=self.SaveFitting, top=3)
    115         self.simulateFittingBtn = carbonui.control.button.Button(label=localization.GetByLabel('UI/Fitting/FittingWindow/SimulateShipFitting'), parent=self.buttonCont, align=uiconst.CENTERLEFT, func=self.SimulateFitting, left=self.savefittingBtn.width + 4, top=3)
    116         buyAllBtn = carbonui.control.button.Button(parent=self.buttonCont, label=localization.GetByLabel('UI/Market/MarketQuote/BuyAll'), func=self.BuyAll, align=uiconst.CENTERRIGHT)
    117         self.buttonCont.height = self.savefittingBtn.height + 16
    118         bottomItemsCont = ContainerAutoSize(name='bottomItemsCont', parent=itemsCont, align=uiconst.TOBOTTOM)
    119         allItemsCont = Container(name='allItemsCont', parent=itemsCont, align=uiconst.TOALL)
    120         self.itemsScroll = eveScroll.Scroll(name='itemsScroll', parent=allItemsCont)
    121         totalLossCont = Container(name='totalLossCont', parent=bottomItemsCont, align=uiconst.TOTOP, height=40, padRight=8)
    122         eveLabel.EveLabelLarge(text=localization.GetByLabel('UI/Corporations/Wars/Killmails/TotalWorth'), parent=totalLossCont, name='totalWorth', align=uiconst.CENTERLEFT, top=6)
    123         self.totalWorthLabel = eveLabel.EveLabelLarge(text='', parent=totalLossCont, name='totalWorthLabel', align=uiconst.CENTERRIGHT, top=6)
    124         self.totalPayoutCont = ContainerAutoSize(name='totalPayoutCont', parent=bottomItemsCont, align=uiconst.TOTOP, padRight=8)
    125         self.pendCont = Container(name='pendCont', parent=self.totalPayoutCont, align=uiconst.TOTOP, height=17)
    126         eveLabel.EveLabelSmall(text=localization.GetByLabel('UI/Corporations/Wars/Killmails/PendInsurance'), parent=self.pendCont, name='totalLoss', align=uiconst.BOTTOMLEFT)
    127         self.pendLabel = eveLabel.EveLabelSmall(text='', parent=self.pendCont, name='pendLabel', align=uiconst.BOTTOMRIGHT, color=(1.0, 0.0, 0.0))
    128         self.lpCont = Container(name='lpCont', parent=self.totalPayoutCont, align=uiconst.TOTOP, height=17)
    129         eveLabel.EveLabelSmall(text=localization.GetByLabel('UI/Corporations/Wars/Killmails/LPPaidOut'), parent=self.lpCont, name='totalLP', align=uiconst.BOTTOMLEFT)
    130         self.totalLPLabel = eveLabel.EveLabelSmall(text='', parent=self.lpCont, name='totalLPLabel', align=uiconst.BOTTOMRIGHT, color=(0.0, 1.0, 0.0))
    131         self.lpCont.display = False
    132         self.bountyCont = Container(name='bountyCont', parent=self.totalPayoutCont, align=uiconst.TOTOP, height=17, display=False)
    133         eveLabel.EveLabelSmall(text=localization.GetByLabel('UI/Corporations/Wars/Killmails/BountyPaidOut'), parent=self.bountyCont, name='totalBounty', align=uiconst.BOTTOMLEFT)
    134         self.totalBountyLabel = eveLabel.EveLabelSmall(text='', parent=self.bountyCont, name='totalBountyLabel', align=uiconst.BOTTOMRIGHT, color=(0.0, 1.0, 0.0))
    135         self.bountyCont.display = False
    136         self.totalSpacer = Container(name='totalSpacer', parent=self.totalPayoutCont, align=uiconst.TOTOP, height=12)
    137 
    138     def LoadInfo(self, killmail):
    139         uthread.new(self.LoadInfo_thread, killmail)
    140 
    141     def LoadInfo_thread(self, killmail):
    142         self.guyCont.Flush()
    143         self.shipCont.Flush()
    144         self.victimAllianceLogoCont.Flush()
    145         self.victimCorpLogoCont.Flush()
    146         self.rawKillmail = killmail
    147         self.killmail = self.FormatKillMail(killmail)
    148         killmail = self.killmail
    149         self.attackers, self.items = eveCommonUtils.GetKillMailInfo(self.rawKillmail)
    150         self.orignalItems = [ x.copy() for x in self.items ]
    151         isCapsule = evetypes.GetGroupID(killmail.victimShipTypeID) == inventoryConst.groupCapsule
    152         isShip = evetypes.GetCategoryID(killmail.victimShipTypeID) == inventoryConst.categoryShip
    153         self.buttonCont.display = False
    154         self.savefittingBtn.display = False
    155         self.simulateFittingBtn.display = False
    156         if len(self.items):
    157             if isCapsule:
    158                 self.buttonCont.display = True
    159             elif isShip:
    160                 self.buttonCont.display = True
    161                 self.savefittingBtn.display = True
    162                 self.simulateFittingBtn.display = True
    163         if idCheckers.IsCharacter(killmail.victimCharacterID):
    164             victim = eveIcon.Icon(parent=self.guyCont, align=uiconst.TOPRIGHT, size=128, idx=0)
    165             sm.GetService('photo').GetPortrait(killmail.victimCharacterID, 128, victim)
    166             victim.OnClick = (self.OpenPortrait, killmail.victimCharacterID)
    167             victimHint = cfg.eveowners.Get(killmail.victimCharacterID).name
    168             dragHint = localization.GetByLabel('UI/Fitting/FittingWindow/FittingManagement/FittingIconHint')
    169         else:
    170             victim = eveIcon.GetLogoIcon(itemID=killmail.victimCorporationID, parent=self.guyCont, acceptNone=False, align=uiconst.TOPRIGHT, height=128, width=128, state=uiconst.UI_NORMAL)
    171             victim.OnClick = (self.ShowInfo, killmail.victimCorporationID, inventoryConst.typeCorporation)
    172             victimHint = cfg.eveowners.Get(killmail.victimCorporationID).name
    173             dragHint = localization.GetByLabel('UI/Corporations/Wars/DragToShare')
    174         victim.GetDragData = self.GetKillDragData
    175         victim.hint = '%s<br>%s' % (victimHint, dragHint)
    176         ship = eveIcon.Icon(parent=self.shipCont, align=uiconst.TOPRIGHT, size=128, typeID=killmail.victimShipTypeID)
    177         ship.OnClick = (self.OpenPreview, killmail.victimShipTypeID)
    178         ship.GetDragData = self.GetKillDragData
    179         shipTechIcon = Sprite(name='techIcon', parent=self.shipCont, width=16, height=16, idx=0)
    180         uix.GetTechLevelIcon(shipTechIcon, 0, killmail.victimShipTypeID)
    181         ship.hint = '%s<br>%s' % (evetypes.GetName(killmail.victimShipTypeID), localization.GetByLabel('UI/Fitting/FittingWindow/FittingManagement/FittingIconHint'))
    182         victimCorpName = cfg.eveowners.Get(killmail.victimCorporationID).name
    183         victimCorpLabel = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=victimCorpName, info=('showinfo', inventoryConst.typeCorporation, killmail.victimCorporationID))
    184         self.victimCorpName.text = victimCorpLabel
    185         victimCorpLogo = eveIcon.GetLogoIcon(itemID=killmail.victimCorporationID, parent=self.victimCorpLogoCont, acceptNone=False, align=uiconst.TOPRIGHT, height=32, width=32, state=uiconst.UI_NORMAL)
    186         victimCorpLogo.OnClick = (self.ShowInfo, killmail.victimCorporationID, inventoryConst.typeCorporation)
    187         victimCorpLogo.hint = victimCorpName
    188         victimCorpLogo.SetSize(32, 32)
    189         victimCorpNameTop = defaultPadding * 2
    190         self.victimAllianceName.display = True
    191         if killmail.victimAllianceID:
    192             victimAllianceName = cfg.eveowners.Get(killmail.victimAllianceID).name
    193             victimAllianceLabel = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=victimAllianceName, info=('showinfo', inventoryConst.typeAlliance, killmail.victimAllianceID))
    194             self.victimAllianceName.text = victimAllianceLabel
    195             victimAllianceLogo = eveIcon.GetLogoIcon(itemID=killmail.victimAllianceID, parent=self.victimAllianceLogoCont, acceptNone=False, align=uiconst.TOPRIGHT, height=32, width=32)
    196             victimAllianceLogo.OnClick = (self.ShowInfo, killmail.victimAllianceID, inventoryConst.typeAlliance)
    197             victimAllianceLogo.hint = victimAllianceName
    198             victimCorpNameTop = 0
    199         elif killmail.victimFactionID:
    200             victimFactionName = cfg.eveowners.Get(killmail.victimFactionID).name
    201             victimFactionLabel = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=victimFactionName, info=('showinfo', inventoryConst.typeFaction, killmail.victimFactionID))
    202             self.victimAllianceName.text = victimFactionLabel
    203             victimAllianceLogo = eveIcon.GetLogoIcon(itemID=killmail.victimFactionID, parent=self.victimAllianceLogoCont, acceptNone=False, align=uiconst.TOPRIGHT, height=32, width=32)
    204             victimAllianceLogo.OnClick = (self.ShowInfo, killmail.victimFactionID, inventoryConst.typeFaction)
    205             victimAllianceLogo.hint = victimFactionName
    206             victimAllianceLogo.SetSize(32, 32)
    207             victimCorpNameTop = 0
    208         else:
    209             self.victimAllianceName.text = ''
    210             self.victimAllianceName.display = False
    211             victimAllianceLogo = Sprite(texturePath='res:/UI/Texture/defaultAlliance.dds', parent=self.victimAllianceLogoCont, align=uiconst.TOPLEFT, width=32, height=32, state=uiconst.UI_NORMAL)
    212             victimAllianceLogo.hint = localization.GetByLabel('UI/PeopleAndPlaces/OwnerNotInAnyAlliance', corpName=victimCorpName)
    213             victimAllianceLogo.SetAlpha(0.2)
    214         self.victimCorpName.top = victimCorpNameTop
    215         self.killDate.text = FmtDate(killmail.killTime, 'ss')
    216         self.locationName.text = self.GetLocation(killmail.solarSystemID)
    217         shipName = evetypes.GetName(killmail.victimShipTypeID)
    218         shipGroupID = evetypes.GetGroupID(killmail.victimShipTypeID)
    219         shipGroupName = evetypes.GetGroupNameByGroup(shipGroupID)
    220         shipLabel = localization.GetByLabel('UI/Corporations/Wars/Killmails/ShipInfo', showInfoName=shipName, info=('showinfo', killmail.victimShipTypeID), groupName=shipGroupName)
    221         if idCheckers.IsCharacter(killmail.victimCharacterID):
    222             victimName = cfg.eveowners.Get(killmail.victimCharacterID).name
    223             victimNameLabel = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=victimName, info=('showinfo', inventoryConst.typeCharacter, killmail.victimCharacterID))
    224             self.victimName.text = victimNameLabel
    225             self.shipName.text = shipLabel
    226         else:
    227             self.victimName.text = shipLabel
    228             self.shipName.text = ''
    229         self.damageTaken.text = localization.GetByLabel('UI/Corporations/Wars/Killmails/TotalDamage', damage=killmail.victimDamageTaken)
    230         if killmail.iskLost:
    231             worthText = eveformat.isk(killmail.iskLost, fraction=False)
    232         else:
    233             worthText = localization.GetByLabel('UI/Common/Unknown')
    234         self.totalWorthLabel.text = worthText
    235         if self.rawKillmail.iskDestroyed is not None:
    236             lossText = eveformat.isk(self.rawKillmail.iskDestroyed, fraction=False)
    237         else:
    238             lossText = localization.GetByLabel('UI/Common/Unknown')
    239         self.pendLabel.text = lossText
    240         if self.rawKillmail.bountyClaimed:
    241             bountyText = eveformat.isk(self.rawKillmail.bountyClaimed, fraction=False)
    242             self.totalBountyLabel.text = bountyText
    243             self.bountyCont.display = True
    244         else:
    245             bountyText = None
    246             self.bountyCont.display = False
    247         if self.rawKillmail.loyaltyPoints is not None and self.rawKillmail.loyaltyPoints > 0:
    248             LPText = localization.GetByLabel('UI/LPStore/AmountLP', lpAmount=eveformat.number(self.rawKillmail.loyaltyPoints, decimal_places=0))
    249             self.totalLPLabel.text = LPText
    250             self.lpCont.display = True
    251         else:
    252             LPText = None
    253             self.lpCont.display = False
    254         if bountyText is None and LPText is None:
    255             self.totalPayoutCont.display = False
    256         else:
    257             self.totalPayoutCont.display = True
    258         self._LoadItemsToScrollPanel(self.itemsScroll, self.GetItems())
    259         self.GetAttackers()
    260         self.DrawKillers()
    261         isKilledOnBehalf = False
    262         self.IsKilledOnBehalf(isKilledOnBehalf)
    263 
    264     def _LoadItemsToScrollPanel(self, scrollPanel, items):
    265         entries = []
    266         for slots, label, iconID in (('hiSlots', 'UI/Corporations/Wars/Killmails/HighPowerSlots', 293),
    267          ('medSlots', 'UI/Corporations/Wars/Killmails/MediumPowerSlots', 294),
    268          ('lowSlots', 'UI/Corporations/Wars/Killmails/LowPowerSlots', 295),
    269          ('rigs', 'UI/Corporations/Wars/Killmails/RigSlots', 3266),
    270          ('subSystems', 'UI/Corporations/Wars/Killmails/SubSystemSlots', 3756),
    271          ('deed', 'UI/Corporations/Wars/Killmails/DeedSlot', 2224)):
    272             entries.extend(self._GetListEntriesForSlot(items[slots], label, iconID))
    273 
    274         for flag, label, iconID in ((inventoryConst.flagDroneBay, 'UI/Corporations/Wars/Killmails/DroneBay', 76), (inventoryConst.flagCargo, 'UI/Corporations/Wars/Killmails/CargoBay', 71), (inventoryConst.flagImplant, 'UI/Corporations/Wars/Killmails/Implants', 2224)):
    275             entries.extend(self._GetListEntriesForFlag(items['other'], flag, label, iconID))
    276 
    277         otherItems = []
    278         for flagID, items2 in items['other'].iteritems():
    279             if flagID in (inventoryConst.flagDroneBay, inventoryConst.flagCargo, inventoryConst.flagImplant):
    280                 continue
    281             for item in items2:
    282                 otherItems.extend(self._GetListEntriesForItem(item))
    283 
    284         if len(otherItems):
    285             entries.append(GetFromClass(ItemsHeader, {'label': 'Other',
    286              'iconID': 71}))
    287             entries.extend(otherItems)
    288         scrollPanel.Load(contentList=entries, headers=[], noContentHint=localization.GetByLabel('UI/Corporations/Assets/NoItemsFound'))
    289 
    290     def _GetListEntriesForSlot(self, items, label, iconID):
    291         if not len(items):
    292             return []
    293         entries = [GetFromClass(ItemsHeader, {'label': localization.GetByLabel(label),
    294           'iconID': iconID})]
    295         itemsByTypeID = {}
    296         for item in items:
    297             if item.typeID not in itemsByTypeID:
    298                 itemsByTypeID[item.typeID] = item
    299             else:
    300                 itemsByTypeID[item.typeID].qtyDestroyed += item.qtyDestroyed
    301                 itemsByTypeID[item.typeID].qtyDropped += item.qtyDropped
    302 
    303         for item in itemsByTypeID.itervalues():
    304             entries.extend(self._GetListEntriesForItem(item))
    305 
    306         return entries
    307 
    308     def _GetListEntriesForFlag(self, items, flag, labelName, icon):
    309         entries = []
    310         if flag in items:
    311             label = localization.GetByLabel(labelName)
    312             entries.append(GetFromClass(ItemsHeader, {'label': label,
    313              'iconID': icon}))
    314             for item in items[flag]:
    315                 entries.extend(self._GetListEntriesForItem(item))
    316 
    317         return entries
    318 
    319     def _GetListEntriesForItem(self, item, indented = False):
    320         entries = []
    321         if item.qtyDestroyed:
    322             destroyedData = self._MakeDestroyedEntryData(item, indented=indented)
    323             entries.append(GetFromClass(KillItems, destroyedData))
    324             if item.contents:
    325                 for containerItem in item.contents:
    326                     entries.extend(self._GetListEntriesForItem(containerItem, indented=True))
    327 
    328         if item.qtyDropped:
    329             droppedData = self._MakeDroppedEntryData(item, indented=indented)
    330             entries.append(GetFromClass(KillItems, droppedData))
    331             if item.contents:
    332                 for containerItem in item.contents:
    333                     entries.extend(self._GetListEntriesForItem(containerItem, indented=True))
    334 
    335         return entries
    336 
    337     def _MakeDroppedEntryData(self, item, indented = False):
    338         data = utillib.KeyVal()
    339         data.typeID = item.typeID
    340         data.qtyDestroyed = None
    341         data.qtyDropped = item.qtyDropped
    342         data.singleton = item.singleton
    343         data.flag = item.flag
    344         data.indented = indented
    345         return data
    346 
    347     def _MakeDestroyedEntryData(self, item, indented = False):
    348         data = utillib.KeyVal()
    349         data.typeID = item.typeID
    350         data.qtyDestroyed = item.qtyDestroyed
    351         data.qtyDropped = None
    352         data.singleton = item.singleton
    353         data.flag = item.flag
    354         data.indented = indented
    355         return data
    356 
    357     def DrawKillers(self):
    358         self.killersScroll.Clear()
    359         killmail = self.killmail
    360         topKiller = utillib.KeyVal()
    361         topKiller.killerID = killmail.finalCharacterID
    362         topKiller.killerCorporationID = killmail.finalCorporationID
    363         topKiller.killerAllianceID = killmail.finalAllianceID
    364         topKiller.killerShipTypeID = killmail.finalShipTypeID
    365         topKiller.killerWeaponTypeID = killmail.finalWeaponTypeID
    366         topKiller.killerSecurityStatus = killmail.finalSecurityStatus
    367         topKiller.killerDamageDone = killmail.finalDamageDone
    368         topKiller.killerFactionID = killmail.finalFactionID
    369         try:
    370             topKiller.percentage = float(killmail.finalDamageDone) / float(killmail.victimDamageTaken) * 100
    371         except ZeroDivisionError:
    372             topKiller.percentage = 0.0
    373 
    374         involvedParties = 1
    375         self.finalBlowCont.LoadInfo(topKiller)
    376         highestDamage, restOfAttackers = self.GetAttackers()
    377         if highestDamage.characterID:
    378             if topKiller.killerID != int(highestDamage.characterID):
    379                 involvedParties += 1
    380         involvedParties += len(restOfAttackers)
    381         self.involvedParties.text = localization.GetByLabel('UI/Corporations/Wars/Killmails/InvolvedParties', parties=involvedParties)
    382         topDamage = self.GetKiller(highestDamage)
    383         self.topDamageCont.LoadInfo(topDamage)
    384         if len(restOfAttackers):
    385             self.loadingWheel.display = True
    386             self.killersScroll.display = True
    387             self.killersScrollLine.display = True
    388             idsToPrime = set()
    389             for k in restOfAttackers:
    390                 if k.characterID:
    391                     idsToPrime.add(int(k.characterID))
    392                 if k.corporationID:
    393                     idsToPrime.add(int(k.corporationID))
    394                 if k.allianceID:
    395                     idsToPrime.add(int(k.allianceID))
    396 
    397             cfg.eveowners.Prime(idsToPrime)
    398             self.loadingWheel.display = False
    399             scrollList = []
    400             for killer in restOfAttackers:
    401                 if self.destroyed:
    402                     break
    403                 killerInfo = self.GetKiller(killer)
    404                 entry = GetFromClass(KillContainerEntry, {'killer': killerInfo})
    405                 scrollList.append(entry)
    406 
    407             self.killersScroll.Load(contentList=scrollList)
    408         else:
    409             self.killersScroll.display = False
    410             self.killersScrollLine.display = False
    411 
    412     def GetKiller(self, killer):
    413         killerInfo = utillib.KeyVal()
    414         if killer.characterID:
    415             killerInfo.killerID = int(killer.characterID)
    416         else:
    417             killerInfo.killerID = None
    418         killerInfo.killerCorporationID = killer.corporationID
    419         killerInfo.killerAllianceID = killer.allianceID
    420         if killer.shipTypeID:
    421             killerInfo.killerShipTypeID = int(killer.shipTypeID)
    422         else:
    423             killerInfo.killerShipTypeID = None
    424         if killer.weaponTypeID:
    425             killerInfo.killerWeaponTypeID = int(killer.weaponTypeID)
    426         else:
    427             killerInfo.killerWeaponTypeID = None
    428         killerInfo.killerSecurityStatus = killer.secStatusText
    429         killerInfo.killerDamageDone = killer.damageDone
    430         killerInfo.killerFactionID = killer.factionID
    431         try:
    432             killerInfo.percentage = float(killer.damageDone) / float(self.killmail.victimDamageTaken) * 100
    433         except ZeroDivisionError:
    434             killerInfo.percentage = 0
    435 
    436         return killerInfo
    437 
    438     def GetLocation(self, solarSystemID):
    439         if IsAbyssalSpaceSystem(solarSystemID) or IsVoidSpaceSystem(solarSystemID) or IsHiddenSpaceSystem(solarSystemID):
    440             return localization.GetByLabel('UI/Abyss/AbyssalDepths')
    441         solarSystem = cfg.mapSystemCache[solarSystemID]
    442         constellationID = solarSystem.constellationID
    443         regionID = solarSystem.regionID
    444         return u'{solar_system} {security_status} &lt; {constellation} &lt; {region}'.format(solar_system=evelink.location_link(solarSystemID), security_status=eveformat.solar_system_security_status(solarSystemID), constellation=evelink.location_link(constellationID), region=evelink.location_link(regionID))
    445 
    446     def FormatKillMail(self, killmail):
    447         km = utillib.KeyVal()
    448         km.killID = killmail.killID
    449         km.killTime = killmail.killTime
    450         km.solarSystemID = killmail.solarSystemID
    451         km.moonID = killmail.moonID
    452         km.victimCharacterID = killmail.victimCharacterID
    453         km.victimCorporationID = killmail.victimCorporationID
    454         km.victimFactionID = killmail.victimFactionID
    455         km.victimAllianceID = killmail.victimAllianceID
    456         km.victimShipTypeID = killmail.victimShipTypeID
    457         km.victimDamageTaken = killmail.victimDamageTaken
    458         km.finalCharacterID = killmail.finalCharacterID
    459         km.finalCorporationID = killmail.finalCorporationID
    460         km.finalAllianceID = killmail.finalAllianceID
    461         km.finalShipTypeID = killmail.finalShipTypeID
    462         km.finalWeaponTypeID = killmail.finalWeaponTypeID
    463         km.finalSecurityStatus = killmail.finalSecurityStatus
    464         km.finalDamageDone = killmail.finalDamageDone
    465         km.finalFactionID = killmail.finalFactionID
    466         km.warID = killmail.warID
    467         km.iskLost = killmail.iskLost or None
    468         return km
    469 
    470     def GetAttackers(self):
    471         self.attackers.sort(reverse=True)
    472         highestDamage = self.attackers[0][1]
    473         try:
    474             restOfAttackers = [ attacker for damage, attacker in self.attackers[1:] if not attacker.finalBlow ]
    475         except IndexError:
    476             restOfAttackers = []
    477 
    478         return (highestDamage, restOfAttackers)
    479 
    480     def IsKilledOnBehalf(self, isKilledOnBehalf):
    481         killRightSupplied = self.rawKillmail.killRightSupplied
    482         if killRightSupplied is not None:
    483             self.killedOnBehalfCont.display = True
    484             charID = killRightSupplied
    485             publicInfo = sm.GetService('corp').GetInfoWindowDataForChar(killRightSupplied)
    486             corpID = publicInfo.corpID
    487             allianceID = publicInfo.allianceID
    488             self.behalfCont.LoadInfo(charID, corpID, allianceID, None)
    489         else:
    490             self.killedOnBehalfCont.display = False
    491 
    492     def GetItems(self):
    493         ret = {'hiSlots': [],
    494          'medSlots': [],
    495          'lowSlots': [],
    496          'rigs': [],
    497          'subSystems': [],
    498          'deed': [],
    499          'other': defaultdict(list)}
    500         for item in self.items:
    501             loc = self.GetRack(item.flag)
    502             if loc is None:
    503                 ret['other'][item.flag].append(item)
    504             else:
    505                 ret[loc].append(item)
    506 
    507         return ret
    508 
    509     def GetRack(self, flagID):
    510         if inventoryConst.flagHiSlot0 <= flagID <= inventoryConst.flagHiSlot7:
    511             return 'hiSlots'
    512         if inventoryConst.flagMedSlot0 <= flagID <= inventoryConst.flagMedSlot7:
    513             return 'medSlots'
    514         if inventoryConst.flagLoSlot0 <= flagID <= inventoryConst.flagLoSlot7:
    515             return 'lowSlots'
    516         if inventoryConst.flagRigSlot0 <= flagID <= inventoryConst.flagRigSlot7:
    517             return 'rigs'
    518         if IsSubsystemFlag(flagID):
    519             return 'subSystems'
    520         if flagID == inventoryConst.flagStructureDeed:
    521             return 'deed'
    522 
    523     def OpenPreview(self, typeID, *args):
    524         if eveCfg.IsPreviewable(typeID):
    525             sm.GetService('preview').PreviewType(typeID)
    526 
    527     def OpenPortrait(self, charID, *args):
    528         from eve.client.script.ui.shared.portraitWindow.portraitWindow import PortraitWindow
    529         PortraitWindow.CloseIfOpen()
    530         PortraitWindow.Open(charID=charID)
    531 
    532     def ShowInfo(self, itemID, typeID, *args):
    533         sm.GetService('info').ShowInfo(typeID, itemID)
    534 
    535     def SaveFitting(self, *args):
    536         sm.GetService('fittingSvc').DisplayFittingFromItems(self.rawKillmail.victimShipTypeID, self.orignalItems)
    537 
    538     def SimulateFitting(self, *args):
    539         fitting = sm.GetService('fittingSvc').GetFittingFromItems(self.rawKillmail.victimShipTypeID, self.items)
    540         SimulateFitting(fitting)
    541 
    542     def BuyAll(self, *args):
    543         buyDict = defaultdict(int)
    544         for eachItem in self.orignalItems:
    545             qty = getattr(eachItem, 'stacksize', None)
    546             if qty is None:
    547                 qty = getattr(eachItem, 'qtyDropped', 0) + getattr(eachItem, 'qtyDestroyed', 0)
    548             buyDict[int(eachItem.typeID)] += qty
    549 
    550         if evetypes.GetGroupID(self.rawKillmail.victimShipTypeID) != inventoryConst.groupCapsule:
    551             buyDict[self.rawKillmail.victimShipTypeID] = 1
    552         BuyMultipleTypesWithQty(buyDict)
    553 
    554     def GetMenuMoreOptions(self):
    555         menuData = super(KillReportWnd, self).GetMenuMoreOptions()
    556         menuData += self.GetSettingsMenu()
    557         return menuData
    558 
    559     def GetSettingsMenu(self, *args):
    560         m = [(MenuLabel('UI/Control/Entries/CopyKillInfo'), self.GetCombatText, ()), (MenuLabel('UI/Control/Entries/CopyExternalKillLink'), CopyESIKillmailUrlToClipboard, (self.rawKillmail,))]
    561         return m
    562 
    563     def GetCombatText(self, *args):
    564         killmail = eveCommonUtils.CombatLog_CopyText(self.rawKillmail)
    565         blue.pyos.SetClipboardData(killReportUtil.CleanKillMail(killmail))
    566 
    567     def GetKillDragData(self, *args):
    568         fakeNode = bunch.Bunch()
    569         fakeNode.mail = self.rawKillmail
    570         fakeNode.__guid__ = 'listentry.KillMail'
    571         return [fakeNode]
    572 
    573 
    574 class KillItems(Generic):
    575     __guid__ = 'listentry.KillItems'
    576     isDragObject = True
    577 
    578     def Startup(self, *args):
    579         Generic.Startup(self, *args)
    580         self.bgColor = Fill(bgParent=self, color=(0.0, 1.0, 0.0, 0.1), state=uiconst.UI_HIDDEN)
    581         qtyCont = Container(name='qtyCont', parent=self, align=uiconst.TORIGHT, width=80, padRight=defaultPadding)
    582         self.itemCont = Container(name='itemCont', parent=self, align=uiconst.TOALL, clipChildren=True)
    583         self.sr.label = eveLabel.EveLabelMedium(text='', parent=self.itemCont, state=uiconst.UI_DISABLED, maxLines=1, align=uiconst.CENTERLEFT)
    584         self.sr.qtyLabel = eveLabel.EveLabelMedium(text='', parent=qtyCont, state=uiconst.UI_DISABLED, maxLines=1, align=uiconst.CENTERRIGHT)
    585         iconCont = Container(parent=self.itemCont, pos=(16, 0, 24, 24), align=uiconst.CENTERLEFT)
    586         Sprite(bgParent=iconCont, name='background', texturePath='res:/UI/Texture/classes/InvItem/bgNormal.png')
    587         self.sr.icon = eveIcon.Icon(parent=iconCont, pos=(0, 1, 24, 24), align=uiconst.TOPLEFT, idx=0)
    588         self.sr.techIcon = Sprite(name='techIcon', parent=iconCont, left=0, width=12, height=12, idx=0)
    589 
    590     def Load(self, node):
    591         Generic.Load(self, node)
    592         self.sr.node = node
    593         data = node
    594         if node.indented:
    595             self.itemCont.padLeft = 16
    596         self.sr.node.typeID = int(node.typeID)
    597         self.typeID = int(data.typeID)
    598         qtyDestroyed = data.qtyDestroyed
    599         qtyDropped = data.qtyDropped
    600         singleton = data.singleton
    601         flag = data.flag
    602         typeName = evetypes.GetName(self.typeID)
    603         isCopy = False
    604         if evetypes.GetCategoryID(self.typeID) == inventoryConst.categoryBlueprint:
    605             self.sr.icon.top = 0
    606             if singleton == singletonBlueprintCopy:
    607                 isCopy = True
    608                 typeName += ' (%s)' % localization.GetByLabel('UI/Generic/Copy').lower()
    609             else:
    610                 typeName += ' (%s)' % localization.GetByLabel('UI/Generic/Original').lower()
    611         self.sr.label.text = typeName
    612         if qtyDropped > 0:
    613             self.bgColor.state = uiconst.UI_DISABLED
    614             self.sr.qtyLabel.text = eveformat.number(qtyDropped)
    615         else:
    616             self.bgColor = uiconst.UI_HIDDEN
    617             self.sr.qtyLabel.text = eveformat.number(qtyDestroyed)
    618         self.sr.techIcon.state = uiconst.UI_HIDDEN
    619         if self.typeID:
    620             self.sr.icon.state = uiconst.UI_NORMAL
    621             if flag == inventoryConst.flagImplant:
    622                 self.sr.icon.LoadIcon(evetypes.GetIconID(self.typeID), ignoreSize=True)
    623             else:
    624                 self.sr.icon.LoadIconByTypeID(typeID=self.typeID, size=24, ignoreSize=True, isCopy=isCopy)
    625             self.sr.icon.SetSize(24, 24)
    626             self.sr.label.left = self.height + 16
    627             techSprite = uix.GetTechLevelIcon(self.sr.techIcon, 1, self.typeID)
    628             techSprite.SetSize(12, 12)
    629 
    630     def GetHeight(self, *args):
    631         node, width = args
    632         node.height = 26
    633         return node.height
    634 
    635     def GetMenu(self):
    636         if self.typeID:
    637             return GetMenuService().GetMenuFromItemIDTypeID(None, self.typeID, includeMarketDetails=True)
    638         return []
    639 
    640     def OnDblClick(self, *args):
    641         sm.GetService('info').ShowInfo(self.typeID)
    642 
    643     def GetDragData(self, *args):
    644         return [self.sr.node]
    645 
    646     @classmethod
    647     def GetCopyData(cls, node):
    648         typeID = int(node.typeID)
    649         typeName = evetypes.GetName(typeID)
    650         qty = unicode(node.qtyDestroyed or node.qtyDropped or '')
    651         copyText = ''
    652         if evetypes.GetCategoryID(typeID) == inventoryConst.categoryBlueprint:
    653             if node.singleton == singletonBlueprintCopy:
    654                 copyText = localization.GetByLabel('UI/Generic/Copy')
    655             else:
    656                 copyText = localization.GetByLabel('UI/Generic/Original')
    657         if node.qtyDestroyed:
    658             droppedText = localization.GetByLabel('UI/Corporations/Wars/Killmails/Destroyed')
    659         elif node.qtyDropped:
    660             droppedText = localization.GetByLabel('UI/Corporations/Wars/Killmails/Dropped')
    661         else:
    662             droppedText = ''
    663         return '<t>'.join([typeName,
    664          qty,
    665          copyText,
    666          droppedText])
    667 
    668 
    669 class ItemsHeader(Header):
    670     __guid__ = 'listentry.ItemsHeader'
    671 
    672     def Startup(self, *args):
    673         Header.Startup(self, *args)
    674         self.sr.icon = eveIcon.Icon(parent=self, pos=(0, 0, 24, 24), align=uiconst.CENTERLEFT, idx=0, ignoreSize=True)
    675 
    676     def Load(self, node):
    677         Header.Load(self, node)
    678         self.sr.label.left = 30
    679         self.sr.icon.LoadIcon(node.iconID, ignoreSize=True)
    680 
    681     def GetHeight(self, *args):
    682         node, width = args
    683         node.height = 27
    684         return node.height
    685 
    686 
    687 class KillerContainer(Container):
    688     default_height = 66
    689     default_align = uiconst.TOTOP
    690 
    691     def ApplyAttributes(self, attributes):
    692         Container.ApplyAttributes(self, attributes)
    693         self.killerID = attributes.get('killerID', None)
    694         self.ConstructLayout()
    695 
    696     def ConstructLayout(self):
    697         iconCont = Container(name='iconCont', parent=self, align=uiconst.TOLEFT, width=96)
    698         self.killerCont = Container(name='killerCont', parent=iconCont, align=uiconst.TOLEFT, width=64, padTop=1, padBottom=1, state=uiconst.UI_NORMAL)
    699         self.shipCont = Container(name='shipCont', parent=iconCont, align=uiconst.TOPRIGHT, width=32, height=32, top=1)
    700         Sprite(bgParent=self.shipCont, name='shipBackground', texturePath='res:/UI/Texture/classes/InvItem/bgNormal.png')
    701         self.weaponCont = Container(name='weaponCont', parent=iconCont, align=uiconst.BOTTOMRIGHT, width=32, height=32, top=1)
    702         Sprite(bgParent=self.weaponCont, name='weaponBackground', texturePath='res:/UI/Texture/classes/InvItem/bgNormal.png')
    703         self.textCont = Container(name='textCont', parent=self, align=uiconst.TOALL, padLeft=defaultPadding)
    704         self.nameLabel = eveLabel.EveLabelSmall(text='', parent=self.textCont, maxLines=1, align=uiconst.TOTOP, top=-1, state=uiconst.UI_NORMAL)
    705         self.corpLabel = eveLabel.EveLabelSmall(text='', parent=self.textCont, maxLines=1, align=uiconst.TOTOP, top=-1, state=uiconst.UI_NORMAL)
    706         self.allianceLabel = eveLabel.EveLabelSmall(text='', parent=self.textCont, maxLines=1, align=uiconst.TOTOP, top=-1, state=uiconst.UI_NORMAL)
    707         self.damageLabel = eveLabel.EveLabelSmall(text='', parent=self.textCont, maxLines=1, align=uiconst.TOBOTTOM)
    708 
    709     def LoadInfo(self, killer):
    710         self.killerCont.Flush()
    711         self.shipCont.Flush()
    712         self.weaponCont.Flush()
    713         self.allianceLabel.text = ''
    714         self.damageLabel.text = ''
    715         nameHint = ''
    716         killerLogo = Sprite(parent=self.killerCont, align=uiconst.TOALL, idx=0, texturePath='res:/UI/Texture/silhouette_64.png')
    717         if killer.killerID:
    718             sm.GetService('photo').GetPortrait(killer.killerID, 64, killerLogo)
    719             killerLogo.OnClick = (self.ShowInfo, killer.killerID, inventoryConst.typeCharacter)
    720             killerLogo.hint = cfg.eveowners.Get(killer.killerID).name
    721         if killer.killerShipTypeID:
    722             shipLogo = eveIcon.Icon(parent=self.shipCont, align=uiconst.TOPRIGHT, size=32, typeID=killer.killerShipTypeID, ignoreSize=True)
    723             shipLogo.OnClick = (self.ShowInfo, None, killer.killerShipTypeID)
    724             shipTechIcon = Sprite(name='techIcon', parent=self.shipCont, width=12, height=12, idx=0)
    725             shipTechSprite = uix.GetTechLevelIcon(shipTechIcon, 0, killer.killerShipTypeID)
    726             if shipTechSprite:
    727                 shipTechSprite.SetSize(12, 12)
    728             shipLogo.hint = evetypes.GetName(killer.killerShipTypeID)
    729         if killer.killerWeaponTypeID:
    730             self.weaponCont.display = True
    731             weaponLogo = eveIcon.Icon(parent=self.weaponCont, align=uiconst.TOPRIGHT, size=32, typeID=killer.killerWeaponTypeID, ignoreSize=True)
    732             weaponLogo.OnClick = (self.ShowInfo, None, killer.killerWeaponTypeID)
    733             techIcon = Sprite(name='techIcon', parent=self.weaponCont, width=12, height=12, idx=0)
    734             techSprite = uix.GetTechLevelIcon(techIcon, 0, killer.killerWeaponTypeID)
    735             if techSprite:
    736                 techSprite.SetSize(12, 12)
    737             self.damageLabel.text = localization.GetByLabel('UI/Corporations/Wars/Killmails/DamageDone', damage=killer.killerDamageDone, percentage=killer.percentage)
    738             weaponLogo.hint = '%s<br>%s' % (evetypes.GetName(killer.killerWeaponTypeID), self.damageLabel.text)
    739         else:
    740             self.weaponCont.display = False
    741         if killer.killerID:
    742             self.nameLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(killer.killerID).name, info=('showinfo', inventoryConst.typeCharacter, killer.killerID))
    743             nameHint = '%s<br>%s' % (cfg.eveowners.Get(killer.killerID).name, cfg.eveowners.Get(killer.killerCorporationID).name)
    744         else:
    745             self.nameLabel.text = evetypes.GetName(killer.killerShipTypeID)
    746         showInfoType = inventoryConst.typeFaction if IsFaction(int(killer.killerCorporationID)) else inventoryConst.typeCorporation
    747         self.corpLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(killer.killerCorporationID).name, info=('showinfo', showInfoType, killer.killerCorporationID))
    748         self.allianceLabel.display = True
    749         if killer.killerAllianceID:
    750             self.allianceLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(killer.killerAllianceID).name, info=('showinfo', inventoryConst.typeAlliance, killer.killerAllianceID))
    751             nameHint += '<br>%s' % cfg.eveowners.Get(killer.killerAllianceID).name
    752         elif killer.killerFactionID:
    753             self.allianceLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(killer.killerFactionID).name, info=('showinfo', inventoryConst.typeFaction, killer.killerFactionID))
    754             nameHint += '<br>%s' % cfg.eveowners.Get(killer.killerFactionID).name
    755         else:
    756             self.allianceLabel.display = False
    757         killerLogo.hint = nameHint
    758 
    759     def ShowInfo(self, itemID, typeID, *args):
    760         sm.GetService('info').ShowInfo(typeID, itemID)
    761 
    762 
    763 class KillContainerEntry(SE_BaseClassCore):
    764     bottomPadding = 8
    765     BIG_LOGO_SIZE = 64
    766     SMALL_LOGO_SIZE = 32
    767 
    768     def Startup(self, *etc):
    769         self.killerLogo = Sprite(parent=self, align=uiconst.TOPLEFT, pos=(0,
    770          1,
    771          self.BIG_LOGO_SIZE,
    772          self.BIG_LOGO_SIZE), state=uiconst.UI_NORMAL, texturePath='res:/UI/Texture/silhouette_64.png')
    773         shipCont = Container(name='shipCont', parent=self, align=uiconst.TOPLEFT, pos=(self.BIG_LOGO_SIZE,
    774          1,
    775          self.SMALL_LOGO_SIZE,
    776          self.SMALL_LOGO_SIZE))
    777         Sprite(bgParent=shipCont, name='shipBackground', texturePath='res:/UI/Texture/classes/InvItem/bgNormal.png')
    778         self.shipTechIcon = Sprite(name='techIcon', parent=shipCont, width=12, height=12, idx=0)
    779         self.shipLogo = eveIcon.Icon(parent=shipCont, align=uiconst.TOPRIGHT, size=self.SMALL_LOGO_SIZE)
    780         self.weaponCont = Container(name='weaponCont', parent=self, align=uiconst.TOPLEFT, pos=(64,
    781          self.SMALL_LOGO_SIZE + 1,
    782          self.SMALL_LOGO_SIZE,
    783          self.SMALL_LOGO_SIZE))
    784         Sprite(bgParent=self.weaponCont, name='weaponBackground', texturePath='res:/UI/Texture/classes/InvItem/bgNormal.png')
    785         self.weaponTechIcon = Sprite(name='techIcon', parent=self.weaponCont, width=12, height=12, idx=0)
    786         self.weaponLogo = eveIcon.Icon(parent=self.weaponCont, align=uiconst.TOPRIGHT, size=self.SMALL_LOGO_SIZE)
    787         textLeft = self.BIG_LOGO_SIZE + self.SMALL_LOGO_SIZE + 4
    788         self.nameLabel = eveLabel.EveLabelSmall(text='', parent=self, align=uiconst.TOPLEFT, pos=(textLeft,
    789          -1,
    790          0,
    791          0), state=uiconst.UI_NORMAL)
    792         self.corpLabel = eveLabel.EveLabelSmall(text='', parent=self, align=uiconst.TOPLEFT, pos=(textLeft,
    793          20,
    794          0,
    795          0), state=uiconst.UI_NORMAL)
    796         self.allianceLabel = eveLabel.EveLabelSmall(text='', parent=self, align=uiconst.TOPLEFT, pos=(textLeft,
    797          40,
    798          0,
    799          0), state=uiconst.UI_NORMAL)
    800         self.damageLabel = eveLabel.EveLabelSmall(text='', parent=self, align=uiconst.BOTTOMLEFT, pos=(textLeft,
    801          self.bottomPadding,
    802          0,
    803          0), state=uiconst.UI_NORMAL)
    804 
    805     def Load(self, node):
    806         killer = node.killer
    807         self.allianceLabel.text = ''
    808         self.damageLabel.text = ''
    809         nameHint = ''
    810         if killer.killerID:
    811             sm.GetService('photo').GetPortrait(killer.killerID, self.BIG_LOGO_SIZE, self.killerLogo)
    812             self.killerLogo.OnClick = (self.ShowInfo, killer.killerID, inventoryConst.typeCharacter)
    813             self.killerLogo.hint = cfg.eveowners.Get(killer.killerID).name
    814         if killer.killerShipTypeID:
    815             self.shipLogo.LoadIconByTypeID(killer.killerShipTypeID, ignoreSize=True)
    816             self.shipLogo.OnClick = (self.ShowInfo, None, killer.killerShipTypeID)
    817             shipTechSprite = uix.GetTechLevelIcon(self.shipTechIcon, 0, killer.killerShipTypeID)
    818             if shipTechSprite:
    819                 shipTechSprite.SetSize(12, 12)
    820             self.shipLogo.hint = evetypes.GetName(killer.killerShipTypeID)
    821         if killer.killerWeaponTypeID:
    822             self.weaponCont.display = True
    823             self.weaponLogo.LoadIconByTypeID(killer.killerWeaponTypeID, ignoreSize=True)
    824             self.weaponLogo.OnClick = (self.ShowInfo, None, killer.killerWeaponTypeID)
    825             techSprite = uix.GetTechLevelIcon(self.weaponTechIcon, 0, killer.killerWeaponTypeID)
    826             if techSprite:
    827                 techSprite.SetSize(12, 12)
    828             self.damageLabel.text = localization.GetByLabel('UI/Corporations/Wars/Killmails/DamageDone', damage=killer.killerDamageDone, percentage=killer.percentage)
    829             self.weaponLogo.hint = '%s<br>%s' % (evetypes.GetName(killer.killerWeaponTypeID), self.damageLabel.text)
    830         else:
    831             self.weaponCont.display = False
    832         if killer.killerID:
    833             nameText = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(killer.killerID).name, info=('showinfo', inventoryConst.typeCharacter, killer.killerID))
    834             self.nameLabel.text = nameText
    835             nameHint = '%s<br>%s' % (cfg.eveowners.Get(killer.killerID).name, cfg.eveowners.Get(killer.killerCorporationID).name)
    836         else:
    837             self.nameLabel.text = evetypes.GetName(killer.killerShipTypeID)
    838         self.corpLabel.top = self.nameLabel.top + self.nameLabel.textheight - 1
    839         showInfoType = inventoryConst.typeFaction if IsFaction(int(killer.killerCorporationID)) else inventoryConst.typeCorporation
    840         self.corpLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(killer.killerCorporationID).name, info=('showinfo', showInfoType, killer.killerCorporationID))
    841         if killer.killerAllianceID:
    842             self.allianceLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(killer.killerAllianceID).name, info=('showinfo', inventoryConst.typeAlliance, killer.killerAllianceID))
    843             nameHint += '<br>%s' % cfg.eveowners.Get(killer.killerAllianceID).name
    844         elif killer.killerFactionID:
    845             self.allianceLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(killer.killerFactionID).name, info=('showinfo', inventoryConst.typeFaction, killer.killerFactionID))
    846             nameHint += '<br>%s' % cfg.eveowners.Get(killer.killerFactionID).name
    847         self.allianceLabel.top = self.corpLabel.top + self.corpLabel.textheight - 1
    848         self.killerLogo.hint = nameHint
    849 
    850     def ShowInfo(self, itemID, typeID, *args):
    851         sm.GetService('info').ShowInfo(typeID, itemID)
    852 
    853     def GetHeight(self, *args):
    854         node, _ = args
    855         node.height = KillContainerEntry.BIG_LOGO_SIZE + KillContainerEntry.bottomPadding + 2
    856         return node.height
    857 
    858 
    859 class KilledOnBehalfContainer(Container):
    860     default_height = 64
    861     default_align = uiconst.TOTOP
    862 
    863     def ApplyAttributes(self, attributes):
    864         Container.ApplyAttributes(self, attributes)
    865         self.ConstructLayout()
    866 
    867     def ConstructLayout(self):
    868         Fill(bgParent=self, color=(1.0, 0.0, 0.0, 0.2))
    869         Frame(parent=self, color=(1.0, 0.0, 0.0, 0.2))
    870         iconCont = Container(name='iconCont', parent=self, align=uiconst.TOLEFT, width=96)
    871         self.behalfCont = Container(name='behalfCont', parent=iconCont, align=uiconst.TOLEFT, width=64, state=uiconst.UI_NORMAL)
    872         self.corpCont = Container(name='corpCont', parent=iconCont, align=uiconst.TOPRIGHT, width=32, height=32)
    873         self.allianceCont = Container(name='allianceCont', parent=iconCont, align=uiconst.BOTTOMRIGHT, width=32, height=32)
    874         theRestCont = Container(name='textCont', parent=self, align=uiconst.TOALL, padLeft=defaultPadding)
    875         self.textCont = ContainerAutoSize(parent=theRestCont, name='textCont', align=uiconst.CENTERLEFT)
    876         self.nameLabel = eveLabel.EveLabelSmall(text='', parent=self.textCont, maxLines=1, align=uiconst.TOPLEFT, state=uiconst.UI_NORMAL)
    877         self.corpLabel = eveLabel.EveLabelSmall(text='', parent=self.textCont, maxLines=1, align=uiconst.TOPLEFT, state=uiconst.UI_NORMAL, top=13)
    878         self.allianceLabel = eveLabel.EveLabelSmall(text='', parent=self.textCont, maxLines=1, align=uiconst.TOPLEFT, state=uiconst.UI_NORMAL, top=26)
    879 
    880     def LoadInfo(self, behalfID, corpID, allianceID = None, factionID = None):
    881         self.behalfCont.Flush()
    882         self.corpCont.Flush()
    883         self.allianceCont.Flush()
    884         self.allianceLabel.text = ''
    885         nameHint = ''
    886         behalfName = cfg.eveowners.Get(behalfID).name
    887         corpName = cfg.eveowners.Get(corpID).name
    888         self.allianceLabel.display = True
    889         behalfLogo = Sprite(parent=self.behalfCont, align=uiconst.TOALL, idx=0, texturePath='res:/UI/Texture/silhouette_64.png')
    890         if behalfID:
    891             sm.GetService('photo').GetPortrait(behalfID, 64, behalfLogo)
    892             behalfLogo.OnClick = (self.ShowInfo, behalfID, inventoryConst.typeCharacter)
    893             behalfLogo.hint = cfg.eveowners.Get(behalfID).name
    894         if behalfID:
    895             self.nameLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=cfg.eveowners.Get(behalfID).name, info=('showinfo', inventoryConst.typeCharacter, behalfID))
    896             nameHint = '%s<br>%s' % (behalfName, corpName)
    897         corpLogo = eveIcon.GetLogoIcon(itemID=corpID, parent=self.corpCont, acceptNone=False, align=uiconst.TOPRIGHT, height=32, width=32, state=uiconst.UI_NORMAL)
    898         corpLogo.OnClick = (self.ShowInfo, corpID, inventoryConst.typeCorporation)
    899         corpLogo.hint = corpName
    900         corpLogo.SetSize(32, 32)
    901         self.corpLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=corpName, info=('showinfo', inventoryConst.typeCorporation, corpID))
    902         if allianceID:
    903             allianceName = cfg.eveowners.Get(allianceID).name
    904             self.allianceLabel.text = localization.GetByLabel('UI/Contracts/ContractsWindow/ShowInfoLink', showInfoName=allianceName, info=('showinfo', inventoryConst.typeAlliance, allianceID))
    905             nameHint += '<br>%s' % allianceName
    906             allianceLogo = eveIcon.GetLogoIcon(itemID=allianceID, parent=self.allianceCont, acceptNone=False, align=uiconst.TOPRIGHT, height=32, width=32)
    907             allianceLogo.OnClick = (self.ShowInfo, allianceID, inventoryConst.typeAlliance)
    908             allianceLogo.hint = allianceName
    909         else:
    910             self.allianceLabel.text = ''
    911             allianceLogo = Sprite(texturePath='res:/UI/Texture/defaultAlliance.dds', parent=self.allianceCont, align=uiconst.TOPLEFT, width=32, height=32, state=uiconst.UI_NORMAL)
    912             allianceLogo.hint = localization.GetByLabel('UI/PeopleAndPlaces/OwnerNotInAnyAlliance', corpName=corpName)
    913             allianceLogo.SetAlpha(0.3)
    914             self.allianceLabel.display = False
    915         behalfLogo.hint = nameHint
    916 
    917     def ShowInfo(self, itemID, typeID, *args):
    918         sm.GetService('info').ShowInfo(typeID, itemID)