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

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