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

OutputCont.py (9653B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\industry\views\OutputCont.py
      2 from math import pi
      3 import blue
      4 from carbon.client.script.environment.AudioUtil import PlaySound
      5 from carbonui import uiconst
      6 from carbonui.button.const import HEIGHT_NORMAL
      7 from carbonui.control.combo import Combo
      8 from carbonui.primitives.container import Container
      9 from carbonui.primitives.stretchspritehorizontal import StretchSpriteHorizontal
     10 from eve.client.script.ui.shared.industry.views.errorFrame import ErrorFrame
     11 from eve.client.script.ui.shared.industry.views.industryTooltips import CostContainerTooltipPanel, TimeContainerTooltipPanel
     12 from eve.client.script.ui.shared.industry.views.outcomeContainer import OutcomeContainer
     13 from eve.client.script.ui.shared.neocom.wallet import walletUtil
     14 from localization import GetByLabel
     15 from eve.client.script.ui.control.eveLabel import EveLabelLarge
     16 from eve.client.script.ui.shared.industry.views.industryCaptionLabel import IndustryCaptionLabel
     17 from eve.client.script.ui.shared.industry.views.outputFramedContainers import FacilityContainer, InventoryOutputContainer, InventoryInputContainer
     18 from eve.common.script.util.eveFormat import FmtISK
     19 import uthread
     20 from carbonui.uicore import uicore
     21 from uihighlighting.uniqueNameConst import UNIQUE_NAME_INDUSTRY_OUTPUT, UNIQUE_NAME_INDUSTRY_INPUT
     22 
     23 class OutputCont(Container):
     24 
     25     def ApplyAttributes(self, attributes):
     26         Container.ApplyAttributes(self, attributes)
     27         self.jobData = attributes.jobData
     28         self.ConstructTop()
     29         self.ConstructBottom()
     30         self.ConstructCenter()
     31         self.ConstructCostAndTimeLabels()
     32         self.bg = StretchSpriteHorizontal(parent=self, state=uiconst.UI_DISABLED, align=uiconst.TORIGHT_PROP, width=0.5, height=402, leftEdgeSize=400, rightEdgeSize=10, texturePath='res:/UI/Texture/Classes/Industry/Input/bg1Groups.png', rotation=pi)
     33         self.UpdateState()
     34         self.AnimEntry()
     35 
     36     def ConstructCostAndTimeLabels(self):
     37         self.labelCont = Container(name='labelCont', parent=self, align=uiconst.BOTTOMRIGHT, pos=(13,
     38          7,
     39          304,
     40          HEIGHT_NORMAL), opacity=0.0)
     41         self.timeCont = TimeContainer(parent=self.labelCont, align=uiconst.TOLEFT_PROP, width=0.45, jobData=self.jobData)
     42         self.costCont = CostContainer(parent=self.labelCont, align=uiconst.TOLEFT_PROP, width=0.55, padLeft=2)
     43 
     44     def ConstructTop(self):
     45         self.topCont = Container(name='topCont', parent=self, align=uiconst.TOPRIGHT, pos=(13, 7, 377, 87), opacity=0.0)
     46         self.facilityCont = FacilityContainer(parent=self.topCont, align=uiconst.TOPRIGHT)
     47         self.invInputCont = InventoryInputContainer(parent=self.topCont, align=uiconst.BOTTOMRIGHT, opacity=0.0, uniqueUiName=UNIQUE_NAME_INDUSTRY_INPUT)
     48 
     49     def ConstructBottom(self):
     50         self.bottomCont = Container(name='bottomCont', parent=self, align=uiconst.BOTTOMRIGHT, pos=(0, 39, 377, 60), opacity=0.0)
     51         self.invOutputCont = InventoryOutputContainer(parent=self.bottomCont, align=uiconst.CENTERRIGHT, left=13, uniqueUiName=UNIQUE_NAME_INDUSTRY_OUTPUT)
     52 
     53     def ConstructCenter(self):
     54         self.outcomeCont = OutcomeContainer(name='outcomeCont', parent=self, align=uiconst.CENTERRIGHT, opacity=0.0)
     55 
     56     def OnRunsChanged(self):
     57         self.UpdateState()
     58         self.outcomeCont.OnRunsChanged()
     59 
     60     def OnNewJobData(self, jobData):
     61         self.jobData = jobData
     62         self.facilityCont.OnNewJobData(jobData)
     63         self.invOutputCont.OnNewJobData(jobData)
     64         self.invInputCont.OnNewJobData(jobData)
     65         self.outcomeCont.OnNewJobData(jobData)
     66         self.timeCont.OnNewJobData(jobData)
     67         self.costCont.OnNewJobData(jobData)
     68         self.UpdateState()
     69         self.AnimEntry()
     70 
     71     def UpdateState(self):
     72         self.state = uiconst.UI_DISABLED if self.jobData is None else uiconst.UI_PICKCHILDREN
     73         self.costCont.UpdateState()
     74         self.timeCont.UpdateState()
     75 
     76     def AnimEntry(self):
     77         if self.jobData:
     78             toFadeIn = (self.outcomeCont,
     79              self.topCont,
     80              self.bottomCont,
     81              self.invInputCont,
     82              self.labelCont)
     83             for obj in toFadeIn:
     84                 uicore.animations.FadeIn(obj)
     85 
     86             uicore.animations.FadeTo(self.bg, 0.0, 1.0, duration=0.6, timeOffset=0.1)
     87         else:
     88             toFadeOut = (self.outcomeCont,
     89              self.topCont,
     90              self.bottomCont,
     91              self.invInputCont,
     92              self.labelCont)
     93             for obj in toFadeOut:
     94                 uicore.animations.FadeOut(obj)
     95 
     96 
     97 class TimeContainer(Container):
     98     default_state = uiconst.UI_NORMAL
     99 
    100     def ApplyAttributes(self, attributes):
    101         Container.ApplyAttributes(self, attributes)
    102         self.jobData = None
    103         self.updateTimeThread = None
    104         self.timeCaption = IndustryCaptionLabel(name='timeCaption', parent=self)
    105         self.timeLabel = EveLabelLarge(name='timeLabel', parent=self, top=13)
    106         self.errorFrame = ErrorFrame(bgParent=self, padding=(-2, -2, 0, -2))
    107 
    108     def UpdateState(self):
    109         if self.updateTimeThread:
    110             self.updateTimeThread.kill()
    111             self.updateTimeThread = None
    112         if not self.jobData:
    113             self.timeLabel.text = ''
    114             return
    115         if self.jobData.IsInstalled():
    116             self.timeCaption.text = GetByLabel('UI/Industry/TimeLeft')
    117             self.updateTimeThread = uthread.new(self.UpdateTimeThread)
    118         else:
    119             self.timeCaption.text = GetByLabel('UI/Industry/JobDuration')
    120             self.timeLabel.text = self.jobData.GetJobTimeLeftLabel()
    121 
    122     def UpdateTimeThread(self):
    123         while not self.destroyed:
    124             self.timeLabel.text = self.jobData.GetJobTimeLeftLabel()
    125             blue.synchro.SleepWallclock(200)
    126 
    127     def OnNewJobData(self, jobData):
    128         self.jobData = jobData
    129         self.UpdateState()
    130 
    131     def LoadTooltipPanel(self, tooltipPanel, *args):
    132         TimeContainerTooltipPanel(jobData=self.jobData, tooltipPanel=tooltipPanel)
    133 
    134     def GetTooltipPosition(self):
    135         return self.timeCaption.GetAbsolute()
    136 
    137     def OnMouseEnter(self, *args):
    138         PlaySound(uiconst.SOUND_BUTTON_HOVER)
    139 
    140 
    141 WALLET_PERSONAL = 1
    142 WALLET_CORP = 2
    143 
    144 class CostContainer(Container):
    145     default_state = uiconst.UI_NORMAL
    146     default_padLeft = 4
    147 
    148     def ApplyAttributes(self, attributes):
    149         Container.ApplyAttributes(self, attributes)
    150         self.jobData = None
    151         self.costCaption = IndustryCaptionLabel(name='costCaption', parent=self, align=uiconst.TOTOP, text=GetByLabel('UI/Industry/JobCost'))
    152         textCont = Container(parent=self)
    153         self.walletCombo = Combo(name='walletCombo', parent=textCont, align=uiconst.TOLEFT, state=uiconst.UI_HIDDEN, callback=self.OnWalletCombo, iconOnly=True, width=48, top=1)
    154         self.walletCombo.GetHint = self.GetWalletComboHint
    155         self.costLabel = EveLabelLarge(name='costLabel', parent=textCont, align=uiconst.TOTOP, padLeft=4)
    156         self.errorFrame = ErrorFrame(bgParent=self, padding=(0, -2, 0, -2))
    157 
    158     def UpdateWalletCombo(self):
    159         if not self.jobData or not self.jobData.accounts or len(self.jobData.accounts) <= 1:
    160             self.walletCombo.Hide()
    161             return
    162         self.walletCombo.Show()
    163         options = []
    164         for ownerID, divisionID in sorted(self.jobData.accounts):
    165             label = self.GetWalletName(ownerID, divisionID)
    166             texturePath = self.GetWalletIcon(ownerID)
    167             options.append((label,
    168              (ownerID, divisionID),
    169              None,
    170              texturePath))
    171 
    172         self.walletCombo.LoadOptions(options)
    173         if self.jobData:
    174             self.walletCombo.SelectItemByValue(self.jobData.account)
    175 
    176     def OnWalletCombo(self, combo, key, value):
    177         self.jobData.account = value
    178 
    179     def OnMouseEnter(self, *args):
    180         PlaySound(uiconst.SOUND_BUTTON_HOVER)
    181 
    182     def GetWalletName(self, ownerID, divisionID):
    183         if ownerID == session.charid:
    184             return GetByLabel('UI/Industry/PersonalWallet')
    185         else:
    186             divisionName = walletUtil.GetDivisionName(divisionID)
    187             return GetByLabel('UI/Industry/CorporateWallet', divisionName=divisionName)
    188 
    189     def GetWalletIcon(self, ownerID):
    190         if ownerID == session.charid:
    191             return 'res:/UI/Texture/Classes/Industry/iconPersonal.png'
    192         else:
    193             return 'res:/UI/Texture/Classes/Industry/iconCorp.png'
    194 
    195     def GetWalletComboHint(self):
    196         ownerID, divisionID = self.jobData.account
    197         iskAmount = self.jobData.accounts[ownerID, divisionID]
    198         iskAmount = FmtISK(iskAmount)
    199         walletName = self.GetWalletName(ownerID, divisionID)
    200         return GetByLabel('UI/Industry/WalletSelectionHint', walletName=walletName, iskAmount=iskAmount)
    201 
    202     def OnNewJobData(self, jobData):
    203         self.jobData = jobData
    204         self.UpdateState()
    205 
    206     def UpdateState(self):
    207         if not self.jobData:
    208             self.costLabel.text = ''
    209             self.walletCombo.Hide()
    210             return
    211         if self.jobData.facility and self.jobData.activityID in self.jobData.facility.activities:
    212             manufacturingCost = self.jobData.total_cost
    213             self.costLabel.text = FmtISK(manufacturingCost, showFractionsAlways=False)
    214         else:
    215             self.costLabel.text = '-'
    216         self.UpdateWalletCombo()
    217 
    218     def LoadTooltipPanel(self, tooltipPanel, *args):
    219         if self.jobData.facility:
    220             CostContainerTooltipPanel(jobData=self.jobData, tooltipPanel=tooltipPanel)
    221 
    222     def GetTooltipPosition(self):
    223         return self.costCaption.GetAbsolute()