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} < {constellation} < {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)