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

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