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)