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

attributeValueRowContainer.py (5622B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\shipModuleButton\attributeValueRowContainer.py
      2 import dogma.data as dogma_data
      3 from carbon.common.script.util.format import FmtAmt
      4 from carbonui.primitives.container import Container
      5 from eve.client.script.ui.control.eveIcon import Icon
      6 from eve.client.script.ui.control.eveLabel import EveLabelSmall
      7 import carbonui.const as uiconst
      8 from eve.client.script.ui.shared.info.infoUtil import GetAttributeTooltipTitleAndDescription, GetColoredText, PrepareInfoTextForAttributeHint
      9 from eve.client.script.ui.tooltips.tooltipUtil import SetTooltipHeaderAndDescription
     10 import mathext
     11 
     12 class AttributeValueRowContainer(Container):
     13     default_iconSize = 24
     14     default_align = uiconst.TOTOP
     15     default_height = 30
     16 
     17     def ApplyAttributes(self, attributes):
     18         Container.ApplyAttributes(self, attributes)
     19         self.iconSize = attributes.get('iconSize', self.default_iconSize)
     20         self.attributeValues = attributes.attributeValues
     21         self.doWidthAdjustments = attributes.get('doWidthAdjustments', False)
     22         loadOnStartup = attributes.get('loadOnStartup', True)
     23         self.hasAdjustedWidth = False
     24         self.innerContainers = {}
     25         if loadOnStartup:
     26             self.Load(self.attributeValues)
     27 
     28     def Load(self, attributeValues, mouseExitFunc = None, onClickFunc = None, modifiedAttributesDict = {}, itemID = None):
     29         if not attributeValues:
     30             return
     31         self.attributeValues = attributeValues
     32         self.innerContainers = {}
     33         self.Flush()
     34         numDecimals = self.FindNumberOfDecimals({x[1] for x in attributeValues})
     35         containerPercentage = 1.0 / len(attributeValues)
     36         for attributeID, value in attributeValues:
     37             innerCont = Container(parent=self, name='container_%s' % attributeID, width=containerPercentage, align=uiconst.TOLEFT_PROP, clipChildren=True)
     38             self.innerContainers[attributeID] = innerCont
     39             iconCont = Container(parent=innerCont, name='iconCont', width=self.iconSize, align=uiconst.TOLEFT, state=uiconst.UI_PICKCHILDREN)
     40             icon = Icon(parent=iconCont, pos=(0,
     41              0,
     42              self.iconSize,
     43              self.iconSize), align=uiconst.CENTERLEFT, idx=0, ignoreSize=True, state=uiconst.UI_NORMAL)
     44             if mouseExitFunc:
     45                 icon.OnMouseExit = mouseExitFunc
     46             if onClickFunc:
     47                 icon.OnClick = (onClickFunc, attributeID)
     48             labelText = value or '-'
     49             modifiedAttributeInfo = modifiedAttributesDict.get(attributeID)
     50             if not isinstance(labelText, basestring):
     51                 labelText = FmtAmt(labelText, showFraction=numDecimals)
     52             if modifiedAttributeInfo:
     53                 labelText = GetColoredText(modifiedAttributeInfo, labelText)
     54             innerCont.label = EveLabelSmall(parent=innerCont, text=labelText, align=uiconst.CENTERLEFT, left=self.iconSize)
     55             PrepareInfoTextForAttributeHint(innerCont.label, modifiedAttributeInfo, itemID)
     56             attributeInfo = dogma_data.get_attribute(attributeID)
     57             iconID = attributeInfo.iconID
     58             icon.LoadIcon(iconID, ignoreSize=True)
     59             icon.hint = dogma_data.get_attribute_display_name(attributeID)
     60             tooltipTitleText, tooltipDescriptionText = GetAttributeTooltipTitleAndDescription(attributeID)
     61             if tooltipDescriptionText:
     62                 SetTooltipHeaderAndDescription(targetObject=icon, headerText=tooltipTitleText, descriptionText=tooltipDescriptionText)
     63 
     64         self._AdjustSizes()
     65 
     66     def FindNumberOfDecimals(self, values):
     67         numDecimals = None
     68         for each in values:
     69             if isinstance(each, (float, int)):
     70                 parts = unicode(each).split('.', 1)
     71                 if len(parts) > 1:
     72                     numDecimals = mathext.clamp(max(numDecimals, len(parts[1])), 0, 5)
     73 
     74         return numDecimals
     75 
     76     def _OnResize(self, *args):
     77         self._AdjustSizes()
     78 
     79     def _AdjustSizes(self):
     80         if not self.attributeValues or not self.doWidthAdjustments:
     81             return
     82         emptyAttributes = [ attributeID for attributeID, value in self.attributeValues if value is None ]
     83         nonEmptyAttributes = [ attributeID for attributeID, value in self.attributeValues if value is not None ]
     84         if not emptyAttributes or not nonEmptyAttributes:
     85             return
     86         absWidth = self.absoluteRight - self.absoluteLeft
     87         containerPercentage = 1.0 / len(self.attributeValues)
     88         defaultGivenWidth = containerPercentage * absWidth
     89         extraNeeded = 0
     90         for attributeID in nonEmptyAttributes:
     91             cont = self.innerContainers.get(attributeID)
     92             extraNeeded = max(extraNeeded, cont.label.textwidth + cont.label.left - defaultGivenWidth)
     93 
     94         if not extraNeeded and not self.hasAdjustedWidth:
     95             return
     96         percentageNeeded = extraNeeded / float(absWidth)
     97         noneEmptyWidth = containerPercentage + percentageNeeded
     98         emptyWidth = (1.0 - noneEmptyWidth * len(nonEmptyAttributes)) / len(emptyAttributes)
     99         self.SetContWidth(nonEmptyAttributes, noneEmptyWidth)
    100         self.SetContWidth(emptyAttributes, emptyWidth)
    101         if extraNeeded:
    102             self.hasAdjustedWidth = True
    103         else:
    104             self.hasAdjustedWidth = False
    105 
    106     def SetContWidth(self, attributeIDs, newValue):
    107         for attributeID in attributeIDs:
    108             cont = self.innerContainers.get(attributeID, None)
    109             if not cont:
    110                 continue
    111             cont.width = newValue