fleetwindow.py (15399B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fleet\fleetwindow.py 2 import carbonui.const as uiconst 3 import eve.client.script.ui.shared.pointerTool.pointerToolConst as pConst 4 import evefleet 5 import localization 6 import uthread 7 from carbonui.control.contextMenu.menuData import MenuData 8 from carbonui.control.contextMenu.menuEntryData import MenuEntryData 9 from clientsettings.setting import SessionSettingBool 10 from carbonui.window.widget import WidgetWindow 11 from carbonui.primitives.container import Container 12 from carbonui.window.header.tab_navigation import TabNavigationWindowHeader 13 from eve.client.script.ui.shared.fleet import fleetbroadcastexports, fleetBroadcastConst 14 from eve.client.script.ui.shared.fleet.fleet import MyFleetPanel 15 from eve.client.script.ui.shared.fleet.fleetBroadcastConst import broadcastButtonIDs 16 from eve.client.script.ui.shared.fleet.fleetBroadcastCont import FleetBroadcastCont 17 from eve.client.script.ui.shared.fleet.fleetConst import FLEET_VIEW_FLAT_LIST_SETTING 18 from eve.client.script.ui.shared.fleet.fleetFormations import FleetFormationsPanel, FleetFormationWnd 19 from eve.client.script.ui.shared.fleet.fleetRespawnPoints import RespawnPanel 20 from eve.client.script.ui.shared.fleet.fleetUtil import ExportLootHistory, OnDropInMyFleet 21 from eve.client.script.ui.shared.fleet.fleetbroadcast import BroadcastHistoryPanel 22 from eve.client.script.ui.shared.fleet.fleetbroadcast import BroadcastSettings 23 from eve.client.script.ui.shared.fleet.fleetfinder import PanelFleetFinder, PanelAdvert, PanelFleetFinderAndAdvert 24 from eve.client.script.ui.shared.fleet.panelFormFleet import PanelFormFleet 25 from eve.client.script.ui.shared.fleet.storeFleetSetupWnd import StoredFleetSetupListWnd 26 from eve.common.script.util.esiUtils import CopyESIFleetUrlToClipboard 27 from eveexceptions import ExceptionEater 28 from evefleet.client.util import GetFleetSetupOptionHint 29 from menu import MenuLabel 30 from player_messaging.client.ui_message import prompt_player_fsd_dialog 31 from signals.signalUtil import ConnectSignals, DisconnectSignals 32 import evefleet.fleetSetupConst as fsConst 33 PANEL_BROADCASTS = 'broadcasts' 34 PANEL_FLEETFINDER = 'fleetfinder' 35 PANEL_MYADVERT = 'myadvert' 36 PANEL_MYFLEET = 'myfleet' 37 PANEL_RESPAWN = 'respawnPoints' 38 PANEL_FORMATIONS = 'warpFormations' 39 PANEL_FORMFLEET = 'formFleet' 40 41 class FleetWindow(WidgetWindow): 42 __notifyevents__ = ['OnFleetFormationWndChanged'] 43 default_width = 500 44 default_height = 400 45 default_minSize = (270, 120) 46 default_windowID = 'fleetwindow' 47 default_captionLabelPath = 'Tooltips/Neocom/Fleet' 48 default_descriptionLabelPath = 'Tooltips/Neocom/Fleet_description' 49 default_iconNum = 'res:/ui/Texture/WindowIcons/fleet.png' 50 default_isCompactable = True 51 52 def ApplyAttributes(self, attributes): 53 super(FleetWindow, self).ApplyAttributes(attributes) 54 self.formationsPanel = None 55 self.myFleetPanel = None 56 self.respawnPanel = None 57 self.fleetSvc = sm.GetService('fleet') 58 self.TryOpenStandaloneFormationWnd() 59 self.InitBroadcastBottom() 60 self.ConstructTabGroup() 61 self.panelsCont = Container(name='panelsCont', parent=self.sr.main, clipChildren=True) 62 self.ReconstructTabs() 63 self.tabGroup.AutoSelect() 64 self.on_content_padding_changed.connect(self.ApplyContentPadding) 65 66 def get_wnd_menu_unique_name(self): 67 return pConst.UNIQUE_NAME_FLEET_SETTINGS 68 69 def TryOpenStandaloneFormationWnd(self): 70 if session.fleetid and settings.char.ui.Get('fleetFormationStandalone', False): 71 FleetFormationWnd.Open() 72 73 def Prepare_Header_(self): 74 self.header = TabNavigationWindowHeader() 75 76 def ReconstructTabs(self): 77 self.panelsCont.Flush() 78 self.tabGroup.Flush() 79 if session.fleetid is not None: 80 self.myFleetPanel = MyFleetPanel(parent=self.panelsCont) 81 self.historyPanel = BroadcastHistoryPanel(parent=self.panelsCont) 82 self.respawnPanel = RespawnPanel(parent=self.panelsCont) 83 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/Fleet'), self.myFleetPanel, tabID=PANEL_MYFLEET, uniqueName=pConst.UNIQUE_NAME_FLEET_MY_FLEET_TAB) 84 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/FleetWindow/Broadcasts'), self.historyPanel, tabID=PANEL_BROADCASTS, uniqueName=pConst.UNIQUE_NAME_FLEET_HISTORY_TAB) 85 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/Respawn/Respawn'), self.respawnPanel, tabID=PANEL_RESPAWN, uniqueName=pConst.UNIQUE_NAME_FLEET_ACTIVE_RECLONERS_TAB) 86 if self.IsFormationsTabVisible(): 87 self.formationsPanel = FleetFormationsPanel(parent=self.panelsCont) 88 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/FleetFormations/Formations'), self.formationsPanel, tabID=PANEL_FORMATIONS) 89 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/FleetRegistry/Advert'), PanelAdvert(parent=self.panelsCont), tabID=PANEL_MYADVERT) 90 p = PanelFleetFinderAndAdvert(parent=self.panelsCont) 91 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/FleetRegistry/FindFleets'), p, tabID=PANEL_FLEETFINDER, uniqueName=pConst.UNIQUE_NAME_FLEET_FINDER_TAB) 92 else: 93 self.tabGroup.AddTab(localization.GetByLabel('Tooltips/Neocom/Fleet'), PanelFormFleet(parent=self.panelsCont), tabID=PANEL_FORMFLEET) 94 self.tabGroup.AddTab(localization.GetByLabel('UI/Fleet/FleetWindow/FleetFinder'), PanelFleetFinder(parent=self.panelsCont), tabID=PANEL_FLEETFINDER, uniqueName=pConst.UNIQUE_NAME_FLEET_FINDER_TAB) 95 if session.fleetid is not None: 96 myFleetTab = self.tabGroup.GetTabs()[0] 97 myFleetTab.OnTabDropData = OnDropInMyFleet 98 99 def IsFormationsTabVisible(self): 100 return not settings.char.ui.Get('fleetFormationStandalone', False) or not FleetFormationWnd.GetIfOpen() 101 102 def ConstructTabGroup(self): 103 self.tabGroup = self.header.tab_group 104 self.tabGroup.callback = self.OnTabGroup 105 106 def SelectFirstTab(self): 107 panelID = PANEL_MYFLEET if session.fleetid else PANEL_FORMFLEET 108 uthread.new(self.tabGroup.ShowPanelByID, panelID) 109 110 def OnFleetFormationWndChanged(self, *args): 111 self.ReconstructTabs() 112 if not self.IsFormationsTabVisible(): 113 self.SelectFirstTab() 114 else: 115 self.tabGroup.AutoSelect() 116 117 def InitBroadcastBottom(self): 118 self.content_padding 119 self.broadcastCont = FleetBroadcastCont(name='broadcastCont', align=uiconst.TOBOTTOM, parent=self.sr.main, clipChildren=True, innerPadding=self.content_padding) 120 self.ApplyContentPadding() 121 122 def ApplyContentPadding(self, *args): 123 padLeft, _, padRight, padBottom = self.content_padding 124 self.broadcastCont.padding = (-padLeft, 125 0, 126 -padRight, 127 -padBottom) 128 self.broadcastCont.SetInnerPadding(self.content_padding) 129 130 def UpdateBottomContVisibility(self): 131 panelID = self.tabGroup.GetSelectedID() 132 if not session.fleetid or panelID in (PANEL_FLEETFINDER, PANEL_MYADVERT): 133 self.broadcastCont.Hide() 134 else: 135 self.broadcastCont.Show() 136 137 def OnTabGroup(self, tabID, oldTabID): 138 self.UpdateBottomContVisibility() 139 140 def GotoTab(self, idx): 141 self.tabGroup.SelectByIdx(idx) 142 143 def StartFleetFromSetup(self): 144 m = MenuData() 145 fleetSetupsByName = self.fleetSvc.GetFleetSetups() 146 listOfSetups = sorted(fleetSetupsByName.values(), key=lambda x: x[fsConst.FS_NAME].lower()) 147 for eachSetup in listOfSetups: 148 setupName = eachSetup[fsConst.FS_NAME] 149 hint = GetFleetSetupOptionHint(eachSetup) 150 m.AddEntry(setupName, func=lambda sn = setupName: self.fleetSvc.StartNewFleet(sn), hint=hint) 151 152 return m 153 154 def GetMenuMoreOptions(self): 155 menuData = super(FleetWindow, self).GetMenuMoreOptions() 156 menuData += self.GetFleetMenuTop() 157 return menuData 158 159 def GetFleetMenuTop(self): 160 fleetSvc = self.fleetSvc 161 menuData = MenuData() 162 if session.fleetid is None: 163 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/FormFleet'), fleetSvc.StartNewFleet) 164 if fleetSvc.GetSetups(): 165 startFleetFromSetupOptions = self.StartFleetFromSetup() 166 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/FormFleetWithSetup'), subMenuData=startFleetFromSetupOptions) 167 menuData.AddSeparator() 168 else: 169 menuData.AddEntry(MenuLabel('UI/Fleet/LeaveMyFleet'), fleetSvc.LeaveFleet) 170 if session.fleetrole in [evefleet.fleetRoleLeader, evefleet.fleetRoleWingCmdr, evefleet.fleetRoleSquadCmdr]: 171 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/Regroup'), lambda : fleetSvc.Regroup()) 172 if fleetSvc.HasActiveBeacon(session.charid): 173 menuData.AddEntry(MenuLabel('UI/Fleet/BroadcastJumpBeacon'), lambda : fleetSvc.SendBroadcast_JumpBeacon()) 174 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/Broadcasts'), subMenuData=self._GetBroadcastMenu()) 175 menuData.AddSeparator() 176 menuData.AddEntry(MenuLabel('UI/Fleet/FleetBroadcast/BroadcastSettings'), lambda : BroadcastSettings.Open()) 177 if FLEET_VIEW_FLAT_LIST_SETTING.is_enabled(): 178 hierarchyText = MenuLabel('UI/Fleet/FleetWindow/ViewAsHierarchy') 179 else: 180 hierarchyText = MenuLabel('UI/Fleet/FleetWindow/ViewAsFlatList') 181 menuData.AddEntry(hierarchyText, FLEET_VIEW_FLAT_LIST_SETTING.toggle) 182 menuData.AddSeparator() 183 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/StoreFleetSetup'), fleetSvc.StoreSetup) 184 if fleetSvc.IsCommanderOrBoss(): 185 if fleetSvc.GetSetups(): 186 fleetSetupOptions = self.GetFleetSetups() 187 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/FleetSetups'), subMenuData=fleetSetupOptions) 188 menuData.AddSeparator() 189 takesFleetWarp = fleetSvc.TakesFleetWarp() 190 acceptsFleetWarpSetting = SessionSettingBool(takesFleetWarp) 191 acceptsFleetWarpSetting.on_change.connect(self.ChangeAcceptsFleetWarp) 192 menuData.AddCheckbox(MenuLabel('UI/Fleet/FleetWindow/AcceptFleetWarp'), acceptsFleetWarpSetting) 193 acceptsConduitJumps = fleetSvc.AcceptsConduitJumps() 194 acceptsConduitJumpsSetting = SessionSettingBool(acceptsConduitJumps) 195 acceptsConduitJumpsSetting.on_change.connect(self.ChangeAcceptsConduitJumps) 196 menuData.AddCheckbox(MenuLabel('UI/Fleet/FleetWindow/AcceptConduitJumps'), acceptsConduitJumpsSetting) 197 acceptsRegroups = fleetSvc.AcceptsFleetRegroups() 198 acceptsRegroupSetting = SessionSettingBool(acceptsRegroups) 199 acceptsRegroupSetting.on_change.connect(self.ChangeAcceptsRegroups) 200 menuData.AddCheckbox(MenuLabel('UI/Fleet/FleetWindow/AcceptRegroup'), acceptsRegroupSetting) 201 menuData.AddSeparator() 202 if fleetSvc.IsBoss(): 203 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/SetFleetMaxSize'), fleetSvc.SetFleetMaxSize) 204 options = fleetSvc.GetOptions() 205 freemoveSetting = SessionSettingBool(options.isFreeMove) 206 freemoveSetting.on_change.connect(self._ChangeFreeMove) 207 menuData.AddCheckbox(MenuLabel('UI/Fleet/FleetWindow/SetFreeMove'), freemoveSetting) 208 menuData.AddSeparator() 209 if fleetSvc.IsCommanderOrBoss(): 210 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/ShowFleetComposition'), fleetSvc.OpenFleetCompositionWindow) 211 if fleetSvc.IsBoss(): 212 if fleetSvc.options.isRegistered: 213 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/EditAdvert'), fleetSvc.OpenRegisterFleetWindow) 214 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/RemoveAdvert'), fleetSvc.UnregisterFleet) 215 else: 216 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/CreateAdvert'), fleetSvc.OpenRegisterFleetWindow) 217 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/OpenJoinRequest'), fleetSvc.OpenJoinRequestWindow) 218 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/GetFleetID'), self._CopyESIFleetUrlToClipboard) 219 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/OpenFleetWatchlist'), sm.GetService('cmd').OpenFleetWatchlist) 220 menuData.AddEntry(MenuLabel('UI/Fleet/FleetWindow/ExportLootHistory'), ExportLootHistory) 221 if fleetSvc.IsBoss(): 222 menuData.AddEntry(MenuLabel('UI/Fleet/DisbandFleet'), self.DisbandFleet) 223 return menuData 224 225 def _ChangeFreeMove(self, value, *args): 226 self.fleetSvc.SetOptions(isFreeMove=value) 227 228 def ChangeAcceptsFleetWarp(self, value, *args): 229 self.fleetSvc.SetAcceptsFleetWarpValue(value) 230 231 def ChangeAcceptsConduitJumps(self, value, *args): 232 self.fleetSvc.SetAcceptConduitJumpsValue(value) 233 234 def ChangeAcceptsRegroups(self, value, *args): 235 self.fleetSvc.SetAcceptRegroupValue(value) 236 237 def DisbandFleet(self): 238 if prompt_player_fsd_dialog('DisbandFleet', {}, uiconst.YESNO) != uiconst.ID_YES: 239 return 240 return self.fleetSvc.DisbandFleet() 241 242 def _GetBroadcastMenu(self): 243 m = [] 244 for broadcastID in broadcastButtonIDs: 245 hint = fleetbroadcastexports.GetBroadcastName(broadcastID) 246 m.append(MenuEntryData(hint, lambda _broadcastID = broadcastID: self.fleetSvc.SendBroadcast(_broadcastID), texturePath=fleetBroadcastConst.iconsByBroadcastType[broadcastID])) 247 248 if session.fleetrole in evefleet.fleetCmdrRoles: 249 m.append(MenuEntryData(localization.GetByLabel('UI/Fleet/FleetBroadcast/Commands/BroadcastTravelToMe'), lambda : self.fleetSvc.SendBroadcast_TravelTo(session.solarsystemid2), texturePath=fleetBroadcastConst.iconsByBroadcastType[fleetBroadcastConst.BROADCAST_TRAVEL_TO])) 250 return m 251 252 def GetFleetSetups(self): 253 fleetSetupsByName = self.fleetSvc.GetFleetSetups() 254 m = self.fleetSvc.GetSetups() 255 if fleetSetupsByName: 256 m.AddSeparator() 257 m.AddEntry(MenuLabel('UI/Fleet/FleetWindow/SetupsOverview'), self.OpenStoredFleetSetupListWnd) 258 return m 259 260 def OpenStoredFleetSetupListWnd(self): 261 StoredFleetSetupListWnd.Open(fleetSvc=self.fleetSvc) 262 263 def UpdateHeader(self): 264 nMembers = len(self.myFleetPanel.members) 265 info = self.fleetSvc.GetMemberInfo(session.charid) 266 if info is None: 267 return 268 if info.role == evefleet.fleetRoleLeader: 269 caption = localization.GetByLabel('UI/Fleet/FleetWindow/FleetHeaderBoss', numMembers=nMembers) 270 elif info.role == evefleet.fleetRoleWingCmdr: 271 caption = localization.GetByLabel('UI/Fleet/FleetWindow/FleetHeaderWingCmdr', numMembers=nMembers, wingName=info.wingName) 272 else: 273 caption = localization.GetByLabel('UI/Fleet/FleetWindow/FleetHeaderSquadMember', numMembers=nMembers, wingName=info.wingName, squadName=info.squadName) 274 self.SetCaption(caption) 275 276 def _CopyESIFleetUrlToClipboard(self): 277 CopyESIFleetUrlToClipboard(session.fleetid)