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

overviewSettingEntries.py (21166B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\overviewSettings\overviewSettingEntries.py
      2 from carbon.common.script.sys.serviceConst import ROLE_GML
      3 from carbonui import Density, uiconst
      4 from carbonui.control.combo import Combo
      5 from carbonui.control.radioButton import RadioButton
      6 from carbonui.control.scrollentries import SE_BaseClassCore
      7 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText
      8 from carbonui.primitives.container import Container
      9 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     10 from carbonui.primitives.fill import Fill
     11 from carbonui.primitives.line import Line
     12 from carbonui.primitives.sprite import Sprite
     13 from carbonui.uicore import uicore
     14 from carbonui.util.various_unsorted import GetAttrs
     15 from carbonui.control.checkbox import Checkbox
     16 from eve.client.script.ui.control.colorPanel import ColorPanel
     17 from eve.client.script.ui.control.entries.checkbox import CheckboxEntry
     18 from eve.client.script.ui.control.entries.generic import Generic
     19 from eve.client.script.ui.control.entries.util import GetFromClass
     20 from eve.client.script.ui.control.eveLabel import EveLabelMedium
     21 from eve.client.script.ui.control.infoIcon import MoreInfoIcon
     22 from carbonui.fontconst import EVE_SMALL_FONTSIZE
     23 from eve.client.script.ui.inflight.overviewSettings.overviewColorPicker import OverviewColorPickerCont
     24 from eve.client.script.ui.inflight.overview.overviewConst import PRE, POST, LABEL_TYPE, LABEL_COLOR, LABEL_BOLD, LABEL_ITALIC, LABEL_UNDERLINE, LABEL_SIZE, CHAR_LT, CODE_LT, CHAR_GT, CODE_GT
     25 from eve.client.script.ui.shared.stateFlag import FlagIconWithState
     26 from localization import GetByLabel
     27 from localization.formatters import FormatNumeric
     28 from menu import MenuLabel
     29 import blue
     30 DEFAULT_FONTSIZE = EVE_SMALL_FONTSIZE
     31 POS_INDICATOR_HEIGHT = 2
     32 
     33 class DraggableOverviewEntry(CheckboxEntry):
     34     __guid__ = 'listentry.DraggableOverviewEntry'
     35     isDragObject = True
     36 
     37     def Startup(self, *args):
     38         CheckboxEntry.Startup(self, args)
     39         self.sr.posIndicatorCont = Container(name='posIndicator', parent=self, align=uiconst.TOTOP, state=uiconst.UI_DISABLED, height=POS_INDICATOR_HEIGHT)
     40         self.sr.posIndicator = Fill(parent=self.sr.posIndicatorCont, color=(1.0, 1.0, 1.0, 0.5), state=uiconst.UI_DISABLED)
     41         self.sr.posIndicator.Hide()
     42         self.canDrag = False
     43 
     44     def GetDragData(self, *args):
     45         if not self.sr.node.canDrag:
     46             return
     47         self.sr.node.scroll.SelectNode(self.sr.node)
     48         return [self.sr.node]
     49 
     50     def OnDropData(self, dragObj, nodes, *args):
     51         self.sr.posIndicator.Hide()
     52         if not self.IsOfRightTypeForDragging(nodes):
     53             return
     54         if GetAttrs(self, 'parent', 'OnDropData'):
     55             node = nodes[0]
     56             if GetAttrs(node, 'panel'):
     57                 self.parent.OnDropData(dragObj, nodes, idx=self.sr.node.idx)
     58 
     59     def OnDragEnter(self, dragObj, nodes, *args):
     60         if self.IsOfRightTypeForDragging(nodes):
     61             self.sr.posIndicator.Show()
     62 
     63     def IsOfRightTypeForDragging(self, nodes):
     64         if len(nodes) != 1:
     65             return False
     66         myNode = nodes[0]
     67         panel = getattr(myNode, 'panel', None)
     68         return isinstance(panel, DraggableOverviewEntry)
     69 
     70     def OnDragExit(self, *args):
     71         self.sr.posIndicator.Hide()
     72 
     73 
     74 class OverviewLastDropEntry(SE_BaseClassCore):
     75     __guid__ = 'OverviewLastDropEntry'
     76     default_state = uiconst.UI_DISABLED
     77     default_showHilite = False
     78 
     79     def ApplyAttributes(self, attributes):
     80         SE_BaseClassCore.ApplyAttributes(self, attributes)
     81         self.sr.posIndicator = Line(parent=self, state=uiconst.UI_DISABLED, align=uiconst.TOTOP, weight=2)
     82         self.sr.posIndicator.Hide()
     83 
     84     def Load(self, node):
     85         pass
     86 
     87     def ShowIndicator(self):
     88         self.sr.posIndicator.Show()
     89 
     90     def HideIndicator(self):
     91         self.sr.posIndicator.Hide()
     92 
     93     def GetDynamicHeight(self, width):
     94         return 10
     95 
     96     def OnDragEnter(self, dragObj, nodes, *args):
     97         self.ShowIndicator()
     98 
     99     def OnDragExit(self, *args):
    100         self.HideIndicator()
    101 
    102     def OnDropData(self, dragObj, nodes, *args):
    103         if GetAttrs(self, 'parent', 'OnDropData'):
    104             node = nodes[0]
    105             if GetAttrs(node, 'panel'):
    106                 self.parent.OnDropData(dragObj, nodes, idx=self.sr.node.idx)
    107 
    108 
    109 class ColumnEntry(DraggableOverviewEntry):
    110     __guid__ = 'listentry.ColumnEntry'
    111 
    112     def Load(self, args):
    113         super(ColumnEntry, self).Load(args)
    114         self.sr.checkbox.state = uiconst.UI_PICKCHILDREN
    115         checkboxCont = self.sr.checkbox.checkboxCont
    116         checkboxCont.state = uiconst.UI_NORMAL
    117         checkboxCont.OnClick = self.ClickDiode
    118 
    119     def CheckBoxChange(self, checkbox, *args):
    120         self.sr.node.checked = self.sr.checkbox.checked
    121         self.sr.node.OnChange(checkbox, self.sr.node)
    122 
    123     def ClickDiode(self, *args):
    124         self.sr.checkbox.ToggleState()
    125 
    126 
    127 class FlagEntry(DraggableOverviewEntry):
    128     __guid__ = 'listentry.FlagEntry'
    129 
    130     def Startup(self, *args):
    131         DraggableOverviewEntry.Startup(self, args)
    132         self.sr.flag = None
    133 
    134     def Load(self, node):
    135         CheckboxEntry.Load(self, node)
    136         self.sr.checkbox.state = uiconst.UI_PICKCHILDREN
    137         checkboxCont = self.sr.checkbox.checkboxCont
    138         checkboxCont.state = uiconst.UI_NORMAL
    139         checkboxCont.OnClick = self.ClickDiode
    140         if self.sr.flag:
    141             f = self.sr.flag
    142             self.sr.flag = None
    143             f.Close()
    144         colorPicker = Container(parent=self, pos=(0, 0, 25, 20), name='colorPicker', state=uiconst.UI_NORMAL, align=uiconst.CENTERRIGHT, idx=0)
    145         if node.cfgname == 'flag':
    146             flagInfo = sm.GetService('stateSvc').GetStatePropsColorAndBlink(node.flag)
    147             self.sr.flag = FlagIconWithState(parent=colorPicker, top=4, state=uiconst.UI_DISABLED, align=uiconst.TOPLEFT, flagInfo=flagInfo)
    148         else:
    149             backgroundBlink = sm.GetService('stateSvc').GetStateBlink(node.cfgname, node.flag)
    150             backgroundColor = sm.GetService('stateSvc').GetStateBackgroundColor(node.flag)
    151             self.sr.flag = Fill(color=backgroundColor, parent=colorPicker, pos=(0, 4, 9, 9), state=uiconst.UI_DISABLED, align=uiconst.TOPLEFT)
    152             if backgroundBlink:
    153                 uicore.animations.FadeTo(self.sr.flag, startVal=0.0, endVal=1.0, duration=0.5, loops=uiconst.ANIM_REPEAT, curveType=uiconst.ANIM_WAVE)
    154         arrow = Sprite(parent=colorPicker, pos=(0, 0, 16, 16), name='arrow', align=uiconst.CENTERRIGHT, texturePath='res:/ui/texture/icons/38_16_229.png', color=(1, 1, 1, 0.5), state=uiconst.UI_DISABLED)
    155         colorPicker.LoadTooltipPanel = self.LoadColorTooltipPanel
    156         colorPicker.GetTooltipPointer = self.GetColorTooltipPointer
    157         colorPicker.GetTooltipDelay = self.GetTooltipDelay
    158 
    159     def ClickDiode(self, *args):
    160         self.sr.checkbox.ToggleState()
    161 
    162     def CheckBoxChange(self, checkbox, *args):
    163         self.sr.node.checked = self.sr.checkbox.checked
    164         self.sr.node.OnChange(checkbox, self.sr.node)
    165 
    166     def GetMenu(self):
    167         if self.sr.node.GetMenu:
    168             return self.sr.node.GetMenu()
    169         m = [(MenuLabel('UI/Overview/ToggleBlink'), self.ToggleBlink)]
    170         return m
    171 
    172     def ToggleBlink(self):
    173         current = sm.GetService('stateSvc').GetStateBlink(self.sr.node.cfgname, self.sr.node.flag)
    174         sm.GetService('stateSvc').SetStateBlink(self.sr.node.cfgname, self.sr.node.flag, not current)
    175         self.Load(self.sr.node)
    176 
    177     def GetColorTooltipPointer(self):
    178         return uiconst.POINT_LEFT_2
    179 
    180     def GetTooltipDelay(self):
    181         return 50
    182 
    183     def LoadColorTooltipPanel(self, tooltipPanel, *args):
    184         tooltipPanel.state = uiconst.UI_NORMAL
    185         tooltipPanel.LoadStandardSpacing()
    186 
    187         def ChangeColor(color):
    188             self.ChangeColor(color, tooltipPanel)
    189 
    190         colors = sm.GetService('stateSvc').GetStateColors()
    191         colorList = [ x[0] for x in colors.values() ]
    192         currentColor = sm.GetService('stateSvc').GetStateColor(self.sr.node.flag, where=self.sr.node.cfgname)
    193         colorPanel = ColorPanel(callback=ChangeColor, currentColor=currentColor, colorList=colorList, addClear=False)
    194         tooltipPanel.AddLabelSmall(text=GetByLabel('UI/Mail/Select Color'))
    195         tooltipPanel.AddCell(cellObject=colorPanel)
    196 
    197     def ChangeColor(self, color, tooltipPanel):
    198         sm.GetService('stateSvc').SetStateColor(self.sr.node.cfgname, self.sr.node.flag, color)
    199         tooltipPanel.Close()
    200         self.Load(self.sr.node)
    201 
    202 
    203 class ShipEntry(DraggableOverviewEntry):
    204     __guid__ = 'listentry.ShipEntry'
    205 
    206     def Startup(self, *args):
    207         DraggableOverviewEntry.Startup(self, args)
    208         self.sr.preEdit = SingleLineEditText(name='preEdit', parent=self, align=uiconst.CENTERLEFT, pos=(32, 0, 20, 0), OnFocusLost=self.OnPreChange, OnReturn=self.OnPreChange, density=Density.COMPACT)
    209         self.postCont = Container(name='postCont', parent=self, align=uiconst.TOLEFT, pos=(140,
    210          -POS_INDICATOR_HEIGHT,
    211          50,
    212          0))
    213         self.formatCont = Container(name='formatCont', parent=self, padLeft=10)
    214         self.sr.postEdit = SingleLineEditText(name='postEdit', parent=self.postCont, align=uiconst.CENTERLEFT, pos=(0, 0, 20, 0), OnFocusLost=self.OnPostChange, OnReturn=self.OnPostChange, density=Density.COMPACT)
    215         self.moreInfoIcon = MoreInfoIcon(parent=self.postCont, align=uiconst.CENTERLEFT, left=28)
    216         self.BuildFormatCont()
    217 
    218     def BuildFormatCont(self):
    219         self.colorPicker = OverviewColorPickerCont(parent=self.formatCont, idx=0, callback=self.SetColorForLabel)
    220         fontSizeCont = ContainerAutoSize(parent=self.formatCont, align=uiconst.TORIGHT, left=30)
    221         options = [[FormatNumeric(8), 8],
    222          [FormatNumeric(9), 9],
    223          [FormatNumeric(10), 10],
    224          [FormatNumeric(11), 11],
    225          [FormatNumeric(12), 12],
    226          [FormatNumeric(14), 14]]
    227         self.fontSizeCombo = Combo(parent=fontSizeCont, options=options, name='fontsize', callback=self.OnFontSizeChange, align=uiconst.CENTERLEFT, width=56, density=Density.COMPACT)
    228         underlineCont = Container(parent=self.formatCont, align=uiconst.TORIGHT, width=40)
    229         self.underlineCb = Checkbox(name='underlineCb', parent=underlineCont, align=uiconst.CENTERLEFT, left=0, height=14, checked=True, callback=self.OnUnderlineChange)
    230         self.underline = EveLabelMedium(text=GetByLabel('/Carbon/UI/Controls/EditRichText/UnderlineSymbol'), parent=underlineCont, left=16, align=uiconst.CENTERLEFT, color=(1.0, 1.0, 1.0, 0.6), state=uiconst.UI_NORMAL, hint=GetByLabel('/Carbon/UI/Controls/EditRichText/Underline'))
    231         italicCont = Container(parent=self.formatCont, align=uiconst.TORIGHT, width=30)
    232         self.italicCb = Checkbox(name='italicCb', parent=italicCont, align=uiconst.CENTERLEFT, left=0, height=14, callback=self.OnItalicChange)
    233         self.italicIcon = EveLabelMedium(text=GetByLabel('/Carbon/UI/Controls/EditRichText/ItalicSymbol'), parent=italicCont, left=16, align=uiconst.CENTERLEFT, color=(1.0, 1.0, 1.0, 0.6), state=uiconst.UI_NORMAL, hint=GetByLabel('/Carbon/UI/Controls/EditRichText/ItalicSymbol'))
    234         boldCont = Container(parent=self.formatCont, align=uiconst.TORIGHT, width=30)
    235         self.boldCb = Checkbox(name='boldCb', parent=boldCont, align=uiconst.CENTERLEFT, left=0, height=14, callback=self.OnBoldChange)
    236         self.boldIcon = EveLabelMedium(text=GetByLabel('/Carbon/UI/Controls/EditRichText/BoldSymbol'), parent=boldCont, left=16, align=uiconst.CENTERLEFT, color=(1.0, 1.0, 1.0, 0.6), state=uiconst.UI_NORMAL, hint=GetByLabel('/Carbon/UI/Controls/EditRichText/Bold'))
    237 
    238     def Load(self, node):
    239         CheckboxEntry.Load(self, node)
    240         self.sr.checkbox.state = uiconst.UI_PICKCHILDREN
    241         checkboxCont = self.sr.checkbox.checkboxCont
    242         checkboxCont.state = uiconst.UI_NORMAL
    243         checkboxCont.OnClick = self.ClickDiode
    244         self.sr.label.left = 60
    245         flag = self.sr.node.flag
    246         self.sr.preEdit.SetValue(flag[PRE])
    247         self.sr.postEdit.SetValue(flag[POST])
    248         if flag[LABEL_TYPE] is None:
    249             self.sr.postEdit.state = uiconst.UI_HIDDEN
    250         else:
    251             self.sr.postEdit.state = uiconst.UI_NORMAL
    252         comment = self.sr.node.comment
    253         if comment:
    254             self.moreInfoIcon.display = True
    255             self.moreInfoIcon.hint = comment
    256         else:
    257             self.moreInfoIcon.display = False
    258         color = flag.get(LABEL_COLOR, None)
    259         color = tuple(color) if color else color
    260         self.colorPicker.SetCurrentFill(color)
    261         isBold = flag.get(LABEL_BOLD, False)
    262         self.boldCb.SetChecked(isBold, False)
    263         isBold = flag.get(LABEL_ITALIC, False)
    264         self.italicCb.SetChecked(isBold, False)
    265         isUnderlined = flag.get(LABEL_UNDERLINE, False)
    266         self.underlineCb.SetChecked(isUnderlined, False)
    267         fontsize = flag.get(LABEL_SIZE, None) or DEFAULT_FONTSIZE
    268         self.fontSizeCombo.SelectItemByValue(fontsize)
    269 
    270     def CheckBoxChange(self, checkbox, *args):
    271         self.sr.node.checked = self.sr.checkbox.checked
    272         self.sr.node.OnChange(checkbox, self.sr.node)
    273 
    274     def ClickDiode(self, *args):
    275         self.sr.checkbox.ToggleState()
    276 
    277     def OnClick(self, *args):
    278         Generic.OnClick(self, *args)
    279 
    280     def OnPreChange(self, *args):
    281         text = self.sr.preEdit.GetValue()
    282         if self.sr.node.flag[PRE] != text:
    283             self.sr.node.flag[PRE] = text.replace(CHAR_LT, CODE_LT).replace(CHAR_GT, CODE_GT)
    284             self.sr.node.OnChange(self.sr.checkbox)
    285 
    286     def OnPostChange(self, *args):
    287         text = self.sr.postEdit.GetValue()
    288         if self.sr.node.flag[POST] != text:
    289             self.sr.node.flag[POST] = text.replace(CHAR_LT, CODE_LT).replace(CHAR_GT, CODE_GT)
    290             self.sr.node.OnChange(self.sr.checkbox)
    291 
    292     def OnBoldChange(self, *args):
    293         isChecked = self.boldCb.GetValue()
    294         formattingType = LABEL_BOLD
    295         newValue = isChecked
    296         self.UpdateFormatting(formattingType, newValue)
    297 
    298     def OnItalicChange(self, *args):
    299         isChecked = self.italicCb.GetValue()
    300         formattingType = LABEL_ITALIC
    301         newValue = isChecked
    302         self.UpdateFormatting(formattingType, newValue)
    303 
    304     def OnUnderlineChange(self, *args):
    305         isChecked = self.underlineCb.GetValue()
    306         formattingType = LABEL_UNDERLINE
    307         newValue = isChecked
    308         self.UpdateFormatting(formattingType, newValue)
    309 
    310     def SetColorForLabel(self, color, *args):
    311         formattingType = LABEL_COLOR
    312         newValue = color
    313         self.UpdateFormatting(formattingType, newValue)
    314 
    315     def OnFontSizeChange(self, *args):
    316         formattingType = LABEL_SIZE
    317         newValue = self.fontSizeCombo.GetValue()
    318         self.UpdateFormatting(formattingType, newValue)
    319 
    320     def UpdateFormatting(self, formattingType, newValue):
    321         if self.sr.node.flag.get(formattingType, None) != newValue:
    322             self.sr.node.flag[formattingType] = newValue
    323             self.sr.node.OnChange(self.sr.checkbox)
    324 
    325     def IsOfRightTypeForDragging(self, nodes):
    326         if len(nodes) != 1:
    327             return False
    328         myNode = nodes[0]
    329         panel = getattr(myNode, 'panel', None)
    330         return isinstance(panel, (DraggableOverviewEntry, ShipEntryLinebreak))
    331 
    332     def GetHeight(self, *args):
    333         return 32
    334 
    335 
    336 class StateOverviewEntry(Generic):
    337     __guid__ = 'listentry.StateOverviewEntry'
    338 
    339     def Startup(self, *args):
    340         Generic.Startup(self, args)
    341         self.alwaysCb = RadioButton(parent=self, left=64, width=14, settingsKey='alwaysShow', checked=False, callback=self.OnCheckBoxChange, settingsPath=('user', 'overview'), align=uiconst.CENTERRIGHT)
    342         self.alwaysCb.OnMouseEnter = self.OnMouseEnter
    343         self.alwaysCb.OnMouseExit = self.OnMouseExit
    344         self.alwaysCb.hint = GetByLabel('UI/Overview/FilterStateAlwaysShowShort')
    345         self.filterOutCb = RadioButton(parent=self, left=34, width=14, settingsKey='filterOut', checked=False, callback=self.OnCheckBoxChange, settingsPath=('user', 'overview'), align=uiconst.CENTERRIGHT)
    346         self.filterOutCb.OnMouseEnter = self.OnMouseEnter
    347         self.filterOutCb.OnMouseExit = self.OnMouseExit
    348         self.filterOutCb.hint = GetByLabel('UI/Overview/FilterStateFilterOutShort')
    349         self.unfilteredCb = RadioButton(parent=self, left=4, width=14, settingsKey='unfiltered', checked=False, callback=self.OnCheckBoxChange, settingsPath=('user', 'overview'), align=uiconst.CENTERRIGHT)
    350         self.unfilteredCb.OnMouseEnter = self.OnMouseEnter
    351         self.unfilteredCb.OnMouseExit = self.OnMouseExit
    352         self.unfilteredCb.hint = GetByLabel('UI/Overview/FilterStateNotFilterOutShort')
    353 
    354     def Load(self, node):
    355         Generic.Load(self, node)
    356         self.onChangeFunc = node.onChangeFunc
    357         iconCont = Container(parent=self, pos=(3, 0, 9, 9), name='flag', state=uiconst.UI_DISABLED, align=uiconst.CENTERLEFT, idx=0)
    358         iconRectLeft = (node.props.iconIndex + 1) * 10
    359         flagIcon = Sprite(parent=iconCont, pos=(0, 0, 10, 10), name='icon', state=uiconst.UI_DISABLED, rectWidth=10, rectHeight=10, texturePath='res:/UI/Texture/classes/Bracket/flagIcons.png', align=uiconst.RELATIVE, color=node.props.iconColor)
    360         flagIcon.rectLeft = iconRectLeft
    361         col = sm.GetService('stateSvc').GetStateColor(node.flag, where='flag')
    362         flagBackground = Fill(parent=iconCont, color=col)
    363         flagBackground.opacity *= 0.75
    364         self.sr.label.left = 16
    365         self.alwaysCb.SetGroup(node.props.label)
    366         self.filterOutCb.SetGroup(node.props.label)
    367         self.unfilteredCb.SetGroup(node.props.label)
    368         self.alwaysCb.width = 14
    369         self.filterOutCb.width = 14
    370         self.unfilteredCb.width = 14
    371         if node.isAlwaysShow:
    372             self.alwaysCb.SetChecked(True, report=0)
    373         elif node.isFilterOut:
    374             self.filterOutCb.SetChecked(True, report=0)
    375         else:
    376             self.unfilteredCb.SetChecked(True, report=0)
    377 
    378     def OnCheckBoxChange(self, cb, *args):
    379         self.onChangeFunc(self.sr.node, cb.GetSettingsKey())
    380 
    381 
    382 class ShipEntryLinebreak(Generic):
    383     isDragObject = True
    384 
    385     def Startup(self, *args):
    386         Generic.Startup(self, args)
    387         self.sr.posIndicatorCont = Container(name='posIndicator', parent=self, align=uiconst.TOTOP, state=uiconst.UI_DISABLED, height=2)
    388         self.sr.posIndicator = Fill(parent=self.sr.posIndicatorCont, color=(1.0, 1.0, 1.0, 0.5))
    389         self.sr.posIndicator.state = uiconst.UI_HIDDEN
    390 
    391     def GetDragData(self, *args):
    392         if not self.sr.node.canDrag:
    393             return
    394         self.sr.node.scroll.SelectNode(self.sr.node)
    395         return [self.sr.node]
    396 
    397     def OnDropData(self, dragObj, nodes, *args):
    398         if GetAttrs(self, 'parent', 'OnDropData'):
    399             node = nodes[0]
    400             if GetAttrs(node, 'panel'):
    401                 self.parent.OnDropData(dragObj, nodes, idx=self.sr.node.idx)
    402 
    403     def OnDragEnter(self, dragObj, nodes, *args):
    404         self.sr.posIndicator.state = uiconst.UI_DISABLED
    405 
    406     def OnDragExit(self, *args):
    407         self.sr.posIndicator.state = uiconst.UI_HIDDEN
    408 
    409     def GetMenu(self):
    410         data = self.sr.node
    411         m = []
    412         if data.removeFunc:
    413             m += [(MenuLabel('UI/Commands/Remove'), data.removeFunc, (data.idx,))]
    414         return m
    415 
    416 
    417 def GetLastEntryToAdd(scrolllist):
    418     if scrolllist:
    419         lastDropEntry = GetFromClass(OverviewLastDropEntry)
    420         return [lastDropEntry]
    421     else:
    422         return []
    423 
    424 
    425 class OverviewTabPresetEntry(CheckboxEntry):
    426 
    427     def Startup(self, *args):
    428         CheckboxEntry.Startup(self, *args)
    429         self.bracketSpriteCont = Container(name='bracketSpriteCont', parent=self, align=uiconst.CENTERRIGHT, pos=(6, 0, 16, 16))
    430 
    431     def Load(self, node):
    432         CheckboxEntry.Load(self, node)
    433         self.bracketSpriteCont.Flush()
    434         texturePaths = node.texturePaths
    435         if texturePaths and len(texturePaths) < 5:
    436             texturePathList = self.SortTexturePaths(texturePaths)
    437             for eachPath in texturePathList:
    438                 Sprite(name='bracketSprite', parent=self.bracketSpriteCont, pos=(0, 0, 16, 16), align=uiconst.TORIGHT, state=uiconst.UI_DISABLED, opacity=0.75, texturePath=eachPath)
    439 
    440     def SortTexturePaths(self, texturePaths):
    441         texturePathList = list(texturePaths)
    442 
    443         def GetSortKey(textureName):
    444             texturePathLower = textureName.lower()
    445             if texturePathLower.find('extralarge') > -1:
    446                 return 0
    447             if texturePathLower.find('large') > -1:
    448                 return 1
    449             if texturePathLower.find('medium') > -1:
    450                 return 2
    451             if texturePathLower.find('small') > -1:
    452                 return 3
    453             return 4
    454 
    455         texturePathList.sort(key=lambda x: GetSortKey(x))
    456         return texturePathList
    457 
    458     def GetMenu(self):
    459         node = self.sr.node
    460         m = CheckboxEntry.GetMenu(self)
    461         if session.role & ROLE_GML > 0:
    462             m.append(('GM - groupID: %s' % node.retval, blue.pyos.SetClipboardData, (str(node.retval),)))
    463         return m