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

gridcontainer.py (5931B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\primitives\gridcontainer.py
      2 import math
      3 from carbonui import uiconst
      4 from carbonui.uicore import uicore
      5 from carbonui.primitives.container import Container
      6 from carbonui.primitives.base import Base
      7 
      8 class GridContainer(Container):
      9     __guid__ = 'uicls.GridContainer'
     10     default_name = 'gridContainer'
     11     default_columns = 0
     12     default_lines = 0
     13     default_contentSpacing = (0, 0)
     14 
     15     def ApplyAttributes(self, attributes):
     16         Container.ApplyAttributes(self, attributes)
     17         self.columns = attributes.get('columns', self.default_columns)
     18         self.lines = attributes.get('lines', self.default_lines)
     19         self.contentSpacing = attributes.get('contentSpacing', self.default_contentSpacing)
     20 
     21     @property
     22     def lines(self):
     23         return self._lines
     24 
     25     @lines.setter
     26     def lines(self, value):
     27         self._lines = value
     28         self.FlagMyChildrenAlignmentDirty()
     29 
     30     @property
     31     def columns(self):
     32         return self._columns
     33 
     34     @columns.setter
     35     def columns(self, value):
     36         self._columns = value
     37         self.FlagMyChildrenAlignmentDirty()
     38 
     39     def FlagMyChildrenAlignmentDirty(self):
     40         self.FlagAlignmentDirty()
     41         for each in self.children:
     42             each._alignmentDirty = True
     43 
     44     def UpdateAlignment(self, budgetLeft = 0, budgetTop = 0, budgetWidth = 0, budgetHeight = 0, updateChildrenOnly = False):
     45         if self.destroyed:
     46             return (budgetLeft,
     47              budgetTop,
     48              budgetWidth,
     49              budgetHeight,
     50              False)
     51         forceUpdate = self._forceUpdateAlignment
     52         if updateChildrenOnly:
     53             childrenDirty = True
     54             sizeChange = False
     55         else:
     56             budgetLeft, budgetTop, budgetWidth, budgetHeight, sizeChange = Base.UpdateAlignment(self, budgetLeft, budgetTop, budgetWidth, budgetHeight)
     57             childrenDirty = self._childrenAlignmentDirty
     58         self._childrenAlignmentDirty = False
     59         numChildren = len(self.children)
     60         if numChildren and (childrenDirty or forceUpdate or sizeChange):
     61             numColumns, numLines = self._GetNumColumnsAndLines(numChildren)
     62             spacingX = uicore.ScaleDpi(self.contentSpacing[0])
     63             spacingY = uicore.ScaleDpi(self.contentSpacing[1])
     64             if numColumns > 0:
     65                 totalSpacingX = (numColumns - 1) * spacingX
     66                 cellWidth = max(0, (self.displayWidth - totalSpacingX) / float(numColumns))
     67             else:
     68                 cellWidth = 0
     69             if numLines > 0:
     70                 totalSpacingY = (numLines - 1) * spacingY
     71                 cellHeight = max(0, (self.displayHeight - totalSpacingY) / float(numLines))
     72             else:
     73                 cellHeight = 0
     74             cellTop = 0
     75             for lineIdx in xrange(numLines):
     76                 cellLeft = 0
     77                 padTop = spacingY if lineIdx > 0 and lineIdx < numLines else 0
     78                 yPaddingSoFar = padTop * lineIdx
     79                 cellBottom = int(cellHeight * (lineIdx + 1)) + yPaddingSoFar
     80                 for columnIdx in xrange(numColumns):
     81                     ix = lineIdx * numColumns + columnIdx
     82                     if ix < numChildren:
     83                         padLeft = spacingX if columnIdx > 0 and columnIdx < numColumns else 0
     84                         xPaddingSoFar = padLeft * columnIdx
     85                         cellRight = min(self.displayWidth, int(cellWidth * (columnIdx + 1)) + xPaddingSoFar)
     86                         budget = (cellLeft + padLeft,
     87                          cellTop + padTop,
     88                          cellWidth,
     89                          cellHeight)
     90                         child = self.children[ix]
     91                         child._alignmentDirty = True
     92                         if forceUpdate:
     93                             child._forceUpdateAlignment = True
     94                         child.UpdateAlignment(*budget)
     95                         cellLeft = cellRight
     96 
     97                 cellTop = min(self.displayHeight, cellBottom)
     98 
     99         return (budgetLeft,
    100          budgetTop,
    101          budgetWidth,
    102          budgetHeight,
    103          sizeChange)
    104 
    105     def _GetNumColumnsAndLines(self, numChildren):
    106         numColumns = self.columns
    107         numLines = self.lines
    108         if numColumns < 1:
    109             numColumns = self._GetAutoNumColumns(numChildren, numColumns, numLines)
    110         if numLines < 1:
    111             if numColumns < 1:
    112                 numColumns, numLines = self._GetAutoNumLinesAndColumns(numChildren, numLines)
    113             else:
    114                 numLines = self._GetAutoNumLines(numChildren, numColumns, numLines)
    115         return (numColumns, numLines)
    116 
    117     def _GetAutoNumLines(self, numChildren, numColumns, numLines):
    118         numLines = int(float(numChildren) / float(numColumns) + 0.5)
    119         if numColumns * numLines < numChildren:
    120             numLines += 1
    121         return numLines
    122 
    123     def _GetAutoNumLinesAndColumns(self, numChildren, numLines):
    124         aspectRatio = float(self.displayWidth) / float(self.displayHeight)
    125         numColumns = int(math.sqrt(numChildren) * aspectRatio + 0.5)
    126         numLines = self._GetAutoNumLines(numChildren, numColumns, numLines)
    127         if self.displayWidth > self.displayHeight:
    128             while numColumns * numLines > numChildren:
    129                 numColumns -= 1
    130 
    131             if numColumns * numLines < numChildren:
    132                 numColumns += 1
    133         else:
    134             while numColumns * numLines > numChildren:
    135                 numLines -= 1
    136 
    137             if numColumns * numLines < numChildren:
    138                 numLines += 1
    139         return (numColumns, numLines)
    140 
    141     def _GetAutoNumColumns(self, numChildren, numColumns, numLines):
    142         if numLines > 0:
    143             numColumns = int(float(numChildren) / float(numLines) + 0.5)
    144             if numColumns * numLines < numChildren:
    145                 numColumns += 1
    146         return numColumns