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

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