offerBrowser.py (7958B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\itemTrader\offerBrowser.py 2 from collections import defaultdict 3 import eveicon 4 import evetypes 5 from carbonui import TextColor 6 from carbonui.button.menu import MenuButtonIcon 7 from carbonui.control.buttonIcon import ButtonIcon 8 from carbonui.control.contextMenu.menuData import MenuData 9 from carbonui.control.scroll import Scroll 10 from carbonui.primitives.container import Container 11 from carbonui.util.sortUtil import SortListOfTuples 12 from eve.client.script.ui import eveColor 13 from eve.client.script.ui.control.entries.generic import Generic 14 from eve.client.script.ui.control.entries.util import GetFromClass 15 from eve.client.script.ui.control.listgroup import ListGroup 16 from eve.client.script.ui.inflight.itemTrader.recipeUtil import LoadRecipeTooltipPanel, GetRecipeGroupName, GetRecipeGroupTexturepath 17 from eve.client.script.ui.quickFilter import QuickFilterEdit 18 from localization import GetByLabel 19 from carbonui.uicore import uicore 20 import blue 21 import carbonui.const as uiconst 22 23 class OfferBrowser(Container): 24 default_clipChildren = True 25 26 def ApplyAttributes(self, attributes): 27 self.item_trader = attributes.item_trader 28 self.itemTraderController = attributes.itemTraderController 29 super(OfferBrowser, self).ApplyAttributes(attributes) 30 self.searchparent = SearchCont(name='searchparent', parent=self, align=uiconst.TOTOP, top=4, itemTraderController=self.itemTraderController, searchFunc=self.Search, collapseFunc=self.CollapseGroups) 31 self.scroll = Scroll(parent=self) 32 self.LoadRecipes() 33 self.OpenOnRecipeID(self.itemTraderController.selectedRecipe.recipeID) 34 35 def LoadRecipes(self): 36 scrollList = self.GetScrollList() 37 self.scroll.Load(contentList=scrollList) 38 39 def GetScrollList(self): 40 scrollList = [] 41 outputByGroups = defaultdict(list) 42 for recipeID, recipe in self.itemTraderController.GetRecipes().iteritems(): 43 if self.itemTraderController.IsFilteredOut(recipe): 44 continue 45 outputByGroups[recipe.groupID].append(recipe) 46 47 if len(outputByGroups) == 1: 48 recipeList = outputByGroups.values()[0] 49 return self.GetFlatRecipeScrollList(recipeList, 0) 50 for groupID, recipeList in outputByGroups.iteritems(): 51 groupName = GetRecipeGroupName(groupID) 52 groupTexturePath = GetRecipeGroupTexturepath(groupID) 53 recipeIDs = {x.recipeID for x in recipeList} 54 entry = GetFromClass(ListGroup, {'GetSubContent': self.GetRecipeSubContent, 55 'label': groupName, 56 'id': ('recipeGroupList', groupID), 57 'state': 'locked', 58 'BlockOpenWindow': 1, 59 'showicon': groupTexturePath, 60 'iconColor': TextColor.NORMAL, 61 'showlen': 1, 62 'groupItems': recipeList, 63 'typeGroupID': groupID, 64 'recipeIDs': recipeIDs}) 65 scrollList.append((groupName.lower(), entry)) 66 67 scrollList = SortListOfTuples(scrollList) 68 return scrollList 69 70 def GetRecipeSubContent(self, nodedata, *args): 71 recipeList = nodedata.groupItems 72 scrollList = self.GetFlatRecipeScrollList(recipeList, 1) 73 return scrollList 74 75 def GetFlatRecipeScrollList(self, recipeList, sublevel): 76 scrollList = [] 77 for recipe in recipeList: 78 affordable = self.itemTraderController.IsRecipeAffordable(recipe) 79 recipeName, sortValue = recipe.GetRecipeNameAndSortValue() 80 data = {'label': recipeName, 81 'OnClick': self.OnEntryClicked, 82 'recipe': recipe, 83 'sublevel': sublevel, 84 'recipeID': recipe.recipeID, 85 'affordable': affordable, 86 'labelColor': TextColor.NORMAL if affordable else eveColor.DANGER_RED} 87 scrollList.append((sortValue, GetFromClass(RecipeEntry, data))) 88 89 scrollList = SortListOfTuples(scrollList) 90 return scrollList 91 92 def _GetRecipeNameAndSortValueInGroup(self, recipe): 93 inputLabels = [] 94 for typeID, quantity in recipe.outputItems.iteritems(): 95 typeName = evetypes.GetName(typeID) 96 if quantity > 1: 97 text = GetByLabel('UI/Inventory/QuantityAndName', quantity=quantity, name=typeName) 98 else: 99 text = typeName 100 internalSortValue = (typeName, quantity) 101 inputLabels.append((internalSortValue, text)) 102 103 sortedListWithSortValues = sorted(inputLabels, key=lambda data: data[0]) 104 sortedInputLabels = [ item[1] for item in sortedListWithSortValues ] 105 sortValueForEntry = [ item[0] for item in sortedListWithSortValues ] 106 return (', '.join(sortedInputLabels), sortValueForEntry) 107 108 def OnEntryClicked(self, entry, *args): 109 node = entry.sr.node 110 self.itemTraderController.selectedRecipe = node.recipe 111 112 def OpenOnRecipeID(self, recipeID, *args): 113 for node in self.scroll.GetNodes(): 114 if recipeID in node.get('recipeIDs', []): 115 if self.scroll.scrollingRange: 116 position = node.scroll_positionFromTop / float(self.scroll.scrollingRange) 117 self.scroll.ScrollToProportion(position, threaded=False) 118 if not node.open: 119 if node.panel is not None: 120 node.panel.OnClick(openGroup=False) 121 else: 122 uicore.registry.SetListGroupOpenState(node.id, True) 123 blue.synchro.Yield() 124 return self.OpenOnRecipeID(recipeID) 125 elif node.get('recipeID', None) == recipeID: 126 self.scroll.SelectNode(node) 127 break 128 129 def CollapseGroups(self, *args): 130 self.scroll.CollapseAll() 131 132 def Search(self, searchString): 133 self.itemTraderController.searchString = searchString 134 self.LoadRecipes() 135 136 137 class RecipeEntry(Generic): 138 139 def Load(self, node): 140 super(RecipeEntry, self).Load(node) 141 labelColor = node.get('labelColor', TextColor.NORMAL) 142 self.sr.label.SetTextColor(labelColor) 143 144 def LoadTooltipPanel(self, tooltipPanel, *args): 145 node = self.sr.node 146 recipe = node.recipe 147 LoadRecipeTooltipPanel(tooltipPanel, recipe) 148 149 150 class SearchCont(Container): 151 default_height = 36 152 153 def ApplyAttributes(self, attributes): 154 super(SearchCont, self).ApplyAttributes(attributes) 155 self.itemTraderController = attributes.itemTraderController 156 self.searchFunc = attributes.searchFunc 157 self.collapseFunc = attributes.collapseFunc 158 ButtonIcon(name='collapse', parent=self, align=uiconst.CENTERLEFT, pos=(0, 0, 24, 24), iconSize=12, texturePath='res:/UI/Texture/classes/Scroll/Collapse.png', func=self.CollapseAll, hint=GetByLabel('UI/Common/Buttons/CollapseAll')) 159 MenuButtonIcon(parent=self, align=uiconst.CENTERLEFT, pos=(24, 0, 24, 24), iconSize=16, texturePath=eveicon.filter, get_menu_func=self.GeFilterMenu, hint=GetByLabel('UI/Generic/Filters')) 160 self.searchInput = QuickFilterEdit(name='searchField', parent=self, setvalue='', hintText=GetByLabel('UI/Common/Search'), padLeft=52, padRight=4, maxLength=64, align=uiconst.TOTOP, OnClearFilter=self.Search, isTypeField=True) 161 self.searchInput.OnReturn = self.Search 162 self.searchInput.ReloadFunction = self.Search 163 164 def Search(self): 165 searchString = self.searchInput.GetValue() 166 self.searchFunc(searchString) 167 168 def CollapseAll(self, *args): 169 if self.collapseFunc: 170 self.collapseFunc() 171 172 def GeFilterMenu(self): 173 menu = MenuData() 174 menu.AddCheckbox(text=GetByLabel('UI/Inflight/SpaceComponents/ItemTrader/OnlyShowAffordableTrades'), setting=self.itemTraderController.affordableSetting) 175 return menu