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()