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

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)