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

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