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