bookmarkContainerWindow.py (18029B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\bookmarks\bookmarkContainerWindow.py 2 import carbonui.const as uiconst 3 import eveicon 4 from carbonui.control.combo import Combo 5 from menu import MenuLabel 6 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText 7 from carbonui.primitives.container import Container 8 from carbonui.primitives.containerAutoSize import ContainerAutoSize 9 from carbonui.primitives.sprite import Sprite 10 from carbonui.button.group import ButtonGroup 11 from carbonui.control.radioButton import RadioButton 12 from eve.client.script.ui.control.eveEditPlainText import EditPlainText 13 from eve.client.script.ui.control.eveLabel import EveLabelMedium 14 from carbonui.control.window import Window 15 from eve.client.script.ui.control.infoIcon import MoreInfoIcon 16 from eve.client.script.ui.shared.bookmarks.link import bookmark_folder_link 17 from eve.client.script.ui.structure.structureSettings import AreGroupNodes, GetGroupIDFromNode 18 from eve.common.lib.appConst import MAX_ACTIVE_PERSONAL_BOOKMARK_FOLDERS, MAX_ACTIVE_SHARED_BOOKMARK_FOLDERS, MAX_BOOKMARKS_IN_PERSONAL_FOLDER, MAX_BOOKMARKS_IN_SHARED_FOLDER, MAX_FOLDER_DESCRIPTION_LENGTH, MAX_FOLDER_NAME_LENGTH, MAX_KNOWN_BOOKMARK_FOLDERS 19 from eve.common.script.sys.idCheckers import IsNPCCorporation 20 from eveexceptions import UserError 21 from localization import GetByLabel 22 from player_messaging.client.ui_message import prompt_player_fsd_dialog 23 24 class BookmarkContainerWindow(Window): 25 __guid__ = 'BookmarkContainerWindow' 26 default_windowID = 'bookmarkFolderWindow' 27 28 def ApplyAttributes(self, attributes): 29 Window.ApplyAttributes(self, attributes) 30 self.folder = attributes.get('folder', None) 31 accessGroups = self.GetAccessGroups() 32 self.accessGroupOptions = [] 33 for accessGroupID, accessGroup in accessGroups.iteritems(): 34 groupDisplayName = cfg.eveowners.Get(accessGroup.creatorID).name if IsNPCCorporation(accessGroup.creatorID) else accessGroup.name 35 self.accessGroupOptions.append((groupDisplayName, accessGroupID)) 36 37 self.accessGroupOptions.sort() 38 self.accessGroupOptions.append((GetByLabel('UI/AclBookmarks/NoAccessList'), -1)) 39 if self.folder is None: 40 self.SetCaption(GetByLabel('UI/AclBookmarks/NewFolder')) 41 self.isNew = True 42 self.isPersonal = True 43 else: 44 self.SetCaption(GetByLabel('UI/AclBookmarks/EditBookmarkFolder')) 45 self.isNew = False 46 self.isPersonal = self.folder.isPersonal 47 if not self.isPersonal: 48 groupIDs = {self.folder.viewGroupID, 49 self.folder.useGroupID, 50 self.folder.manageGroupID, 51 self.folder.adminGroupID} 52 for groupID in groupIDs: 53 if groupID not in accessGroups: 54 self.AddGroup(groupID) 55 56 self.SetMinSize([280, 420]) 57 rowPadding = (0, 4, 0, 4) 58 self.mainCont = Container(name='mainCont', parent=self.sr.main, align=uiconst.TOALL, left=4, width=4) 59 buttonGroup = ButtonGroup(name='buttonGroup', parent=self.mainCont, padTop=8) 60 submitButton = buttonGroup.AddButton(GetByLabel('UI/Common/Submit'), self.Confirm) 61 buttonGroup.AddButton(GetByLabel('UI/Common/Cancel'), self.Cancel) 62 labelContainer = ContainerAutoSize(name='labelContainer', parent=self.mainCont, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, padding=rowPadding) 63 self.accessGroupOptionsContainer = ContainerAutoSize(name='accessGroupOptionsContainer', parent=self.mainCont, align=uiconst.TOBOTTOM, alignMode=uiconst.TOTOP, padding=rowPadding) 64 nameLabel = EveLabelMedium(text=GetByLabel('UI/PeopleAndPlaces/Name'), parent=labelContainer, align=uiconst.CENTERLEFT) 65 self.nameEdit = SingleLineEditText(name='nameEdit', setvalue=self.folder.folderName if self.folder else '', parent=labelContainer, align=uiconst.TOTOP, width=0, maxLength=MAX_FOLDER_NAME_LENGTH, OnReturn=self.Confirm) 66 typeContainer = Container(name='typeContainer', parent=self.mainCont, align=uiconst.TOBOTTOM, top=8, height=40, padding=rowPadding) 67 typeLabel = EveLabelMedium(name='typeLabel', parent=typeContainer, text=GetByLabel('UI/AclBookmarks/FolderType'), align=uiconst.TOPLEFT) 68 infoContainer = Container(name='infoContainer', parent=typeContainer, align=uiconst.TORIGHT, width=20) 69 selectionContainer = Container(name='selectionContainer', parent=typeContainer, align=uiconst.TOALL) 70 if self.isNew: 71 RadioButton(text=GetByLabel('UI/AclBookmarks/PersonalFolderType'), groupname='isPersonalSelection', parent=selectionContainer, settingsKey='isPersonal', checked=self.isPersonal, retval=True, align=uiconst.TOTOP, callback=self.OnIsPersonalCheckBoxChange) 72 RadioButton(text=GetByLabel('UI/AclBookmarks/SharedFolderType'), groupname='isPersonalSelection', parent=selectionContainer, settingsKey='isPersonal', checked=not self.isPersonal, retval=False, align=uiconst.TOTOP, callback=self.OnIsPersonalCheckBoxChange) 73 else: 74 if self.isPersonal: 75 text = GetByLabel('UI/AclBookmarks/PersonalFolderType') 76 texturePath = eveicon.folder 77 hint = GetByLabel('UI/AclBookmarks/PersonalFolderType') 78 else: 79 text = GetByLabel('UI/AclBookmarks/SharedFolderType') 80 texturePath = eveicon.shared_folder 81 hint = GetByLabel('UI/AclBookmarks/SharedFolderType') 82 Sprite(parent=selectionContainer, align=uiconst.TOPLEFT, pos=(0, 0, 16, 16), texturePath=texturePath, hint=hint) 83 folderTypeLabel = EveLabelMedium(text=text, parent=selectionContainer, align=uiconst.TOTOP, left=20) 84 typeContainer.height = max(20, folderTypeLabel.textheight, typeLabel.textheight) 85 moreInfoIcon = MoreInfoIcon(parent=infoContainer, align=uiconst.CENTER) 86 moreInfoIcon.LoadTooltipPanel = self.LoadMoreInfoTooltipPanel 87 descriptionContainer = Container(name='descriptionContainer', parent=self.mainCont, align=uiconst.TOALL, top=8, padding=rowPadding) 88 descLabel = EveLabelMedium(text=GetByLabel('UI/PeopleAndPlaces/Notes'), parent=descriptionContainer, align=uiconst.TOPLEFT) 89 self.notesEdit = EditPlainText(name='notesEdit', setvalue=self.folder.description if self.folder else '', parent=descriptionContainer, align=uiconst.TOALL, maxLength=MAX_FOLDER_DESCRIPTION_LENGTH, countWithTags=True) 90 left = max(nameLabel.left + nameLabel.textwidth, descLabel.left + descLabel.textwidth, typeLabel.left + typeLabel.textwidth) 91 self.nameEdit.padLeft = self.notesEdit.padLeft = selectionContainer.padLeft = left + 10 92 if self.isPersonal: 93 self.HideAccessGroupOptions() 94 else: 95 self.LoadAccessGroupOptions() 96 submitButton.OnSetFocus() 97 98 def LoadMoreInfoTooltipPanel(self, tooltipPanel, *args): 99 helpText = GetByLabel('UI/AclBookmarks/CreateFolderHelpText', maxPersonalBookmarks=MAX_BOOKMARKS_IN_PERSONAL_FOLDER, maxSharedBookmarks=MAX_BOOKMARKS_IN_SHARED_FOLDER, maxPersonalFolders=MAX_ACTIVE_PERSONAL_BOOKMARK_FOLDERS, maxSharedFolders=MAX_ACTIVE_SHARED_BOOKMARK_FOLDERS) 100 tooltipPanel.LoadStandardSpacing() 101 tooltipPanel.AddTextBodyLabel(text=helpText, wrapWidth=300) 102 103 def LoadAccessGroupOptions(self): 104 self.accessGroupOptionsContainer.Flush() 105 self.accessGroupOptionsContainer.display = True 106 self.viewGroupContainer, self.viewGroupCombo, viewLabel = self.GetAccessGroupComboAndCont('viewGroup', GetByLabel('UI/AclBookmarks/ViewAccess'), self.OnDroppedGroupView, self.folder.viewGroupID if self.folder else None) 107 self.useGroupContainer, self.useGroupCombo, useLabel = self.GetAccessGroupComboAndCont('useGroup', GetByLabel('UI/AclBookmarks/UseAccess'), self.OnDroppedGroupUse, self.folder.useGroupID if self.folder else None) 108 self.manageGroupContainer, self.manageGroupCombo, manageLabel = self.GetAccessGroupComboAndCont('manageGroup', GetByLabel('UI/AclBookmarks/ManageAccess'), self.OnDroppedGroupManage, self.folder.manageGroupID if self.folder else None) 109 self.adminGroupContainer, self.adminGroupCombo, adminLabel = self.GetAccessGroupComboAndCont('adminGroup', GetByLabel('UI/AclBookmarks/AdminAccess'), self.OnDroppedGroupAdmin, self.folder.adminGroupID if self.folder else None) 110 left = max(useLabel.textwidth, viewLabel.textwidth, manageLabel.textwidth, adminLabel.textwidth, 80) 111 left += useLabel.left + 4 112 for each in (self.viewGroupCombo, 113 self.useGroupCombo, 114 self.manageGroupCombo, 115 self.adminGroupCombo): 116 each.padLeft = left 117 118 def GetAccessGroupComboAndCont(self, configName, text, dropFunc, selectedGroupID): 119 if not selectedGroupID: 120 selectedGroupID = -1 121 cont = ContainerAutoSize(name='%sCont' % configName, parent=self.accessGroupOptionsContainer, align=uiconst.TOTOP, alignMode=uiconst.TOTOP, padBottom=4) 122 label = EveLabelMedium(text=text, parent=cont, align=uiconst.CENTERLEFT) 123 combo = DropCombo(parent=cont, name='%sCombo' % configName, align=uiconst.TOTOP, options=self.accessGroupOptions, select=selectedGroupID, dropped=dropFunc) 124 return (cont, combo, label) 125 126 def HideAccessGroupOptions(self): 127 self.accessGroupOptionsContainer.display = False 128 129 def GetAccessGroups(self): 130 accessGroupsController = sm.GetService('structureControllers').GetAccessGroupController() 131 return accessGroupsController.GetMyGroups() 132 133 def OnIsPersonalCheckBoxChange(self, radioButton): 134 self.isPersonal = radioButton.GetReturnValue() 135 if self.isPersonal: 136 self.HideAccessGroupOptions() 137 else: 138 self.LoadAccessGroupOptions() 139 140 def AddGroup(self, newGroupID): 141 if newGroupID: 142 newGroup = sm.GetService('structureControllers').GetAccessGroupController().GetGroupInfoFromID(newGroupID, fetchToServer=True) 143 groupDisplayName = cfg.eveowners.Get(newGroup.creatorID).name if IsNPCCorporation(newGroup.creatorID) else newGroup.name 144 self.accessGroupOptions.append((groupDisplayName, newGroupID)) 145 146 def OnDroppedGroupView(self, newGroupID): 147 for groupName, groupID in self.accessGroupOptions: 148 if groupID == newGroupID: 149 self.viewGroupCombo.SetValue(newGroupID) 150 return 151 152 self.AddGroup(newGroupID) 153 self.viewGroupCombo.entries = self.accessGroupOptions 154 self.viewGroupCombo.SetValue(newGroupID) 155 156 def OnDroppedGroupUse(self, newGroupID): 157 for groupName, groupID in self.accessGroupOptions: 158 if groupID == newGroupID: 159 self.useGroupCombo.SetValue(newGroupID) 160 return 161 162 self.AddGroup(newGroupID) 163 self.useGroupCombo.entries = self.accessGroupOptions 164 self.useGroupCombo.SetValue(newGroupID) 165 166 def OnDroppedGroupManage(self, newGroupID): 167 for groupName, groupID in self.accessGroupOptions: 168 if groupID == newGroupID: 169 self.manageGroupCombo.SetValue(newGroupID) 170 return 171 172 self.AddGroup(newGroupID) 173 self.manageGroupCombo.entries = self.accessGroupOptions 174 self.manageGroupCombo.SetValue(newGroupID) 175 176 def OnDroppedGroupAdmin(self, newGroupID): 177 for groupName, groupID in self.accessGroupOptions: 178 if groupID == newGroupID: 179 self.adminGroupCombo.SetValue(newGroupID) 180 return 181 182 self.AddGroup(newGroupID) 183 self.adminGroupCombo.entries = self.accessGroupOptions 184 self.adminGroupCombo.SetValue(newGroupID) 185 186 def Confirm(self, *args): 187 name = self.nameEdit.GetValue() 188 name = name.strip() 189 if not name: 190 raise UserError('CustomInfo', {'info': GetByLabel('UI/Map/MapPallet/msgPleaseTypeSomething')}) 191 description = self.notesEdit.GetValue() 192 isPersonal = self.isPersonal 193 if isPersonal: 194 adminGroupID = None 195 manageGroupID = None 196 useGroupID = None 197 viewGroupID = None 198 else: 199 adminGroupID = self.adminGroupCombo.GetValue() 200 if not adminGroupID or adminGroupID == -1: 201 raise UserError('AdminAccessRequired') 202 manageGroupID = self.manageGroupCombo.GetValue() 203 if manageGroupID == -1: 204 manageGroupID = None 205 useGroupID = self.useGroupCombo.GetValue() 206 if useGroupID == -1: 207 useGroupID = None 208 viewGroupID = self.viewGroupCombo.GetValue() 209 if viewGroupID == -1: 210 viewGroupID = None 211 folders = sm.GetService('bookmarkSvc').GetFolders() 212 currentFolderID = self.folder.folderID if self.folder else None 213 if self.isNew: 214 if len(folders) >= MAX_KNOWN_BOOKMARK_FOLDERS: 215 raise UserError('TooManyKnownFolders', {'maxKnownFolders': MAX_KNOWN_BOOKMARK_FOLDERS}) 216 activeFolders = len([ folder.folderID for folder in folders.itervalues() if folder.isActive and folder.isPersonal == isPersonal ]) 217 maxActiveFolders = MAX_ACTIVE_PERSONAL_BOOKMARK_FOLDERS if isPersonal else MAX_ACTIVE_SHARED_BOOKMARK_FOLDERS 218 if activeFolders >= maxActiveFolders: 219 if isPersonal: 220 if not prompt_player_fsd_dialog('ConfirmCreateAsInactivePersonalFolder', {'maxPersonalFolders': MAX_ACTIVE_PERSONAL_BOOKMARK_FOLDERS}, uiconst.YESNO, uiconst.ID_YES) == uiconst.ID_YES: 221 return 222 elif not prompt_player_fsd_dialog('ConfirmCreateAsInactiveSharedFolder', {'maxSharedFolders': MAX_ACTIVE_SHARED_BOOKMARK_FOLDERS}, uiconst.YESNO, uiconst.ID_YES) == uiconst.ID_YES: 223 return 224 existingFolderNames = {x.folderName for x in folders.itervalues() if x.folderID != currentFolderID} 225 if name in existingFolderNames: 226 if not prompt_player_fsd_dialog('ConfirmCreateFolderWithDuplicateName', {}, uiconst.YESNO, uiconst.ID_YES) == uiconst.ID_YES: 227 return 228 if self.isNew: 229 folder = sm.GetService('bookmarkSvc').CreateBookmarkFolder(isPersonal, name, description, adminGroupID, manageGroupID, useGroupID, viewGroupID) 230 self.DisplaySuccessPopup(folder) 231 else: 232 sm.GetService('bookmarkSvc').UpdateBookmarkFolder(self.folder.folderID, name, description, adminGroupID, manageGroupID, useGroupID, viewGroupID) 233 self.Close() 234 235 def DisplaySuccessPopup(self, folder): 236 if not folder or folder.isPersonal: 237 return 238 link = bookmark_folder_link(folder.folderID, folder.folderName) 239 prompt_player_fsd_dialog('SharedLocationFolderCreated', {'folderName': folder.folderName, 240 'folderLink': link}, modal=False) 241 242 def Cancel(self, *args): 243 self.Close() 244 245 246 class DropCombo(Combo): 247 default_name = 'dropCombo' 248 default_dropped = None 249 250 def ApplyAttributes(self, attributes): 251 Combo.ApplyAttributes(self, attributes) 252 self._emptyTooltip = attributes.get('emptyTooltip', '') 253 self.OnDroppedData = attributes.get('dropped', self.default_dropped) 254 255 def OnDropData(self, dragSource, dragData): 256 if not dragData: 257 return 258 if not AreGroupNodes(dragData): 259 return 260 groupIDsToAdd = filter(None, [ GetGroupIDFromNode(eachNode) for eachNode in dragData ]) 261 if groupIDsToAdd: 262 groupIDToAdd = groupIDsToAdd[0] 263 self.OnDroppedData(groupIDToAdd) 264 265 def LoadTooltipPanel(self, tooltipPanel, *args): 266 groupID = self.GetValue() 267 if not groupID or groupID == -1: 268 self._TryLoadEmptyTooltip(tooltipPanel) 269 return 270 from eve.client.script.ui.structure.accessGroups.groupInfoWnd import GetGroupInfo 271 groupInfo = GetGroupInfo(groupID) 272 if not groupInfo: 273 self._TryLoadEmptyTooltip(tooltipPanel) 274 return 275 tooltipPanel.LoadGeneric1ColumnTemplate() 276 tooltipPanel.margin = (8, 8, 8, 8) 277 groupDisplayName = cfg.eveowners.Get(groupInfo.creatorID).name if IsNPCCorporation(groupInfo.creatorID) else groupInfo['name'] 278 groupDesc = groupInfo['description'] 279 EveLabelMedium(parent=tooltipPanel, text=groupDisplayName, align=uiconst.TOTOP) 280 admins = groupInfo['admins'] 281 if groupDesc: 282 tooltipPanel.AddLabelMedium(text=groupDesc, padTop=6) 283 text = GetByLabel('UI/Structures/AccessGroups/GroupOwner', ownerName='') 284 tooltipPanel.AddLabelMedium(text=text, padTop=6) 285 cfg.eveowners.Prime(admins) 286 adminNames = [ cfg.eveowners.Get(adminID).name for adminID in admins ] 287 maxAdmins = 6 288 for charName in adminNames[:maxAdmins]: 289 tooltipPanel.AddLabelMedium(text=charName) 290 291 if len(adminNames) > maxAdmins: 292 tooltipPanel.AddLabelMedium(text='...') 293 294 def _TryLoadEmptyTooltip(self, tooltipPanel): 295 if not self._emptyTooltip: 296 return 297 tooltipPanel.LoadGeneric1ColumnTemplate() 298 tooltipPanel.margin = (8, 8, 8, 8) 299 tooltipPanel.AddLabelMedium(text=self._emptyTooltip, maxWidth=200) 300 301 def GetMenu(self, *args): 302 groupID = self.GetValue() 303 if not groupID: 304 return [] 305 return [(MenuLabel('UI/AclBookmarks/ShowAccessListInfo'), self.ShowAccessGroupInfo)] 306 307 def ShowAccessGroupInfo(self): 308 from eve.client.script.ui.structure.accessGroups.groupInfoWnd import GroupInfoWnd 309 groupID = self.GetValue() 310 GroupInfoWnd.Open(groupID=groupID, windowID='groupInfoWnd_%s' % groupID) 311 312 def OnMouseDown(self, button, *args): 313 if button == uiconst.MOUSERIGHT: 314 return 315 if self._disabled: 316 return 317 Combo.OnMouseDown(self, button, *args)