scrollUtil.py (5505B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\control\scrollUtil.py 2 import itertools 3 from carbonui.uiconst import SCROLLVERSION 4 from carbonui.uicore import uicore 5 from localization import GetByLabel 6 7 class TabFinder(object): 8 9 def GetTabStops(self, nodes, headertabs, entryClass, idx = None): 10 maxContentWidths = self.GetMaxContentWidths(nodes, entryClass, idx) 11 headerWidths = uicore.font.GetTabstopsAsWidth(uicore.font.MeasureTabstops(headertabs)) 12 return self.GetMaxTabStops(maxContentWidths, headerWidths) 13 14 def GetMaxContentWidths(self, nodes, entryClass, idx): 15 columnWidthsInNodes = [ entryClass.GetColWidths(node, idx) for node in nodes ] 16 columnWidthsInNodes = filter(None, columnWidthsInNodes) 17 maxContentWidths = [ max(x) for x in zip(*columnWidthsInNodes) ] 18 return maxContentWidths 19 20 def GetMaxTabStops(self, maxContentWidth, headerWidths): 21 maxColWidth = [ max(z) for z in itertools.izip_longest(*[maxContentWidth, headerWidths]) ] 22 newTabStops = self._FindMaxTabstopsFromWidths(maxColWidth) 23 return newTabStops 24 25 def _FindMaxTabstopsFromWidths(self, maxColWidth): 26 newTabStops = [] 27 currentLeft = 0 28 for eachColWidth in maxColWidth: 29 currentLeft += eachColWidth 30 newTabStops.append(currentLeft) 31 32 return newTabStops 33 34 35 class TabAdjuster(object): 36 MIN_COL_WIDTH = 30 37 38 def __init__(self, scroll, entryClass, victimIdx): 39 self._scroll = scroll 40 self._entryClass = entryClass 41 self._tabFinder = TabFinder() 42 self._victimIdx = victimIdx 43 44 def GetAdjustedTabStops(self, headertabs, idx = None): 45 scrollWidth, h = self._scroll.GetAbsoluteSize() 46 contentWidths = self._tabFinder.GetMaxContentWidths(self._scroll.sr.nodes, self._entryClass, idx=idx) 47 if idx is not None or not contentWidths: 48 return contentWidths 49 headerWidths = [ self.MIN_COL_WIDTH for x in contentWidths ] 50 if not scrollWidth: 51 return self._tabFinder.GetMaxTabStops(contentWidths, headerWidths) 52 tabStops = self._GetUserDefinedTabStops(scrollWidth, contentWidths, headerWidths) 53 if tabStops is not None: 54 return tabStops 55 adjustedContentWidth = self._AdjustVictimWidth(contentWidths, scrollWidth) 56 adjustedContentWidth = adjustedContentWidth or contentWidths 57 return self._GetTabStopsFromContentWidths(adjustedContentWidth, headerWidths) 58 59 def _GetUserDefinedTabStops(self, scrollWidth, contentWidth, headerWidths): 60 _, currentSettings = self._GetCurrentSettingsForScroll() 61 userDefinedContentWidth = [] 62 for i, headerInfo in enumerate(self._entryClass.headerInfo.itervalues()): 63 if headerInfo.fixedWidth: 64 val = headerInfo.fixedWidth 65 else: 66 calcValue = contentWidth[i] 67 val = currentSettings.get(headerInfo.columnText, calcValue) 68 if headerInfo.useTextMinWidth: 69 val = max(calcValue, val) 70 userDefinedContentWidth.append(val) 71 72 adjustedContentWidth = self._AdjustVictimWidth(userDefinedContentWidth, scrollWidth) 73 if adjustedContentWidth is None: 74 return 75 return self._GetTabStopsFromContentWidths(adjustedContentWidth, headerWidths) 76 77 def _AdjustVictimWidth(self, contentWidths, scrollWidth): 78 contentSum = sum(contentWidths) 79 if scrollWidth < contentSum: 80 victimColumnWidth = contentWidths[self._victimIdx] 81 widthWithoutVictimColumn = contentSum - victimColumnWidth 82 available = scrollWidth - widthWithoutVictimColumn 83 if available < self.MIN_COL_WIDTH: 84 return 85 contentWidths[self._victimIdx] = available 86 return contentWidths 87 88 def _GetTabStopsFromContentWidths(self, contentWidths, headerWidths): 89 self._SetScrollWidthSettings(contentWidths) 90 return self._tabFinder.GetMaxTabStops(contentWidths, headerWidths) 91 92 def _SetScrollWidthSettings(self, columnWidths): 93 currentSettings, scrollSettings = self._GetCurrentSettingsForScroll() 94 for i, headerInfo in enumerate(self._entryClass.headerInfo.itervalues()): 95 scrollSettings[headerInfo.columnText] = columnWidths[i] 96 97 settings.user.ui.Set('columnWidths_%s' % SCROLLVERSION, currentSettings) 98 99 def _GetCurrentSettingsForScroll(self): 100 currentSettings = settings.user.ui.Get('columnWidths_%s' % SCROLLVERSION, {}) 101 scrollID = self._scroll.sr.id 102 currentSettings.setdefault(scrollID, {}) 103 scrollSettings = currentSettings[scrollID] 104 return (currentSettings, scrollSettings) 105 106 107 class ColumnInfo(object): 108 109 def __init__(self, labelPath, hintPath = None, useTextMinWidth = True, fixedWidth = None): 110 self._labelPath = labelPath 111 self._hintPath = hintPath 112 self._useTextMinWidth = useTextMinWidth 113 self._fixedWidth = fixedWidth 114 115 @property 116 def columnText(self): 117 if self._labelPath > 0: 118 return GetByLabel(self._labelPath) 119 else: 120 return ' ' * abs(self._labelPath) 121 122 @property 123 def hintText(self): 124 if self._hintPath: 125 return GetByLabel(self._hintPath) 126 127 @property 128 def useTextMinWidth(self): 129 return self._useTextMinWidth 130 131 @property 132 def fixedWidth(self): 133 return self._fixedWidth