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