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

itemTraderNewWindow.py (14400B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\itemTrader\itemTraderNewWindow.py
      2 import carbonui.const as uiconst
      3 import carbonui.text.styles
      4 import eveformat
      5 import evetypes
      6 from carbon.common.script.sys.serviceConst import ROLE_PROGRAMMER
      7 from carbon.common.script.util.format import FmtAmt
      8 from carbonui import TextColor
      9 from carbonui.control.dragResizeCont import DragResizeCont
     10 from carbonui.control.singlelineedits.singleLineEditInteger import SingleLineEditInteger
     11 from carbonui.control.window import Window
     12 from carbonui.control.button import Button
     13 from carbonui.primitives.container import Container
     14 from carbonui.primitives.gradientSprite import GradientSprite, GradientConst
     15 from carbonui.decorative.panelUnderlay import PanelUnderlay
     16 from carbonui.primitives.sprite import Sprite
     17 from carbonui.control.scrollContainer import ScrollContainer
     18 from carbonui.primitives.line import Line
     19 from carbonui.uianimations import animations
     20 from eve.client.script.ui import eveColor
     21 from eve.client.script.ui.control.collapseLine import ANIM_DURATION, CollapseLine
     22 from eve.client.script.ui.inflight.itemTrader.confirmWnd import ItemTraderDialogPopupWindow
     23 from eve.client.script.ui.inflight.itemTrader.itemTraderController import ItemTraderController
     24 from eve.client.script.ui.inflight.itemTrader.offerBrowser import OfferBrowser
     25 from eve.client.script.ui.inflight.itemTrader.outputCont import ItemTraderOutputCont
     26 from eve.client.script.ui.inflight.itemTrader.topBanner import TopBanner
     27 from eveexceptions import ExceptionEater
     28 from eveservices.menu import GetMenuService
     29 from localization import GetByLabel
     30 from signals.signalUtil import ChangeSignalConnect
     31 import carbonui
     32 
     33 class ItemTraderWindow(Window):
     34     __guid__ = 'form.ItemTraderWindow'
     35     __notifyevents__ = ['OnItemTraderProcessed']
     36     default_minSize = [620, 375]
     37     default_windowID = 'itemTrader'
     38     default_captionLabelPath = 'UI/Inflight/SpaceComponents/ItemTrader/ItemTrader'
     39     default_isStackable = False
     40     default_isCollapseable = False
     41     input_isk = 0
     42     multiplier = 0
     43     input_container = None
     44     output_container = None
     45     trade_items_action_button = None
     46     quantity_numeric_input = None
     47 
     48     def ApplyAttributes(self, attributes):
     49         Window.ApplyAttributes(self, attributes)
     50         self.item_trader = attributes.item_trader
     51         self.itemTraderController = ItemTraderController(self.item_trader)
     52         self.ConstructContainers()
     53         self.UpdateMinSize()
     54         self.LoadRecipe()
     55         self.ChangeSignalConnection()
     56 
     57     def ChangeSignalConnection(self, connect = True):
     58         signalAndCallback = [(self.itemTraderController.on_recipe_clicked, self.OnRecipeClicked),
     59          (self.itemTraderController.affordableSetting.on_change, self.OnFilterChanged),
     60          (self.collapseLine.on_section_expand, self.OnCollapseLineExpand),
     61          (self.collapseLine.on_section_collapse, self.OnCollapseLineCollapse)]
     62         ChangeSignalConnect(signalAndCallback, connect)
     63 
     64     def OnItemTraderProcessed(self, itemID, recipe):
     65         if itemID != self.item_trader.itemID:
     66             return
     67         self.LoadRecipe(recipe)
     68 
     69     def ConstructContainers(self):
     70         action_container = Container(name='actionContainer', parent=self.content, height=51, align=uiconst.TOBOTTOM)
     71         self.resizeCont = DragResizeCont(name='resizeCont', parent=self.content, align=uiconst.TOLEFT, minSize=0, maxSize=300, defaultSize=200, onDragCallback=self.OnDividerMove, onResizeCallback=self.OnResizeDivider, settingsID='itemTraderBrowserWidth')
     72         self.leftPanel = PanelUnderlay(name='leftPanelUnderLay', parent=self.resizeCont, align=uiconst.TOALL)
     73         self.offerBrowser = OfferBrowser(parent=self.leftPanel, item_trader=self.item_trader, itemTraderController=self.itemTraderController)
     74         singleOffer = len(self.itemTraderController.GetRecipes()) < 2
     75         self.collapseLine = CollapseLine(parent=self.content, align=uiconst.TOLEFT, collapsingSection=self.resizeCont, collapsingSectionWidth=self.resizeCont.width, isCollapsed=singleOffer or None, padRight=8, settingKey='item_trader_collapse')
     76         if singleOffer:
     77             self.collapseLine.display = False
     78             self.leftPanel.display = False
     79         self.topBanner = TopBanner(parent=self.content, itemTraderController=self.itemTraderController)
     80         self.mainContent = Container(name='mainContent', parent=self.content, align=uiconst.TOALL, clipChildren=True)
     81         body_container = Container(name='bodyContainer', parent=self.mainContent, height=208, align=uiconst.VERTICALLY_CENTERED)
     82         OUTPUT_WIDTH = 280
     83         self.input_container = ScrollContainer(name='input_container', parent=body_container, padRight=OUTPUT_WIDTH)
     84         self.output_containerParent = ItemTraderOutputCont(name='output_containerParent', parent=body_container, padding=(0, 0, 0, 0), align=uiconst.TORIGHT_NOPUSH, pos=(-30,
     85          0,
     86          OUTPUT_WIDTH,
     87          10), itemTraderController=self.itemTraderController)
     88         Line(parent=action_container, align=uiconst.TOTOP)
     89         action_inner_container = Container(name='tradeActionInnerContainer', parent=action_container, padding=8)
     90         quantity_numeric_input_container = Container(parent=action_inner_container, align=uiconst.TORIGHT, width=80)
     91         self.quantity_numeric_input = SingleLineEditInteger(parent=quantity_numeric_input_container, name='', width=60, align=uiconst.CENTERRIGHT, OnChange=self.OnNumericInputChange, dataType=int)
     92         numTradesCont = Container(parent=action_inner_container, align=uiconst.TORIGHT, width=100)
     93         input_label = carbonui.text.styles.TextBody(parent=numTradesCont, text=GetByLabel('UI/Inflight/SpaceComponents/ItemTrader/NumTrades'), align=uiconst.CENTERRIGHT, color=TextColor.SECONDARY)
     94         self.trade_items_action_button = Button(name='tradeItemsActionButton', parent=action_inner_container, label=GetByLabel('UI/Inflight/SpaceComponents/ItemTrader/TradeItems'), align=uiconst.CENTERRIGHT, func=self.OnButtonTradeItemsClicked)
     95         quantity_numeric_input_container.left = self.trade_items_action_button.width + 16
     96 
     97     def OnFilterChanged(self, *args):
     98         self.offerBrowser.LoadRecipes()
     99 
    100     def OnRecipeClicked(self, recipe):
    101         self.LoadRecipe(recipe)
    102 
    103     def LoadRecipe(self, recipe = None):
    104         if recipe is None:
    105             recipe = self.itemTraderController.selectedRecipe
    106         self.itemTraderController.UpdateCargoQty()
    107         self.multiplier = 1
    108         self.AddInputItems(recipe)
    109         self.AddOutputItems(recipe)
    110         self.topBanner.LoadRecipe(recipe)
    111         self.quantity_numeric_input.SetValue(self.multiplier)
    112         maxValue = self.itemTraderController.GetInputMaxMultiplier() or 1
    113         self.quantity_numeric_input.SetMaxValue(maxValue)
    114         self.UpdateBtnState()
    115 
    116     def AddInputItems(self, recipe):
    117         item_height = 60
    118         items = recipe.inputItems
    119         self.input_container.Flush()
    120         self.input_entries = {}
    121         input_label_padding_top = 12
    122         if len(items) == 1:
    123             input_label_padding_top = 46
    124         input_label = carbonui.text.styles.TextBody(parent=self.input_container, text=GetByLabel('UI/Inflight/SpaceComponents/ItemTrader/RequiredItems'), padding=(20,
    125          input_label_padding_top,
    126          20,
    127          6), align=uiconst.TOTOP, color=TextColor.SECONDARY)
    128         for type_id, quantity in items.iteritems():
    129             item_quantity = self.multiplier * quantity
    130             item_container = InputEntry(parent=self.input_container, itemTraderController=self.itemTraderController, type_id=type_id, qty=item_quantity, height=item_height)
    131             self.input_entries[type_id] = item_container
    132 
    133     def AddOutputItems(self, recipe):
    134         outputs = recipe.outputItems
    135         outputItemsAndQty = []
    136         for type_id, qty in outputs.iteritems():
    137             outputItemsAndQty.append((type_id, self.multiplier * qty))
    138 
    139         self.output_containerParent.AddOutputItems(outputItemsAndQty)
    140 
    141     def UpdateBtnState(self):
    142         maxMultiplier = self.itemTraderController.GetInputMaxMultiplier()
    143         if maxMultiplier <= 0:
    144             self.trade_items_action_button.disabled = True
    145             self.trade_items_action_button.hint = GetByLabel('UI/Inflight/SpaceComponents/ItemTrader/MissingRequiredItems')
    146         elif self.multiplier == 0:
    147             self.trade_items_action_button.disabled = True
    148         else:
    149             self.trade_items_action_button.disabled = False
    150             self.trade_items_action_button.hint = ''
    151 
    152     def OnNumericInputChange(self, *args):
    153         self.multiplier = self.quantity_numeric_input.GetValue()
    154         current_recipe = self.itemTraderController.selectedRecipe
    155         for type_id, qty in current_recipe.inputItems.iteritems():
    156             inputEntry = self.input_entries.get(type_id)
    157             if inputEntry:
    158                 inputEntry.UpdateQty(self.multiplier * qty)
    159 
    160         for type_id, qty in current_recipe.outputItems.iteritems():
    161             self.output_containerParent.UpdateQty(type_id, self.multiplier * qty)
    162 
    163         self.UpdateBtnState()
    164 
    165     def OnButtonTradeItemsClicked(self, *args):
    166         wnd = ItemTraderDialogPopupWindow.GetIfOpen(windowInstanceID=self.item_trader.itemID)
    167         if wnd and not wnd.destroyed:
    168             wnd.LoadItemAndPayoutContainers(self.multiplier, self.itemTraderController.selectedRecipe)
    169             wnd.Maximize()
    170             return
    171         ItemTraderDialogPopupWindow.Open(windowInstanceID=self.item_trader.itemID, item_trader=self.item_trader, multiplier=self.multiplier, recipe=self.itemTraderController.selectedRecipe)
    172 
    173     def Close(self, setClosed = False, *args, **kwds):
    174         with ExceptionEater('Closing Item trader window'):
    175             wnd = ItemTraderDialogPopupWindow.GetIfOpen(windowInstanceID=self.item_trader.itemID)
    176             if wnd:
    177                 wnd.Close()
    178             self.ChangeSignalConnection(False)
    179             self.itemTraderController = None
    180         super(ItemTraderWindow, self).Close(setClosed, *args, **kwds)
    181 
    182     def OnCollapseLineExpand(self, animate):
    183         newWidth = self.width + self.collapseLine.collapsingSectionSize
    184         animations.MorphScalar(self, 'width', self.width, newWidth, duration=ANIM_DURATION)
    185         self.UpdateMinSize()
    186 
    187     def UpdateMinSize(self):
    188         if not self.collapseLine.display:
    189             return
    190         if self.collapseLine.isCollapsed:
    191             newMinWidth = self.default_minSize[0]
    192         else:
    193             newMinWidth = self.default_minSize[0] + self.collapseLine.collapsingSectionSize
    194         self.SetMinSize([newMinWidth, self.default_minSize[1]])
    195 
    196     def OnCollapseLineCollapse(self, animate):
    197         newWidth = self.width - self.collapseLine.collapsingSectionSize
    198         animations.MorphScalar(self, 'width', self.width, newWidth, duration=ANIM_DURATION)
    199         self.UpdateMinSize()
    200 
    201     def OnDividerMove(self, *args):
    202         if self.itemTraderController.tempWndWidth is None:
    203             self.resizeCont.minSize = 100
    204             self.itemTraderController.tempWndWidth = self.width - self.resizeCont.width
    205         self.width = self.itemTraderController.tempWndWidth + self.resizeCont.width
    206         self.collapseLine.SetCollapsingSectionSize(self.resizeCont.width)
    207 
    208     def OnResizeDivider(self, *args):
    209         self.itemTraderController.tempWndWidth = None
    210         self.resizeCont.minSize = 0
    211         self.UpdateMinSize()
    212 
    213     def GetMenuMoreOptions(self):
    214         menu_data = super(ItemTraderWindow, self).GetMenuMoreOptions()
    215         if session.role & ROLE_PROGRAMMER:
    216             menu_data.AddEntry('QA Reload', lambda : self.Reload(self))
    217         return menu_data
    218 
    219 
    220 class InputEntry(Container):
    221     default_align = uiconst.TOTOP
    222     default_state = uiconst.UI_NORMAL
    223 
    224     def ApplyAttributes(self, attributes):
    225         super(InputEntry, self).ApplyAttributes(attributes)
    226         self.type_id = attributes.type_id
    227         self.itemTraderController = attributes.itemTraderController
    228         item_quantity = attributes.item_quantity
    229         self.ConstructUI(item_quantity)
    230 
    231     def ConstructUI(self, item_quantity):
    232         typeName = evetypes.GetName(self.type_id)
    233         GradientSprite(bgParent=self, rgbData=[(1.0, (1, 1, 1))], alphaData=[(0, 0.05), (0.9, 0.05), (1.0, 0)], alphaInterp=GradientConst.INTERP_LINEAR, colorInterp=GradientConst.INTERP_LINEAR, padTop=2, padBottom=2)
    234         item_icon_container = Container(parent=self, align=uiconst.TOLEFT, padLeft=12, width=60)
    235         item_icon = Sprite(name='Item logo', parent=item_icon_container, align=uiconst.CENTER, height=40, width=40)
    236         sm.GetService('photo').GetIconByType(item_icon, self.type_id)
    237         item_numeric_input_container = Container(name='item_numeric_input_container', parent=self, align=uiconst.TORIGHT, padRight=40, width=50)
    238         self.item_quantity_label = carbonui.text.styles.TextBody(parent=item_numeric_input_container, text=FmtAmt(item_quantity), align=uiconst.CENTERRIGHT)
    239         item_label_container = Container(parent=self, align=uiconst.TOALL)
    240         item_label = carbonui.text.styles.TextBody(name='item_label', parent=item_label_container, text=typeName, align=uiconst.CENTERLEFT, autoFadeSides=16)
    241 
    242     def UpdateQty(self, qty):
    243         qtyInCargo = self.itemTraderController.GetCargoQtyForTypeID(self.type_id)
    244         qtyText = FmtAmt(qty)
    245         if qtyInCargo < qty:
    246             newColor = eveColor.DANGER_RED
    247             qtyText = eveformat.color(qtyText, newColor)
    248         self.item_quantity_label.SetText(qtyText)
    249 
    250     def GetMenu(self):
    251         return GetMenuService().GetMenuFromItemIDTypeID(None, self.type_id, includeMarketDetails=True)
    252 
    253     def LoadTooltipPanel(self, tooltipPanel, *args):
    254         tooltipPanel.LoadStandardSpacing()
    255         tooltipPanel.columns = 2
    256         typeIcon = Sprite(parent=tooltipPanel, align=uiconst.CENTERLEFT, pos=(0, 0, 20, 20))
    257         sm.GetService('photo').GetIconByType(typeIcon, self.type_id)
    258         tooltipPanel.AddTextBodyLabel(text=evetypes.GetName(self.type_id))
    259         tooltipPanel.FillRow()
    260         amountInCargo = self.itemTraderController.GetCargoQtyForTypeID(self.type_id)
    261         text = GetByLabel('UI/Inflight/SpaceComponents/ItemTrader/UnitsInCargo', numUnits=FmtAmt(amountInCargo))
    262         tooltipPanel.AddTextBodyLabel(text=text, colSpan=tooltipPanel.columns)
    263         tooltipPanel.FillRow()