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