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

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