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