bookmarkUtil.py (6194B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\util\bookmarkUtil.py 2 import eveicon 3 import localization 4 import HTMLParser 5 import blue 6 import cgi 7 import telemetry 8 from collections import defaultdict 9 from carbonui.control.contextMenu.menuConst import DISABLED_ENTRY0 10 from carbonui.control.contextMenu.menuEntryData import MenuEntryDataCaption, MenuEntryData 11 from carbonui.primitives.sprite import Sprite 12 from carbonui.uiconst import CENTERLEFT, UI_DISABLED 13 from carbonui.control.contextMenu.menuEntryView import MenuEntryView 14 from eve.client.script.ui.services.menuSvcExtras import movementFunctions 15 from eve.common.lib import appConst 16 from eve.common.script.mgt.bookmarkConst import SHARED_BOOKMARK_DELAY 17 from eveservices.menu import GetMenuService 18 from localization import GetByLabel 19 from inventorycommon.const import ownerSystem 20 from menu import MenuList 21 BOOKMARK_RIGHTCLICK_GROUPING_THRESHOLD = 8 22 BOOKMARK_RIGHTCLICK_GROUPING_TOTAL_THRESHOLD = 30 23 24 def GetBookmarkMenu(bookmarks, isPersonal = True): 25 26 def BookmarkMenuBuilder(bookmark): 27 return GetMenuService().BookmarkMenu(bookmark) 28 29 menu = MenuList() 30 for i, bookmark in enumerate(bookmarks): 31 hint, comment = sm.GetService('bookmarkSvc').UnzipMemo(bookmark.memo) 32 hint = HTMLParser.HTMLParser().unescape(hint) 33 hint = hint if len(hint) < 25 else hint[:25] 34 hint = cgi.escape(hint) 35 if isPersonal: 36 menuClass = PersonalBookmarkMenuEntryView 37 else: 38 menuClass = SharedBookmarkMenuEntryView 39 menu.append(MenuEntryData(hint, subMenuData=lambda _bookmark = bookmark: BookmarkMenuBuilder(_bookmark), menuEntryViewClass=menuClass, func=lambda _bookmark = bookmark: movementFunctions.WarpToBookmark(_bookmark, warpRange=0))) 40 if i > 250: 41 break 42 43 return localization.util.Sort(menu, key=lambda x: x.text) 44 45 46 def GetFolderedMenuACL(bookmarksBySubfolder, subfolders, label, isPersonal, isSubMenu = True): 47 ret = [] 48 nonFolderedBookmarks = [] 49 icon = eveicon.folder if isPersonal else eveicon.shared_folder 50 for subfolderID, bookmarks in bookmarksBySubfolder.iteritems(): 51 if subfolderID is None: 52 continue 53 subMenu = GetBookmarkMenu(bookmarks, isPersonal=isPersonal) 54 try: 55 ret.append(MenuEntryData(ConvertSubfolderName(subfolders[subfolderID]), subMenuData=subMenu, texturePath=icon)) 56 except KeyError: 57 nonFolderedBookmarks.extend(subMenu) 58 59 ret = localization.util.Sort(ret, key=lambda x: x.text) 60 nonFolderedBookmarks.extend(GetBookmarkMenu(bookmarksBySubfolder[None], isPersonal=isPersonal)) 61 ret.extend(nonFolderedBookmarks) 62 if isSubMenu: 63 ret = [MenuEntryData(label, subMenuData=ret, texturePath=icon)] 64 else: 65 ret = [MenuEntryData(label, texturePath=icon)] + ret 66 return MenuList(ret) 67 68 69 @telemetry.ZONE_FUNCTION 70 def GetACLBookmarkMenuForSystem(bookmarks, folders, subfolders, includeTopLevel = True): 71 ret = MenuList() 72 now = blue.os.GetWallclockTime() 73 validBookmarks = [ bookmark for bookmark in bookmarks.itervalues() if bookmark.locationID == session.locationid and IsBookmarkAvailable(bookmark.creatorID, bookmark.created, now) ] 74 bookmarksByFolderBySubfolder = defaultdict(lambda : defaultdict(set)) 75 for bookmark in validBookmarks: 76 bookmarksByFolderBySubfolder[bookmark.folderID][bookmark.subfolderID].add(bookmark) 77 78 totalLength = 0 79 foldersByFolderType = defaultdict(list) 80 for folder in folders.itervalues(): 81 bookmarksBySubfolder = bookmarksByFolderBySubfolder[folder.folderID] 82 bookmarkCount = sum((len(subfolder) for subfolder in bookmarksBySubfolder.itervalues())) 83 if not bookmarkCount: 84 continue 85 entryLength = len(bookmarksBySubfolder) 86 if None in bookmarksBySubfolder: 87 entryLength += len(bookmarksBySubfolder[None]) 88 entryLength -= 1 89 totalLength += entryLength + 1 90 folderType = 'personalFolder' if folder.isPersonal else 'sharedFolder' 91 foldersByFolderType[folderType].append((folder, entryLength)) 92 93 alwaysGroup = totalLength > BOOKMARK_RIGHTCLICK_GROUPING_TOTAL_THRESHOLD 94 for folderType, labelPath in [('personalFolder', 'UI/PeopleAndPlaces/PersonalLocations'), ('sharedFolder', 'UI/PeopleAndPlaces/SharedLocations')]: 95 foldersOfType = foldersByFolderType.get(folderType) 96 if not foldersOfType: 97 continue 98 foldersOfType = localization.util.Sort(foldersOfType, key=lambda x: x[0].folderName) 99 ret.append(MenuEntryDataCaption(GetByLabel(labelPath))) 100 for eachFolder, entryLength in foldersOfType: 101 isSubMenu = alwaysGroup 102 folderMenu = GetFolderedMenuACL(bookmarksByFolderBySubfolder[eachFolder.folderID], subfolders, eachFolder.folderName, eachFolder.isPersonal, isSubMenu=isSubMenu) 103 ret.extend(folderMenu) 104 105 if len(ret) and includeTopLevel: 106 ret = [MenuEntryData(GetByLabel('UI/PeopleAndPlaces/Locations'), subMenuData=ret, texturePath=eveicon.location)] 107 return ret 108 109 110 def IsCoordinateBookmark(bookmark): 111 return (bookmark.itemID == bookmark.locationID or bookmark.typeID == appConst.typeSolarSystem) and bookmark.x 112 113 114 def IsBookmarkAvailable(creatorID, created, now): 115 if not creatorID: 116 return True 117 if creatorID == session.charid: 118 return True 119 if created + SHARED_BOOKMARK_DELAY < now: 120 return True 121 return False 122 123 124 def ConvertSubfolderName(subfolder): 125 if subfolder.creatorID == ownerSystem: 126 name = GetByLabel(subfolder.subfolderName) 127 else: 128 name = subfolder.subfolderName 129 return name 130 131 132 class BaseBookmarkMenuEntryView(MenuEntryView): 133 __guid__ = 'BookmarkMenuEntryView' 134 texturePath = None 135 136 137 class PersonalBookmarkMenuEntryView(BaseBookmarkMenuEntryView): 138 texturePath = None 139 140 141 class SharedBookmarkMenuEntryView(BaseBookmarkMenuEntryView): 142 texturePath = None 143 144 145 class PersonalFolderMenuEntryView(BaseBookmarkMenuEntryView): 146 texturePath = eveicon.folder 147 148 149 class SharedFolderMenuEntryView(BaseBookmarkMenuEntryView): 150 texturePath = eveicon.shared_folder