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

decorationsPanel.py (13044B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\neocom\charsheet\decorationsPanel.py
      2 import carbonui.const as uiconst
      3 from carbonui.button.group import ButtonGroup
      4 from carbonui.control.tabGroup import TabGroup
      5 from carbonui.primitives.container import Container
      6 from carbonui.primitives.containerAutoSize import ContainerAutoSize
      7 from eve.client.script.ui.control.entries.util import GetFromClass
      8 from eve.client.script.ui.control.eveScroll import Scroll
      9 from eve.client.script.ui.services.medals import DecorationPermissionsEntry
     10 from eve.client.script.ui.shared.neocom.charsheet.charSheetUtil import GetMedalScrollEntries, GetTitleScrollEntries
     11 from eve.client.script.ui.shared.pointerTool import pointerToolConst as pConst
     12 from eve.client.script.ui.util.uix import ListWnd
     13 from localization import GetByLabel
     14 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     15 PANEL_PERMISSIONS = 'mydecorations_permissions'
     16 PANEL_MEDALS = 'mydecorations_medals'
     17 PANEL_RANKS = 'mydecorations_ranks'
     18 PANEL_TITLES = 'mydecorations_titles'
     19 
     20 class DecorationsPanel(Container):
     21     default_name = 'DecorationsPanel'
     22     _class_pending_open_titles = False
     23     _class_pending_title_uuid = None
     24     __notifyevents__ = ['OnRankChange',
     25      'OnUpdatedMedalsAvailable',
     26      'OnUpdatedMedalStatusAvailable',
     27      'OnTitleGrantedNotificationClicked']
     28 
     29     def ApplyAttributes(self, attributes):
     30         Container.ApplyAttributes(self, attributes)
     31         sm.RegisterNotify(self)
     32         btns = [(GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/SaveDecorationPermissionChanges'),
     33           self.SaveDecorationPermissionsChanges,
     34           (),
     35           64), (GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/SetAllDecorationPermissions'),
     36           self.SetAllDecorationPermissions,
     37           (),
     38           64)]
     39         self.mainAreaButtons = ContainerAutoSize(align=uiconst.TOBOTTOM, parent=self)
     40         ButtonGroup(btns=btns, parent=self.mainAreaButtons, line=False)
     41         self.decoMedalList = None
     42         self.decoRankList = None
     43         self.decoTitleList = None
     44         self._pending_open_titles = DecorationsPanel._class_pending_open_titles
     45         DecorationsPanel._class_pending_open_titles = False
     46         self._pending_scroll_title_uuid = DecorationsPanel._class_pending_title_uuid
     47         DecorationsPanel._class_pending_title_uuid = None
     48         self._title_blinker = None
     49         self.scroll = Scroll(parent=self, padding=(0, 4, 0, 4))
     50         self.mydecorationstabs = TabGroup(name='tabparent', parent=self, idx=0, groupID='cs_decorations', autoselecttab=False)
     51         self.mydecorationstabs.AddTab(GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Titles'), self.scroll, self, PANEL_TITLES, uniqueName=pConst.UNIQUE_NAME_TITLES)
     52         self.mydecorationstabs.AddTab(GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Ranks'), self.scroll, self, PANEL_RANKS)
     53         self.mydecorationstabs.AddTab(GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Medals'), self.scroll, self, PANEL_MEDALS)
     54         self.mydecorationstabs.AddTab(GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Permissions'), self.scroll, self, PANEL_PERMISSIONS)
     55 
     56     def LoadPanel(self, *args):
     57         if self._pending_scroll_title_uuid is not None:
     58             self.mydecorationstabs.SelectByID(PANEL_TITLES)
     59             if self._pending_scroll_title_uuid is not None and self.display and self._is_ancestor_chain_displayed():
     60                 self.ShowMyTitles()
     61         elif self._pending_open_titles:
     62             self._pending_open_titles = False
     63             self.mydecorationstabs.SelectByID(PANEL_TITLES)
     64             self.ShowMyTitles()
     65         else:
     66             self.mydecorationstabs.AutoSelect()
     67 
     68     def SaveDecorationPermissionsChanges(self):
     69         promptForDelete = False
     70         changes = {}
     71         for entry in self.scroll.GetNodes():
     72             if entry.panel and hasattr(entry.panel, 'flag'):
     73                 if entry.panel.HasChanged():
     74                     if entry.panel.flag == 1:
     75                         promptForDelete = True
     76                     changes[entry.panel.sr.node.itemID] = entry.panel.flag
     77 
     78         if promptForDelete == False or prompt_player_fsd_dialog('DeleteMedalConfirmation', {}, uiconst.YESNO) == uiconst.ID_YES:
     79             if len(changes) > 0:
     80                 sm.StartService('medals').SetMedalStatus(changes)
     81         self.decoMedalList = None
     82         self.decoTitleList = None
     83 
     84     def SetAllDecorationPermissions(self):
     85         permissionList = [(GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Private'), 2), (GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Public'), 3)]
     86         pickedPermission = ListWnd(permissionList, 'generic', GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/SetAllDecorationPermissions'), GetByLabel('UI/CharacterSheet/CharacterSheetWindow/PilotLicense/SaveAllChangesImmediately'), windowName='permissionPickerWnd')
     87         if not pickedPermission:
     88             return
     89         permissionID = pickedPermission[1]
     90         m, _ = sm.StartService('medals').GetMedalsReceived(session.charid)
     91         myDecos = []
     92         for each in m:
     93             if each.status != 1:
     94                 myDecos.append(each.medalID)
     95 
     96         myDecos = list(set(myDecos))
     97         updateDict = {}
     98         for decoID in myDecos:
     99             updateDict[decoID] = permissionID
    100 
    101         if len(updateDict) > 0:
    102             sm.StartService('medals').SetMedalStatus(updateDict)
    103             self.decoMedalList = None
    104             self.ShowMyDecorations('mydecorations_permissions')
    105 
    106     def Load(self, key):
    107         self.ShowMyDecorations(key)
    108 
    109     def ShowMyDecorations(self, key = None):
    110         if key != PANEL_TITLES:
    111             self._stop_title_blinker()
    112         if key == PANEL_RANKS:
    113             self.ShowMyRanks()
    114         elif key == PANEL_MEDALS:
    115             self.ShowMyMedals()
    116         elif key == PANEL_PERMISSIONS:
    117             self.ShowMyDecorationPermissions()
    118         elif key == PANEL_TITLES:
    119             self.ShowMyTitles()
    120 
    121     def ShowMyMedals(self, charID = None):
    122         self.mainAreaButtons.Hide()
    123         if charID is None:
    124             charID = session.charid
    125         if self.decoMedalList is None:
    126             self.decoMedalList = GetMedalScrollEntries(charID)
    127         self.scroll.sr.id = 'charsheet_mymedals'
    128         self.scroll.Load(contentList=self.decoMedalList, noContentHint=GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/NoMedals'))
    129 
    130     def ShowMyTitles(self):
    131         self.mainAreaButtons.Hide()
    132         if self.decoTitleList is None:
    133             self.decoTitleList = GetTitleScrollEntries()
    134         self.scroll.sr.id = 'charsheet_mytitles'
    135         self.scroll.display = True
    136         self.scroll.Load(contentList=self.decoTitleList, noContentHint=GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Titles/NoContentHint'))
    137         if self._pending_scroll_title_uuid is not None and self.display:
    138             self._scroll_to_title(self._pending_scroll_title_uuid)
    139             self._pending_scroll_title_uuid = None
    140 
    141     def ShowMyRanks(self):
    142         self.mainAreaButtons.Hide()
    143         if self.decoRankList is None:
    144             scrolllist = []
    145             characterRanks = sm.StartService('facwar').GetCharacterRankOverview(session.charid)
    146             for characterRank in characterRanks:
    147                 entry = sm.StartService('info').GetRankEntry(characterRank)
    148                 if entry:
    149                     scrolllist.append(entry)
    150 
    151             self.decoRankList = scrolllist[:]
    152         self.scroll.sr.id = 'charsheet_myranks'
    153         self.scroll.Load(contentList=self.decoRankList, noContentHint=GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/NoRanks'))
    154 
    155     def ShowMyDecorationPermissions(self):
    156         self.mainAreaButtons.Show()
    157         scrollHeaders = [GetByLabel('UI/CharacterCreation/FirstName'),
    158          GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Private'),
    159          GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Public'),
    160          GetByLabel('UI/PI/Common/Remove')]
    161         self.scroll.sr.fixedColumns = {GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Private'): 60,
    162          GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Public'): 60}
    163         self.scroll.sr.id = 'charsheet_decopermissions'
    164         self.scroll.Load(contentList=[], headers=scrollHeaders)
    165         self.scroll.OnColumnChanged = self.OnDecorationPermissionsColumnChanged
    166         publicDeco = sm.StartService('medals').GetMedalsReceivedWithFlag(session.charid, [3])
    167         privateDeco = sm.StartService('medals').GetMedalsReceivedWithFlag(session.charid, [2])
    168         ppKeys = [ each for each in publicDeco.keys() + privateDeco.keys() ]
    169         scrolllist = []
    170         inMedalList = []
    171         characterMedals, characterMedalInfo = sm.StartService('medals').GetMedalsReceived(session.charid)
    172         for characterMedal in characterMedals:
    173             medalID = characterMedal.medalID
    174             if medalID not in ppKeys:
    175                 continue
    176             if medalID in inMedalList:
    177                 continue
    178             inMedalList.append(medalID)
    179             details = characterMedalInfo.Filter('medalID')
    180             if details and medalID in details:
    181                 details = details.get(medalID)
    182             entry = self.CreateDecorationPermissionsEntry(characterMedal)
    183             if entry:
    184                 scrolllist.append(entry)
    185 
    186         self.scroll.Load(contentList=scrolllist, headers=scrollHeaders, noContentHint=GetByLabel('UI/Common/NothingFound'))
    187         self.OnDecorationPermissionsColumnChanged()
    188 
    189     def CreateDecorationPermissionsEntry(self, data):
    190         return GetFromClass(DecorationPermissionsEntry, {'line': 1,
    191          'label': data.title + '<t><t><t>',
    192          'itemID': data.medalID,
    193          'visibilityFlags': data.status,
    194          'indent': 3,
    195          'selectable': 0})
    196 
    197     def OnDecorationPermissionsColumnChanged(self, *args, **kwargs):
    198         for entry in self.scroll.GetNodes():
    199             if entry.panel and getattr(entry.panel, 'OnColumnChanged', None):
    200                 entry.panel.OnColumnChanged()
    201 
    202     def OnRankChange(self, oldrank, newrank):
    203         if not session.warfactionid:
    204             return
    205         self.decoRankList = None
    206         if self.display:
    207             self.LoadPanel()
    208 
    209     def OnUpdatedMedalsAvailable(self):
    210         self.ReloadMedals()
    211 
    212     def OnUpdatedMedalStatusAvailable(self):
    213         self.ReloadMedals()
    214 
    215     def ReloadMedals(self):
    216         self.decoMedalList = None
    217         if self.display:
    218             self.LoadPanel()
    219 
    220     def OnTitleGrantedNotificationClicked(self, title_uuid_str):
    221         self._pending_scroll_title_uuid = title_uuid_str
    222         DecorationsPanel._class_pending_title_uuid = None
    223         self.decoTitleList = None
    224         self.LoadPanel()
    225 
    226     def UnloadPanel(self):
    227         self._stop_title_blinker()
    228 
    229     def _start_title_blinker(self, entry_panel):
    230         import uiblinker
    231         import uthread2
    232         self._stop_title_blinker()
    233         handle = uiblinker.start_box(uiblinker.ElementReference(entry_panel))
    234         self._title_blinker = handle
    235 
    236         def _auto_stop():
    237             uthread2.sleep(3.0)
    238             if self._title_blinker is handle:
    239                 self._stop_title_blinker()
    240 
    241         uthread2.start_tasklet(_auto_stop)
    242 
    243     def _stop_title_blinker(self):
    244         if self._title_blinker is not None:
    245             self._title_blinker.dispose()
    246             self._title_blinker = None
    247 
    248     def _is_ancestor_chain_displayed(self):
    249         obj = self.parent
    250         while obj is not None:
    251             if not obj.display:
    252                 return False
    253             obj = getattr(obj, 'parent', None)
    254 
    255         return True
    256 
    257     def _scroll_to_title(self, title_uuid_str):
    258         for node in self.scroll.GetNodes():
    259             identifier = getattr(node, 'identifier', None)
    260             if identifier is not None and str(identifier.uuid) == title_uuid_str:
    261                 self.scroll.ScrollToNode(node)
    262                 if node.panel and not node.panel.destroyed:
    263                     self._start_title_blinker(node.panel)
    264                 else:
    265                     import uthread2
    266                     uthread2.start_tasklet(self._scroll_and_blink_deferred, title_uuid_str)
    267                 break
    268 
    269     def _scroll_and_blink_deferred(self, title_uuid_str):
    270         import uthread2
    271         uthread2.sleep(0.1)
    272         for _ in range(10):
    273             if self.destroyed:
    274                 return
    275             for node in self.scroll.GetNodes():
    276                 identifier = getattr(node, 'identifier', None)
    277                 if identifier is not None and str(identifier.uuid) == title_uuid_str:
    278                     self.scroll.ScrollToNode(node)
    279                     if node.panel and not node.panel.destroyed:
    280                         self._start_title_blinker(node.panel)
    281                         return
    282                     break
    283 
    284             uthread2.sleep(0.05)