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

droneGroupsController.py (7971B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\drones\droneGroupsController.py
      2 import blue
      3 import localization
      4 from eve.client.script.ui.inflight.drones.dronesConst import DRONESTATE_INBAY, DRONESTATE_INSPACE
      5 from eve.client.script.ui.inflight.drones.dronesUtil import GetDronesInLocalSpace, GetDronesInBay
      6 from eve.client.script.ui.util.utilWindows import NamePopup
      7 from player_messaging.client.ui_message import prompt_player_fsd_dialog
      8 from signals import Signal
      9 settingsName = 'droneBlah2'
     10 
     11 class _DroneGroupsController:
     12     __notifyevents__ = ['OnItemLaunch']
     13 
     14     def __init__(self):
     15         sm.RegisterNotify(self)
     16         self.groups = self._SettifyGroups(settings.user.ui.Get(settingsName, {}))
     17         self._UpdateGroupsByID()
     18         self.on_groups_changed = Signal('on_groups_changed')
     19 
     20     def OnItemLaunch(self, ids):
     21         reload = False
     22         for oldID, newIDs in ids.iteritems():
     23             group = self.GetDroneGroup(oldID)
     24             if group is not None:
     25                 for newID in newIDs:
     26                     if newID != oldID:
     27                         group['droneIDs'].add(newID)
     28                         reload = True
     29 
     30         if reload:
     31             self.OnGroupsChanged()
     32 
     33     def _UpdateGroupsByID(self):
     34         self.groupsByID = {group.get('id'):group for group in self.groups.itervalues()}
     35 
     36     def GetGroupsByName(self):
     37         return self.groups
     38 
     39     def GetGroupNames(self):
     40         return self.groups.keys()[:]
     41 
     42     def GetGroupByID(self, groupID):
     43         return self.groupsByID.get(groupID, None)
     44 
     45     def GetFavoriteGroup(self):
     46         return self.GetGroupByID(self.GetFavoriteGroupID())
     47 
     48     def GetFavoriteGroupID(self):
     49         settingName = self._GetFavoriteDroneGroupConfigName()
     50         return settings.user.ui.Get(settingName, None)
     51 
     52     def SetFavoriteGroupID(self, value):
     53         settingName = self._GetFavoriteDroneGroupConfigName()
     54         settings.user.ui.Set(settingName, value)
     55 
     56     def GetFavoriteGroupDroneIDsInBayOrSpace(self):
     57         favoriteGroup = self.GetFavoriteGroup()
     58         if favoriteGroup:
     59             dronesInBay = GetDronesInBay()
     60             dronesIDsInSpace = [ x.droneID for x in sm.GetService('michelle').GetDrones().itervalues() ]
     61             allDroneIDs = [ x.itemID for x in dronesInBay ] + dronesIDsInSpace
     62             droneIDsInFavorite = favoriteGroup.get('droneIDs')
     63             return set(droneIDsInFavorite).intersection(allDroneIDs)
     64 
     65     def _GetFavoriteDroneGroupConfigName(self):
     66         shipTypeID = None
     67         if session.shipid:
     68             shipItem = sm.GetService('godma').GetItem(session.shipid)
     69             if shipItem:
     70                 shipTypeID = shipItem.typeID
     71         return 'drones_favoriteGroupID_%s' % shipTypeID
     72 
     73     def GroupXfier(fn):
     74 
     75         def XfyGroup(group):
     76             ret = group.copy()
     77             ret['droneIDs'] = fn(group['droneIDs'])
     78             return ret
     79 
     80         return lambda self, groups: dict([ (name, XfyGroup(group)) for name, group in groups.iteritems() ])
     81 
     82     _SettifyGroups = GroupXfier(set)
     83     _ListifyGroups = GroupXfier(list)
     84 
     85     def OnGroupsChanged(self):
     86         self.UpdateGroupSettings()
     87         self._UpdateGroupsByID()
     88         self.on_groups_changed()
     89 
     90     def UpdateGroupSettings(self):
     91         settings.user.ui.Set(settingsName, self._ListifyGroups(self.groups))
     92         sm.GetService('settings').SaveSettings()
     93 
     94     def GetSubGroup(self, groupName):
     95         if groupName in self.groups:
     96             return self.groups[groupName]
     97 
     98     def _GetDroneDictFromDroneIDs(self, itemIDs, droneState, includeFunction = None):
     99         if includeFunction is None:
    100             includeFunction = self._IsDroneIDinItemIDs
    101         droneDict = {}
    102         if droneState == DRONESTATE_INBAY:
    103             droneDict = {drone.itemID:(drone, 0, None) for drone in GetDronesInBay() if includeFunction(drone.itemID, itemIDs)}
    104             return droneDict
    105         if droneState == DRONESTATE_INSPACE:
    106             listOfDrones = GetDronesInLocalSpace()
    107         else:
    108             return droneDict
    109         droneDict = {drone.droneID:(drone.droneID,
    110          drone.typeID,
    111          drone.ownerID,
    112          drone.locationID) for drone in listOfDrones if includeFunction(drone.droneID, itemIDs)}
    113         return droneDict
    114 
    115     def GetDroneDataForMainGroup(self, droneState):
    116         droneDict = self._GetDroneDictFromDroneIDs(None, droneState, includeFunction=self._IncludeAllDrones)
    117         return droneDict.values()
    118 
    119     def _GetDroneDictForSubGroup(self, droneState, groupName):
    120         allDronesBelongingToGroup = self.GetSubGroup(groupName)['droneIDs']
    121         droneDict = self._GetDroneDictFromDroneIDs(allDronesBelongingToGroup, droneState)
    122         return droneDict
    123 
    124     def GetDroneIDsInSubGroup(self, droneState, groupName):
    125         droneDict = self._GetDroneDictForSubGroup(droneState, groupName)
    126         return droneDict.keys()
    127 
    128     def GetDroneDataForSubGroup(self, droneState, groupName):
    129         droneDict = self._GetDroneDictForSubGroup(droneState, groupName)
    130         return droneDict.values()
    131 
    132     def _IsDroneIDinItemIDs(self, droneID, itemIDs):
    133         return droneID in itemIDs
    134 
    135     def _IncludeAllDrones(self, droneID, itemIDs):
    136         return True
    137 
    138     def GetDroneGroup(self, droneID, getall = 0):
    139         retall = []
    140         for groupName, group in self.groups.iteritems():
    141             droneIDs = group['droneIDs']
    142             if droneID in droneIDs:
    143                 if getall:
    144                     retall.append(group)
    145                 else:
    146                     return group
    147 
    148         if getall:
    149             return retall
    150 
    151     def RemoveFromGroup(self, itemIDs):
    152         for itemID in itemIDs:
    153             for group in self.GetDroneGroup(itemID, getall=1):
    154                 group['droneIDs'].remove(itemID)
    155 
    156         self.OnGroupsChanged()
    157 
    158     def _EmptyGroup(self, groupName):
    159         droneGroup = self.GetSubGroup(groupName)
    160         for droneID in droneGroup.get('droneIDs', set()).copy():
    161             for group in self.GetDroneGroup(droneID, getall=1):
    162                 group['droneIDs'].remove(droneID)
    163 
    164     def MoveToGroup(self, droneGroupID, groupName, itemIDs):
    165         group = self.GetSubGroup(groupName)
    166         if group['droneIDs'] and group['droneGroupID'] != droneGroupID:
    167             prompt_player_fsd_dialog('CannotMixDrones')
    168             return False
    169         self.RemoveFromGroup(itemIDs)
    170         group = self.GetSubGroup(groupName)
    171         if not group['droneIDs']:
    172             group['droneGroupID'] = droneGroupID
    173         if group:
    174             for itemID in itemIDs:
    175                 group['droneIDs'].add(itemID)
    176 
    177         self.OnGroupsChanged()
    178         return True
    179 
    180     def CreateSubGroup(self, droneGroupID, itemIDs):
    181         ret = NamePopup(localization.GetByLabel('UI/Generic/TypeGroupName'), localization.GetByLabel('UI/Generic/TypeNameForGroup'))
    182         if not ret:
    183             return False
    184         droneIDs = set()
    185         for itemID in itemIDs:
    186             for group in self.GetDroneGroup(itemID, getall=1):
    187                 group['droneIDs'].remove(itemID)
    188 
    189             droneIDs.add(itemID)
    190 
    191         origname = groupname = ret
    192         i = 2
    193         while groupname in self.groups:
    194             groupname = '%s_%i' % (origname, i)
    195             i += 1
    196 
    197         group = {}
    198         group['label'] = groupname
    199         group['droneIDs'] = droneIDs
    200         group['id'] = (groupname, str(blue.os.GetWallclockTime()))
    201         group['droneGroupID'] = droneGroupID
    202         self.groups[groupname] = group
    203         self.OnGroupsChanged()
    204         return True
    205 
    206     def DeleteGroup(self, groupName):
    207         self._EmptyGroup(groupName)
    208         if groupName in self.groups:
    209             del self.groups[groupName]
    210         self.OnGroupsChanged()
    211 
    212 
    213 _droneGroupsController = None
    214 
    215 def GetDroneGroupsController():
    216     global _droneGroupsController
    217     if not _droneGroupsController:
    218         _droneGroupsController = _DroneGroupsController()
    219     return _droneGroupsController