listgroup.py (14540B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\control\listgroup.py 2 import logging 3 import eveicon 4 import localization 5 import telemetry 6 from carbon.common.script.util.commonutils import GetAttrs 7 from carbonui import uiconst 8 from carbonui.control.scrollentries import SE_ListGroupCore 9 from carbonui.window.widget import WidgetWindow 10 from carbonui.primitives.container import Container 11 from carbonui.primitives.fill import Fill 12 from carbonui.uicore import uicore 13 from eve.client.script.ui.control.entries.generic import Generic 14 from eve.client.script.ui.control.entries.util import GetFromClass 15 from eve.client.script.ui.control.eveIcon import Icon 16 from eve.client.script.ui.control.eveLabel import EveLabelMedium 17 from eve.client.script.ui.control.eveScroll import Scroll 18 from eve.client.script.ui.control.glowSprite import GlowSprite 19 from eve.client.script.ui.control.themeColored import FillThemeColored 20 from eve.client.script.ui.util import utilWindows 21 from menu import MenuLabel 22 log = logging.getLogger(__name__) 23 24 class VirtualGroupWindow(WidgetWindow): 25 __guid__ = 'form.VirtualGroupWindow' 26 27 def ApplyAttributes(self, attributes): 28 super(VirtualGroupWindow, self).ApplyAttributes(attributes) 29 node = attributes.node 30 caption = attributes.caption or 'List window' 31 self.SetScope(uiconst.SCOPE_INGAME) 32 self.SetMinSize((200, 200)) 33 self.sr.data = node.copy() 34 main = self.GetChild('main') 35 main.Flush() 36 icon = getattr(node, 'showicon', '') 37 if icon == 'hide': 38 self.icon = 'res:/ui/Texture/WindowIcons/smallfolder.png' 39 elif isinstance(icon, eveicon.IconData): 40 self.icon = icon 41 elif icon and icon[0] == '_': 42 self.icon = icon[1:] 43 else: 44 self.icon = 'res:/ui/Texture/WindowIcons/smallfolder.png' 45 self.SetCaption(caption) 46 self.sr.scroll = Scroll(name='scroll', parent=main, align=uiconst.TOALL) 47 self.sr.scroll.sr.iconMargin = getattr(self.sr.data, 'iconMargin', 0) 48 ignoreTabTrimming = GetAttrs(node, 'scroll', 'sr', 'ignoreTabTrimming') or 0 49 self.sr.scroll.sr.ignoreTabTrimming = ignoreTabTrimming 50 minColumnWidth = GetAttrs(node, 'scroll', 'sr', 'minColumnWidth') or {} 51 self.sr.scroll.sr.minColumnWidth = minColumnWidth 52 self.sr.scroll.sr.content.OnDropData = self.OnDropData 53 sublevel = node.Get('sublevel', 0) 54 self.sr.scroll.sr.sublevelCorrection = sublevel + 1 55 56 def _OnClose(self, *args): 57 self.sr.data = None 58 59 def LoadContent(self, newNode = None, newCaption = None): 60 if not self or self.destroyed: 61 return 62 if newNode: 63 self.sr.data = newNode.Copy() 64 if newCaption: 65 self.SetCaption(newCaption) 66 if self.sr.data.GetSubContent: 67 content = self.sr.data.GetSubContent(self.sr.data, 1) 68 else: 69 raise RuntimeError('LoadContent: WTF') 70 if self.sr.data.scroll.sr.id: 71 self.sr.scroll.sr.id = '%s_%s' % (self.sr.data.scroll.sr.id, self.sr.data.id) 72 self.sr.scroll.sr.fixedColumns = self.sr.data.scroll.sr.fixedColumns.copy() 73 self.sr.scroll.Load(contentList=content, headers=self.sr.data.scroll.GetColumns(), fixedEntryHeight=self.sr.data.scroll.sr.fixedEntryHeight, scrolltotop=0) 74 75 def OnDropData(self, dragObj, nodes): 76 if getattr(self.sr.data, 'DropData', None): 77 self.sr.data.DropData(self.sr.data.id, nodes) 78 return 79 ids = [] 80 myListGroupID = self.sr.data.id 81 for node in nodes: 82 guid = getattr(node, '__guid__', None) 83 if guid not in self.sr.data.get('allowGuids', []): 84 log.warning('dropnode.__guid__ has to be listed in group.node.allowGuids %s %s', guid, getattr(self.sr.data, 'allowGuids', [])) 85 continue 86 if not getattr(node, 'itemID', None): 87 log.warning('dropitem data has to have itemID') 88 continue 89 currentListGroupID = getattr(node, 'listGroupID', None) 90 ids.append((node.itemID, currentListGroupID, myListGroupID)) 91 92 for itemID, currentListGroupID, myListGroupID in ids: 93 if currentListGroupID and itemID: 94 uicore.registry.RemoveFromListGroup(currentListGroupID, itemID) 95 uicore.registry.AddToListGroup(myListGroupID, itemID) 96 97 uicore.registry.ReloadGroupWindow(myListGroupID) 98 if getattr(self.sr.data, 'RefreshScroll', None): 99 self.sr.data.RefreshScroll() 100 101 102 class ListGroup(SE_ListGroupCore): 103 __guid__ = 'listentry.Group' 104 default_iconSize = 16 105 106 @telemetry.ZONE_METHOD 107 def Startup(self, *etc): 108 self._ConstructExpander() 109 self._ConstructIcon() 110 self._ConstructLabel() 111 self._ConstructFill() 112 Container(parent=self, name='mainLinePar', align=uiconst.TOALL, idx=0, pos=(0, 0, 0, 0), state=uiconst.UI_DISABLED) 113 114 def _ConstructExpander(self): 115 self.sr.expanderParent = Container(name='expanderParent', parent=self, pos=(4, 0, 16, 16), align=uiconst.CENTERLEFT, state=uiconst.UI_DISABLED, width=16) 116 self.sr.expander = GlowSprite(parent=self.sr.expanderParent, pos=(0, 0, 16, 16), name='expander', state=uiconst.UI_DISABLED, texturePath='res:/UI/Texture/Shared/expanderDown.png', align=uiconst.CENTER) 117 self.sr.expander.OnClick = self.Toggle 118 119 def _ConstructIcon(self): 120 self.sr.icon = Icon(parent=self, pos=(4, 0, 16, 16), name='icon', state=uiconst.UI_DISABLED, icon=eveicon.folder, align=uiconst.CENTERLEFT, ignoreSize=True) 121 122 def _ConstructLabel(self): 123 self.sr.labelClipper = Container(parent=self, name='labelClipper', align=uiconst.TOALL, clipChildren=1) 124 self.sr.labelClipper.OnClick = self.OnClick 125 self.sr.labelClipper.GetMenu = self.GetMenu 126 self.sr.label = EveLabelMedium(text='', parent=self.sr.labelClipper, left=5, state=uiconst.UI_DISABLED, maxLines=1, align=uiconst.CENTERLEFT, autoFadeSides=16) 127 128 def _ConstructFill(self): 129 if self.sr.node.sublevel > 0: 130 self.sr.fill = None 131 else: 132 self.sr.fill = Fill(bgParent=self, opacity=0.05) 133 134 def GetHeight(self, *args): 135 node, _ = args 136 height = max(24, uicore.font.GetTextHeight(node.label, maxLines=1)) 137 node.height = height 138 return node.height 139 140 @telemetry.ZONE_METHOD 141 def Load(self, node): 142 self.sr.node = node 143 self.sr.id = node.id 144 self.sr.subitems = node.get('subitems', []) or node.get('groupItems', []) 145 self.UpdateLabel() 146 self.hint = node.Get('hint', '') 147 if node.Get('rightAlignExpander', False): 148 self.sr.expanderParent.align = uiconst.TORIGHT 149 else: 150 self.sr.expanderParent.left = self._GetSublevelLeft() + 4 151 self.sr.expanderParent.align = uiconst.CENTERLEFT 152 self.sr.node.selectable = node.Get('selectGroup', 0) 153 if node.Get('selected', 0): 154 self.Select() 155 else: 156 self.Deselect() 157 self.sr.expanderParent.display = not bool(node.Get('hideExpander', 0)) 158 if self.sr.fill: 159 self.sr.fill.state = [uiconst.UI_DISABLED, uiconst.UI_HIDDEN][node.Get('hideFill', False)] 160 if self.sr.expander.state == uiconst.UI_HIDDEN: 161 self.sr.labelClipper.width = 0 162 for k, v in node.Get('labelstyle', {}).iteritems(): 163 setattr(self.sr.label, k, v) 164 165 self._LoadIconState() 166 self._LoadIconLeft() 167 self._LoadLabelLeft() 168 if node.panel is not self or self is None: 169 return 170 self.ShowOpenState(node.get('forceOpen', False) or uicore.registry.GetListGroupOpenState(self.sr.id, default=node.Get('openByDefault', False))) 171 self.RefreshGroupWindow(0) 172 173 def _GetSublevel(self): 174 sublevelCorrection = self.sr.node.scroll.sr.get('sublevelCorrection', 0) if self.sr.node.scroll else 0 175 sublevel = max(0, self.sr.node.Get('sublevel', 0) - sublevelCorrection) 176 return sublevel 177 178 def _GetSublevelLeft(self): 179 return 16 * self._GetSublevel() 180 181 def _LoadIconState(self): 182 icon = self.sr.node.Get('showicon', '') 183 iconID = self.sr.node.Get('iconID', None) 184 iconSize = self.sr.node.Get('iconSize', self.default_iconSize) 185 iconColor = self.sr.node.Get('iconColor', None) 186 if iconID: 187 self.sr.icon.LoadIcon(iconID, ignoreSize=True) 188 self.sr.icon.SetSize(iconSize, iconSize) 189 self.sr.icon.state = uiconst.UI_DISABLED 190 elif isinstance(icon, eveicon.IconData): 191 self.sr.icon.texturePath = icon 192 self.sr.icon.SetSize(iconSize, iconSize) 193 self.sr.icon.state = uiconst.UI_DISABLED 194 elif icon == 'hide': 195 self.sr.icon.state = uiconst.UI_HIDDEN 196 elif icon and icon[0] == '_': 197 self.sr.icon.LoadIcon(icon[1:], ignoreSize=True) 198 self.sr.icon.SetSize(iconSize, iconSize) 199 self.sr.icon.state = uiconst.UI_DISABLED 200 else: 201 if icon: 202 self.sr.icon.LoadIcon(icon, ignoreSize=True) 203 self.sr.icon.SetSize(iconSize, iconSize) 204 else: 205 self.sr.icon.LoadIcon(eveicon.folder.resolve(iconSize), ignoreSize=True) 206 self.sr.icon.SetSize(iconSize, iconSize) 207 self.sr.icon.state = uiconst.UI_DISABLED 208 self.sr.icon.width = iconSize 209 if iconColor is not None: 210 self.sr.icon.SetRGBA(*iconColor) 211 212 def _LoadIconLeft(self): 213 if self._IsExpanderLeft(): 214 self.sr.icon.left = self._GetSublevelLeft() + 22 215 else: 216 self.sr.icon.left = self._GetSublevelLeft() + 4 217 218 def _LoadLabelLeft(self): 219 if self.sr.icon.display: 220 self.sr.label.left = self.sr.icon.left + self.sr.icon.width + 4 221 elif self._IsExpanderLeft(): 222 self.sr.label.left = self.sr.icon.left 223 else: 224 self.sr.label.left = self.sr.icon.left + 2 225 226 def _IsExpanderLeft(self): 227 return self.sr.expanderParent.display and self.sr.expanderParent.align == uiconst.CENTERLEFT 228 229 def OnDblClick(self, *args): 230 if self.sr.node.Get('OnDblClick', None): 231 self.sr.node.OnDblClick(self) 232 return 233 if self.sr.node.Get('BlockOpenWindow', 0): 234 return 235 self.RefreshGroupWindow(create=1) 236 237 def RefreshGroupWindow(self, create): 238 if self.sr.node: 239 if create: 240 wnd = VirtualGroupWindow.Open(windowID=unicode(self.sr.node.id), node=self.sr.node, caption=self.sr.node.label.replace('<t>', '-')) 241 else: 242 wnd = VirtualGroupWindow.GetIfOpen(windowID=unicode(self.sr.node.id)) 243 if wnd: 244 wnd.LoadContent(self.sr.node, newCaption=self.sr.node.label) 245 if create: 246 wnd.Maximize() 247 if not self or self.destroyed: 248 return 249 node = self.sr.node 250 if node.open: 251 self.Toggle() 252 253 def GetNoItemEntry(self): 254 return GetFromClass(Generic, {'label': localization.GetByLabel('/Carbon/UI/Controls/Common/NoItem'), 255 'sublevel': self.sr.node.Get('sublevel', 0) + 1}) 256 257 def GetMenu(self): 258 m = [] 259 if not self.sr.node.Get('BlockOpenWindow', 0): 260 wnd = VirtualGroupWindow.GetIfOpen(windowID=unicode(self.sr.node.id)) 261 if wnd: 262 m = [(MenuLabel('/Carbon/UI/Controls/ScrollEntries/ShowWindow'), self.RefreshGroupWindow, (1,))] 263 else: 264 m = [(MenuLabel('/Carbon/UI/Controls/ScrollEntries/OpenGroupWindow'), self.RefreshGroupWindow, (1,))] 265 node = self.sr.node 266 expandable = node.Get('expandable', 1) 267 if expandable: 268 if not node.open: 269 m += [(MenuLabel('UI/Common/Expand'), self.Toggle, ())] 270 else: 271 m += [(MenuLabel('UI/Common/Collapse'), self.Toggle, ())] 272 if node.Get('state', None) != 'locked': 273 m += [(MenuLabel('/Carbon/UI/Controls/ScrollEntries/ChangeLabel'), self.ChangeLabel)] 274 m += [(MenuLabel('/Carbon/UI/Controls/ScrollEntries/DeleteFolder'), self.DeleteFolder)] 275 if node.Get('MenuFunction', None): 276 cm = node.MenuFunction(node) 277 m += cm 278 return m 279 280 def GetNewGroupName(self): 281 return utilWindows.NamePopup(localization.GetByLabel('/Carbon/UI/Controls/ScrollEntries/TypeInNewName'), localization.GetByLabel('/Carbon/UI/Controls/ScrollEntries/TypeInNewFolderName')) 282 283 def CloseWindow(self, windowID): 284 VirtualGroupWindow.CloseIfOpen(windowID=windowID) 285 286 def OnDragEnter(self, dragObj, drag, *args): 287 if self.sr.node.Get('DragEnterCallback', None): 288 self.sr.node.DragEnterCallback(self, drag) 289 elif drag and getattr(drag[0], '__guid__', None) in self.sr.node.Get('allowGuids', []) + ['xtriui.DragIcon']: 290 self.Select() 291 292 def OnDragExit(self, dragObj, drag, *args): 293 if not self.sr.node.selected: 294 self.Deselect() 295 296 def ShowOpenState(self, open_): 297 if self.sr.expander: 298 if open_: 299 self.sr.expander.LoadIcon('res:/UI/Texture/Icons/38_16_229.png') 300 else: 301 self.sr.expander.LoadIcon('res:/UI/Texture/Icons/38_16_228.png') 302 303 def OnMouseEnter(self, *args): 304 SE_ListGroupCore.OnMouseEnter(self, *args) 305 self.sr.expander.OnMouseEnter() 306 307 def OnMouseExit(self, *args): 308 SE_ListGroupCore.OnMouseExit(self, *args) 309 self.sr.expander.OnMouseExit() 310 311 def GetRadialMenuIndicator(self, create = True, *args): 312 indicator = getattr(self, 'radialMenuIndicator', None) 313 if indicator and not indicator.destroyed: 314 return indicator 315 if not create: 316 return 317 self.radialMenuIndicator = Fill(bgParent=self, color=(1, 1, 1, 0.1), name='radialMenuIndicator') 318 return self.radialMenuIndicator 319 320 def ShowRadialMenuIndicator(self, slimItem, *args): 321 indicator = self.GetRadialMenuIndicator(create=True) 322 indicator.display = True 323 324 def HideRadialMenuIndicator(self, slimItem, *args): 325 indicator = self.GetRadialMenuIndicator(create=False) 326 if indicator: 327 indicator.display = False 328 329 @classmethod 330 def GetCopyData(cls, node): 331 return node.label