dockPanelMenu.py (15460B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\dockPanelMenu.py 2 from carbonui.primitives.container import Container 3 import carbonui.const as uiconst 4 from carbonui.primitives.sprite import Sprite 5 from eve.client.script.ui.control.eveLabel import EveLabelMedium 6 from eve.client.script.ui.control.themeColored import FillThemeColored, LineThemeColored, SpriteThemeColored 7 from eve.client.script.ui.shared.infoPanels.infoPanelControls import InfoPanelHeaderBackground 8 from eve.client.script.ui.control.divider import Divider 9 import uthread 10 import math 11 from carbonui.uicore import uicore 12 MIN_MENU_HEIGHT = 100 13 14 class DockPanelMenuContainer(Container): 15 menus = None 16 17 def ApplyAttributes(self, attributes): 18 Container.ApplyAttributes(self, attributes) 19 self.menus = [] 20 21 def Close(self, *args): 22 Container.Close(self, *args) 23 self.menus = None 24 25 def CreateMenu(self, settingsID, headerLabel = None, resizeable = True, fixedHeight = None, minExpandedHeight = MIN_MENU_HEIGHT, fillParent = False, expandedByDefault = False): 26 menu = DockPanelMenu(parent=self, headerLabel=headerLabel, settingsID=settingsID, align=uiconst.TOTOP, resizeable=resizeable, fixedHeight=fixedHeight, minExpandedHeight=minExpandedHeight, fillParent=fillParent, expandedByDefault=expandedByDefault, OnMenuResizeStartingCallback=self.OnMenuResizeStarting, OnMenuResizeCallback=self.OnMenuResize, OnMenuExpandCallback=self.OnMenuExpand, OnMenuCollapseCallback=self.OnMenuCollapse, GetMenuMaxHeight=self.GetMenuMaxHeight, GetFreeSpaceForMenu=self.GetFreeSpaceForMenu) 27 self.menus.append(menu) 28 return menu 29 30 def _OnSizeChange_NoBlock(self, width, height, *args): 31 if not self.menus: 32 return 33 modifyMenus = [ each for each in self.menus if each.IsExpanded() ] 34 allTotal = sum([ each.height for each in self.menus ]) 35 if allTotal > height: 36 self._CompressMenus(modifyMenus, allTotal - height) 37 if allTotal < height: 38 self._ExpandMenus(modifyMenus, height - allTotal) 39 40 def GetFreeSpaceForMenu(self, menu): 41 width, height = self.GetAbsoluteSize() 42 totalHeight = 0 43 for each in self.menus: 44 if each is menu: 45 continue 46 totalHeight += each.setHeight 47 48 return height - totalHeight 49 50 def GetMenuMaxHeight(self, menu): 51 if menu.fixedHeight: 52 return menu.fixedHeight 53 width, height = self.GetAbsoluteSize() 54 totalHeight = 0 55 for each in self.menus: 56 if each is menu: 57 continue 58 if each.IsExpanded(): 59 totalHeight += each.GetMinHeight() 60 else: 61 totalHeight += each.height 62 63 maxHeight = max(menu.minExpandedHeight, height - totalHeight) 64 return maxHeight 65 66 def OnMenuResizeStarting(self, menu): 67 width, height = self.GetAbsoluteSize() 68 foundSelf = False 69 totalAbove = 0 70 totalBelow = 0 71 for each in self.menus: 72 if each is menu: 73 foundSelf = True 74 continue 75 if isinstance(each, DockPanelMenu): 76 if foundSelf: 77 if each.IsExpanded(): 78 totalBelow += each.GetMinHeight() 79 else: 80 totalBelow += each.height 81 else: 82 totalAbove += each.height 83 84 menu.SetMinMaxResizeValues(menu.minExpandedHeight, height - totalAbove - totalBelow) 85 86 def OnMenuResize(self, menu): 87 self._CompressMenusBelow(menu) 88 self._ExpandMenusBelow(menu) 89 menu.RegisterSettings() 90 91 def OnMenuExpand(self, menu): 92 self._CompressMenusAbove(menu) 93 self._CompressMenusBelow(menu) 94 95 def OnMenuCollapse(self, menu): 96 self._ExpandMenusAbove(menu) 97 self._ExpandMenusBelow(menu) 98 99 def _CompressMenusAbove(self, menu): 100 width, height = self.GetAbsoluteSize() 101 allTotal = sum([ each.height for each in self.menus ]) 102 if allTotal > height: 103 menusAbove = [] 104 for each in self.menus: 105 if each is menu: 106 break 107 if each.IsExpanded(): 108 menusAbove.append(each) 109 110 self._CompressMenus(menusAbove, allTotal - height) 111 112 def _CompressMenusBelow(self, menu): 113 width, height = self.GetAbsoluteSize() 114 allTotal = sum([ each.height for each in self.menus ]) 115 if allTotal > height: 116 foundSelf = False 117 menusBelow = [] 118 for each in self.menus: 119 if each is menu: 120 foundSelf = True 121 continue 122 if foundSelf and each.IsExpanded(): 123 menusBelow.append(each) 124 125 self._CompressMenus(menusBelow, allTotal - height) 126 127 def _CompressMenus(self, menus, compressNeed): 128 while compressNeed and menus: 129 for each in menus[:]: 130 if each.height > each.GetMinHeight(): 131 each.height -= 1 132 compressNeed -= 1 133 if not compressNeed: 134 break 135 else: 136 menus.remove(each) 137 138 def _ExpandMenusAbove(self, menu): 139 width, height = self.GetAbsoluteSize() 140 allTotal = sum([ each.height for each in self.menus ]) 141 if allTotal < height: 142 menusAbove = [] 143 for each in self.menus: 144 if each is menu: 145 break 146 if each.IsExpanded(): 147 menusAbove.append(each) 148 149 if menusAbove: 150 self._ExpandMenus(menusAbove, height - allTotal) 151 152 def _ExpandMenusBelow(self, menu): 153 width, height = self.GetAbsoluteSize() 154 allTotal = sum([ each.height for each in self.menus ]) 155 if allTotal < height: 156 foundSelf = False 157 menusBelow = [] 158 for each in self.menus: 159 if each is menu: 160 foundSelf = True 161 continue 162 if foundSelf and each.IsExpanded(): 163 menusBelow.append(each) 164 165 self._ExpandMenus(menusBelow, height - allTotal) 166 167 def _ExpandMenus(self, menus, availableSpace): 168 while availableSpace and menus: 169 for each in menus[:]: 170 if each.height < each.GetExpandedHeight(): 171 each.height += 1 172 availableSpace -= 1 173 if not availableSpace: 174 break 175 else: 176 menus.remove(each) 177 178 179 class DockPanelMenu(Container): 180 default_clipChildren = True 181 default_align = uiconst.TOTOP 182 default_state = uiconst.UI_NORMAL 183 _expanded = False 184 _collapsedHeight = 0 185 resizeDivider = None 186 resizeable = False 187 fixedHeight = None 188 fillParent = False 189 minExpandedHeight = MIN_MENU_HEIGHT 190 setHeight = 0 191 192 def ApplyAttributes(self, attributes): 193 Container.ApplyAttributes(self, attributes) 194 self.minExpandedHeight = attributes.Get('minExpandedHeight', self.minExpandedHeight) 195 self.resizeable = attributes.Get('resizeable', self.resizeable) 196 self.fillParent = attributes.Get('fillParent', self.fillParent) 197 self.settingsID = attributes.settingsID 198 self.OnMenuResizeStartingCallback = attributes.OnMenuResizeStartingCallback 199 self.OnMenuResizeCallback = attributes.OnMenuResizeCallback 200 self.OnMenuExpandCallback = attributes.OnMenuExpandCallback 201 self.OnMenuCollapseCallback = attributes.OnMenuCollapseCallback 202 self.GetMenuMaxHeight = attributes.GetMenuMaxHeight 203 self.GetFreeSpaceForMenu = attributes.GetFreeSpaceForMenu 204 self.fixedHeight = attributes.fixedHeight 205 self.headerParent = Container(parent=self, name='headerParent', align=uiconst.TOTOP, state=uiconst.UI_PICKCHILDREN, height=24) 206 FillThemeColored(bgParent=self.headerParent, colorType=uiconst.COLORTYPE_UIHILIGHT, opacity=0.5) 207 InfoPanelHeaderBackground(bgParent=self.headerParent) 208 self.expanderSprite = Sprite(parent=self.headerParent, texturePath='res:/UI/Texture/classes/Neocom/arrowDown.png', rotation=math.pi / 2, pos=(6, 6, 7, 7), state=uiconst.UI_DISABLED) 209 self.headerLabel = EveLabelMedium(text=attributes.headerLabel, parent=self.headerParent, bold=True, state=uiconst.UI_DISABLED, padding=(22, 2, 6, 0), align=uiconst.TOLEFT) 210 self.content = Container(parent=self, name='contentParent', align=uiconst.TOALL, state=uiconst.UI_NORMAL, opacity=0.0) 211 self.headerParent.height = max(20, self.headerLabel.textheight + 2) 212 if self.resizeable and not self.fixedHeight: 213 if self.align == uiconst.TOBOTTOM: 214 divAlign = uiconst.TOTOP 215 else: 216 divAlign = uiconst.TOBOTTOM 217 divider = Divider(name='resizeDivider', align=divAlign, pos=(0, 218 0, 219 0, 220 const.defaultPadding), parent=self, state=uiconst.UI_NORMAL, opacity=0.0, idx=0) 221 divider.OnSizeChangeStarting = self.OnMenuResizeStarting 222 divider.OnSizeChanging = self.OnMenuResize 223 divider.Startup(self, 'height', 'y', 100, 300) 224 self.resizeDivider = divider 225 LineThemeColored(parent=divider, align=uiconst.TOTOP, height=1, opacity=0.3) 226 SpriteThemeColored(parent=divider, texturePath='res:/UI/Texture/Classes/DockPanel/menuResizeHandle.png', pos=(0, 0, 30, 5), align=uiconst.CENTERTOP, state=uiconst.UI_DISABLED, opacity=0.6) 227 self._collapsedHeight = self.headerParent.height + const.defaultPadding 228 current = settings.user.ui.Get('DockPanelMenuPrefs', {}) 229 if self.settingsID in current: 230 if current[self.settingsID]['isExpanded']: 231 uthread.new(self.Expand) 232 return 233 elif attributes.expandedByDefault: 234 uthread.new(self.Expand) 235 return 236 self.Collapse(startup=True) 237 238 def Close(self, *args): 239 Container.Close(self, *args) 240 self.OnMenuResizeStartingCallback = None 241 self.OnMenuResizeCallback = None 242 self.OnMenuExpandCallback = None 243 self.OnMenuCollapseCallback = None 244 self.GetMenuMaxHeight = None 245 self.GetFreeSpaceForMenu = None 246 247 def OnMenuResizeStarting(self, *args): 248 if self.OnMenuResizeStartingCallback: 249 self.OnMenuResizeStartingCallback(self) 250 251 def OnMenuResize(self, *args): 252 self.setHeight = self.height 253 if self.OnMenuResizeCallback: 254 self.OnMenuResizeCallback(self) 255 256 def SetMinMaxResizeValues(self, minValue, maxValue): 257 self.resizeDivider.SetMinMax(minValue, maxValue) 258 259 def SetHeader(self, text, hint = None): 260 self.headerLabel.text = text 261 if hint: 262 self.headerLabel.state = uiconst.UI_NORMAL 263 self.headerLabel.hint = hint 264 self.headerLabel.OnClick = self.OnClick 265 else: 266 self.headerLabel.state = uiconst.UI_DISABLED 267 268 def OnClick(self, *args): 269 if self._expanded: 270 self.Collapse() 271 else: 272 self.Expand() 273 274 def Expand(self, *args): 275 if self.GetMenuMaxHeight: 276 maxHeight = self.GetMenuMaxHeight(self) 277 else: 278 maxHeight = self.GetMinHeight() 279 endHeight = min(maxHeight, self.GetExpandedHeight()) 280 uicore.animations.Tr2DRotateTo(self.expanderSprite, self.expanderSprite.rotation, 0.0, duration=0.25) 281 self._expanded = True 282 self.setHeight = endHeight 283 if self.resizeDivider: 284 self.resizeDivider.state = uiconst.UI_NORMAL 285 uicore.animations.MorphScalar(self.resizeDivider, 'opacity', startVal=self.resizeDivider.opacity, endVal=1.0, duration=0.25) 286 self.content.state = uiconst.UI_NORMAL 287 uicore.animations.MorphScalar(self, '_expandfunc', startVal=self.height, endVal=endHeight, duration=0.25) 288 uicore.animations.MorphScalar(self.content, 'opacity', startVal=self.content.opacity, endVal=1.0, duration=0.25, sleep=True) 289 if self.destroyed: 290 return 291 if self._expanded is True: 292 self.RegisterSettings() 293 294 def Collapse(self, startup = False): 295 endHeight = self._collapsedHeight 296 self.setHeight = endHeight 297 self._expanded = False 298 if not startup: 299 uicore.animations.Tr2DRotateTo(self.expanderSprite, self.expanderSprite.rotation, math.pi / 2, duration=0.25) 300 if self.resizeDivider: 301 self.resizeDivider.state = uiconst.UI_DISABLED 302 uicore.animations.MorphScalar(self.resizeDivider, 'opacity', startVal=self.resizeDivider.opacity, endVal=0.0, duration=0.25) 303 uicore.animations.MorphScalar(self, '_collapsefunc', startVal=self.height, endVal=endHeight, duration=0.25) 304 uicore.animations.MorphScalar(self.content, 'opacity', startVal=self.content.opacity, endVal=0.0, duration=0.25, sleep=True) 305 if self.destroyed: 306 return 307 else: 308 self.expanderSprite.rotation = math.pi / 2 309 if self.resizeDivider: 310 self.resizeDivider.state = uiconst.UI_DISABLED 311 self.resizeDivider.opacity = 0.0 312 self.height = endHeight 313 self.content.opacity = 0.0 314 if self._expanded is False: 315 self.content.state = uiconst.UI_HIDDEN 316 self.RegisterSettings() 317 318 @apply 319 def _expandfunc(): 320 321 def fget(self): 322 return self.height 323 324 def fset(self, value): 325 self.height = value 326 if self.OnMenuExpandCallback: 327 self.OnMenuExpandCallback(self) 328 329 return property(**locals()) 330 331 @apply 332 def _collapsefunc(): 333 334 def fget(self): 335 return self.height 336 337 def fset(self, value): 338 self.height = value 339 if self.OnMenuCollapseCallback: 340 self.OnMenuCollapseCallback(self) 341 342 return property(**locals()) 343 344 def RegisterSettings(self): 345 if self.settingsID: 346 current = settings.user.ui.Get('DockPanelMenuPrefs', {}) 347 if self._expanded: 348 current[self.settingsID] = {'expandedHeight': self.height, 349 'isExpanded': self._expanded} 350 elif self.settingsID in current: 351 current[self.settingsID]['isExpanded'] = self._expanded 352 else: 353 return 354 settings.user.ui.Set('DockPanelMenuPrefs', current) 355 356 def GetExpandedHeight(self): 357 if self.fixedHeight: 358 return self.fixedHeight 359 if self.fillParent and self.GetFreeSpaceForMenu: 360 expandedHeight = self.GetFreeSpaceForMenu(self) 361 else: 362 current = settings.user.ui.Get('DockPanelMenuPrefs', {}) 363 if self.settingsID in current: 364 expandedHeight = current[self.settingsID]['expandedHeight'] 365 else: 366 expandedHeight = None 367 return max(self.minExpandedHeight, expandedHeight) 368 369 def GetMinHeight(self): 370 if self.fixedHeight: 371 return self.fixedHeight 372 else: 373 return self.minExpandedHeight 374 375 def IsExpanded(self): 376 return self._expanded