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

eveCommands.py (148318B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\eveCommands.py
      2 from __future__ import print_function
      3 import sys
      4 import blue
      5 import bluepy
      6 import carbon.client.script.sys.appUtils as appUtils
      7 import carbonui.const as uiconst
      8 import carbonui.services.command as command
      9 import destiny
     10 import eve.client.script.parklife.fxSequencer as FxSequencer
     11 import eve.client.script.ui.shared.agencyNew.contentGroups.contentGroupConst as agencyContentGroupConst
     12 import eve.common.lib.appConst as appConst
     13 import eve.common.script.sys.eveCfg as eveCfg
     14 import evecamera
     15 import evegraphics.settings as gfxsettings
     16 import evespacemouse
     17 import inventorycommon.const as invConst
     18 import localization
     19 import shipmode.data
     20 import structures
     21 import trinity
     22 import urllib
     23 import urlparse
     24 import uthread
     25 import uthread2
     26 from UITree import UITree
     27 from achievement_system.client.ui.window.window import AchievementsWindow
     28 from auraguidance.client.repository import aura_guidance_intro
     29 from auraguidance.client.ui.window import AuraGuidanceWindow
     30 from carbon.client.script.environment.AudioUtil import PlaySound
     31 from carbon.client.script.environment.audioService import GetAudioService
     32 from carbon.common.script.sys.serviceConst import ROLE_CONTENT, ROLE_GML, ROLE_PROGRAMMER, ROLEMASK_ELEVATEDPLAYER
     33 from auraguidance.client.feature_flags import aura_guidance_enabled
     34 from carbon.common.script.sys.sessions import ThrottlePerMinute
     35 from carbonui.control.contextMenu.menuUtil import ClearMenuLayer
     36 from carbonui.control.tabGroup import TabGroup
     37 from carbonui.control.window import Window
     38 from carbonui.services.command import CommandService
     39 from carbonui.uicore import uicore
     40 from carbonui.util.bunch import Bunch
     41 from charactercreator.client.characterCreationMetrics import check_for_character_creation_exit
     42 from eve.client.script.parklife import bracketSettings
     43 from eve.client.script.parklife.dungeonHelper import IsJessicaOpen
     44 from eve.client.script.ui.camera.cameraUtil import IsAutoTrackingEnabled
     45 from eve.client.script.ui.comparison.comparisonSettings import use_new_comparison_tool
     46 from eve.client.script.ui.comparison.comparisonWindow import ComparisonWindow
     47 from eve.client.script.ui.cosmetics.ship.shipSKINRWindow import ShipSKINRWindow
     48 from eve.client.script.ui.cosmetics.structure.paintToolWnd import PaintToolWnd
     49 from eve.client.script.ui.eveCommandsDescFunctions import GetCmdLogoffHint
     50 from eve.client.script.ui.inflight.capitalnavigation import CapitalNav
     51 from eve.client.script.ui.inflight.drones.droneGroupsController import GetDroneGroupsController
     52 from eve.client.script.ui.inflight.drones.droneSettings import drones_aggressive_setting, drones_focus_fire_setting
     53 from eve.client.script.ui.inflight.drones.dronesUtil import GetDronesInBay
     54 from eve.client.script.ui.inflight.dungeoneditor import DungeonEditor, DungeonObjectProperties
     55 from eve.client.script.ui.inflight.mining_scan_results_window import MiningScanResultsWindow
     56 from eve.client.script.ui.inflight.moonmining import MoonMining
     57 from eve.client.script.ui.inflight.overview import overviewWindowUtil
     58 from eve.client.script.ui.inflight.overviewSettings.overviewSettingsWnd import OverviewSettingsWnd
     59 from eve.client.script.ui.inflight.probeScannerWindow import ProbeScannerWindow
     60 from eve.client.script.ui.inflight.scannerFiles.directionalScannerWindow import DirectionalScanner
     61 from eve.client.script.ui.inflight.scannerFiles.moonScanner import MoonScanner
     62 from eve.client.script.ui.inflight.scannerFiles.scannerUtil import IsProbeScanEmbeddedPanelOpen
     63 from eve.client.script.ui.inflight.shipHud.action_indication.hud_action_indication_controller import HudActionIndicationController, IndicationData
     64 from eve.client.script.ui.inflight.shipstance import set_stance
     65 from eve.client.script.ui.mapCmdWindow import MapCmdWindow
     66 from eve.client.script.ui.omega.upsell.omegaUpsellWindow import OmegaUpsellWindow
     67 from eve.client.script.ui.services.bugReporting import BugReportingWindow
     68 from eve.client.script.ui.services.menuSvcExtras import movementFunctions, droneFunctions
     69 from eve.client.script.ui.services.menuSvcExtras.movementFunctions import DockOrJumpOrActivateGate, KeepAtRange, Orbit
     70 from eve.client.script.ui.services.menuSvcExtras.movementFunctions import WarpToItem, GetSelectedShipAndFighters
     71 from eve.client.script.ui.shared.addressBookWindow import AddressBookWindow
     72 from eve.client.script.ui.shared.agencyNew.ui.agencyWnd import AgencyWndNew
     73 from eve.client.script.ui.shared.assetsWindow import AssetsWindow
     74 from eve.client.script.ui.shared.autopilotSettings import AutopilotSettings
     75 from eve.client.script.ui.shared.bookmarks.standaloneBookmarkWnd import StandaloneBookmarkWnd
     76 from eve.client.script.ui.shared.bountyWindow import BountyWindow
     77 from eve.client.script.ui.shared.careerPortal.careerPortalWnd import CareerPortalDockablePanel
     78 from eve.client.script.ui.shared.cloneGrade import open_omega_upgrade_window
     79 from eve.client.script.ui.shared.ctrltab import CtrlTabWindow
     80 from eve.client.script.ui.shared.eveCalendar import CalendarWnd
     81 from eve.client.script.ui.shared.fittingMgmtWindow import FittingMgmt
     82 from eve.client.script.ui.shared.fittingScreen.fittingWnd import FittingWindow
     83 from eve.client.script.ui.shared.fleet.fleetWatchList import WatchListPanel
     84 from eve.client.script.ui.shared.fleet.fleetwindow import FleetWindow
     85 from eve.client.script.ui.shared.industry.industryWnd import Industry
     86 from eve.client.script.ui.shared.inventory import invWindow
     87 from eve.client.script.ui.shared.inventory.invConst import ContainerType
     88 from eve.client.script.ui.shared.inventory.invWindow import Inventory
     89 from eve.client.script.ui.shared.ledger.ledgerWnd import LedgerWindow
     90 from eve.client.script.ui.shared.mapView.dockPanelUtil import GetDockPanelManager
     91 from eve.client.script.ui.shared.mapView.mapViewUtil import IsDirectionalScannerOpen
     92 from eve.client.script.ui.shared.mapView.settings import classic_map_enabled_setting
     93 from eve.client.script.ui.shared.mapView.solarSystemViewPanel import SolarSystemViewPanel
     94 from eve.client.script.ui.shared.maps.browserwindow import MapBrowserWnd
     95 from eve.client.script.ui.shared.market.marketOrdersWnd import MarketOrdersWnd
     96 from eve.client.script.ui.shared.market.marketbase import RegionalMarket
     97 from eve.client.script.ui.shared.messagebox import MessageBox
     98 from eve.client.script.ui.shared.neocom.calculator import Calculator
     99 from eve.client.script.ui.shared.neocom.characterSheetWindow import CharacterSheetWindow
    100 from eve.client.script.ui.shared.neocom.charsheet import PANEL_JUMPCLONES
    101 from eve.client.script.ui.shared.neocom.compare import TypeCompare
    102 from eve.client.script.ui.shared.neocom.contracts.contractsWnd import ContractsWindow
    103 from eve.client.script.ui.shared.neocom.corporation.corpPanelConst import CorpPanel
    104 from eve.client.script.ui.shared.neocom.corporation.corporationWindow import CorporationWindow
    105 from eve.client.script.ui.shared.neocom.evemail import MailWindow
    106 from eve.client.script.ui.shared.neocom.help import HelpWindow
    107 from eve.client.script.ui.shared.neocom.journal import JournalWindow
    108 from eve.client.script.ui.shared.neocom.locations.window import LocationsWindow
    109 from eve.client.script.ui.shared.neocom.neocom.neocomUtil import ResetNeocomButtons
    110 from eve.client.script.ui.shared.neocom.notepad import NotepadWindow
    111 from eve.client.script.ui.shared.neocom.wallet.walletWnd import WalletWindow
    112 from eve.client.script.ui.shared.planet.mecDen.mercDenWnd import MyMercDensWnd
    113 from eve.client.script.ui.shared.planet.planetWindow import PlanetWindow
    114 from eve.client.script.ui.shared.pointerTool.pointerWnd import PointerToolWnd
    115 from eve.client.script.ui.shared.preview import PreviewCharacterWnd
    116 from eve.client.script.ui.shared.shipTree.shipTreeDockablePanel import ShipTreeDockablePanel
    117 from eve.client.script.ui.shared.shipconfig import ShipConfig
    118 from eve.client.script.ui.shared.theatersOfWar.dashboard.dashboard import TheatersOfWarDashboardWnd
    119 import eve.client.script.ui.shared.theatersOfWar.util as theatersOfWarUtil
    120 from eve.client.script.ui.shared.uilog import LoggerWindow
    121 from eve.client.script.ui.shared.videowindow import VideoPlayerWindow
    122 from eve.client.script.ui.skillPlan.skillPlanDockablePanel import SkillPlanDockablePanel
    123 from eve.client.script.ui.skillTree.skillTreeDockablePanel import SkillTreeDockablePanel
    124 from eve.client.script.ui.station.insurance.base_insurance import InsuranceWindow
    125 from eve.client.script.ui.station.loyaltyPointStore.lpStoreWindow import LPStoreWindow
    126 from eve.client.script.ui.station.repairshop.base_repairshop import RepairShopWindow
    127 from eve.client.script.ui.station.securityOfficeWindow import SecurityOfficeWindow
    128 from eve.client.script.ui.structure.accessGroups.accesGroupsWnd import AccessGroupsWnd
    129 from eve.client.script.ui.structure.structureBrowser.structureBrowserWnd import StructureBrowserWnd
    130 from eve.client.script.ui.view.viewStateConst import ViewState
    131 from eve.common.script.net import eveMoniker
    132 from eve.common.script.sys import idCheckers
    133 from eve.common.script.util.facwarCommon import IsPirateFWFaction
    134 from eve.common.script.util.urlUtil import get_url_with_token_and_parameters, get_eve_store_url, get_eve_secure_url
    135 from eve.devtools.script.enginetools import EngineToolsLauncher
    136 from eveNewCommands.client.escapeCommand import EscapeCommand
    137 from eveNewCommands.client.escapeCommandAdapter import EscapeCommandAdapter
    138 from evecamera.locationalcamera import get_orbit_camera_by_solar_system
    139 from eveexceptions import UserError
    140 from eveservices.menu import GetMenuService
    141 from eveuniverse.solar_systems import is_tactical_camera_suppressed, is_map_browser_suppressed, is_directional_scanner_suppressed, is_scanning_suppressed, is_solarsystem_map_suppressed
    142 from fsdBuiltData.client.effects import GetEffectGuids
    143 from globalConfig.getFunctions import IsContentComplianceControlSystemActive
    144 from globalConfig.getFunctions import IsPlayerBountyHidden, ArePointerLinksActive, AllowCharacterLogoff
    145 from inventorycommon.util import IsModularShip
    146 from itemcompression.client.ui.compress_in_space_controller import CompressInSpaceController
    147 from jobboard.client import get_job_board_service
    148 from jobboard.client.feature_flag import is_job_board_available, are_missions_in_job_board_available
    149 from localization import GetByLabel
    150 from localization.util import AmOnChineseServer
    151 from logmodule import LogException
    152 from loyaltypoints.lpUtil import get_normal_lp_stores_in_station
    153 from menucheckers import SessionChecker
    154 from player_messaging.client.ui_message import message_player, prompt_player_fsd_dialog
    155 from projectdiscovery.client.windowclass import get_project_discovery_window_class
    156 from reprocessing.ui.reprocessingWnd import ReprocessingWnd
    157 from seasons.client.util import OpenSeasonsWindow
    158 from shipfitting.multiBuyUtil import BuyMultipleTypesWithQty
    159 from uthread2.callthrottlers import CallCombiner
    160 from xmppchatclient.xmppchatchannels import XmppChatChannels
    161 contextFiS = 1
    162 contextIncarna = 2
    163 labelsByFuncName = {'CmdAccelerate': 'UI/Commands/CmdAccelerate',
    164  'CmdActivateHighPowerSlot1': 'UI/Commands/CmdActivateHighPowerSlot1',
    165  'CmdActivateHighPowerSlot2': 'UI/Commands/CmdActivateHighPowerSlot2',
    166  'CmdActivateHighPowerSlot3': 'UI/Commands/CmdActivateHighPowerSlot3',
    167  'CmdActivateHighPowerSlot4': 'UI/Commands/CmdActivateHighPowerSlot4',
    168  'CmdActivateHighPowerSlot5': 'UI/Commands/CmdActivateHighPowerSlot5',
    169  'CmdActivateHighPowerSlot6': 'UI/Commands/CmdActivateHighPowerSlot6',
    170  'CmdActivateHighPowerSlot7': 'UI/Commands/CmdActivateHighPowerSlot7',
    171  'CmdActivateHighPowerSlot8': 'UI/Commands/CmdActivateHighPowerSlot8',
    172  'CmdActivateLowPowerSlot1': 'UI/Commands/CmdActivateLowPowerSlot1',
    173  'CmdActivateLowPowerSlot2': 'UI/Commands/CmdActivateLowPowerSlot2',
    174  'CmdActivateLowPowerSlot3': 'UI/Commands/CmdActivateLowPowerSlot3',
    175  'CmdActivateLowPowerSlot4': 'UI/Commands/CmdActivateLowPowerSlot4',
    176  'CmdActivateLowPowerSlot5': 'UI/Commands/CmdActivateLowPowerSlot5',
    177  'CmdActivateLowPowerSlot6': 'UI/Commands/CmdActivateLowPowerSlot6',
    178  'CmdActivateLowPowerSlot7': 'UI/Commands/CmdActivateLowPowerSlot7',
    179  'CmdActivateLowPowerSlot8': 'UI/Commands/CmdActivateLowPowerSlot8',
    180  'CmdActivateMediumPowerSlot1': 'UI/Commands/CmdActivateMediumPowerSlot1',
    181  'CmdActivateMediumPowerSlot2': 'UI/Commands/CmdActivateMediumPowerSlot2',
    182  'CmdActivateMediumPowerSlot3': 'UI/Commands/CmdActivateMediumPowerSlot3',
    183  'CmdActivateMediumPowerSlot4': 'UI/Commands/CmdActivateMediumPowerSlot4',
    184  'CmdActivateMediumPowerSlot5': 'UI/Commands/CmdActivateMediumPowerSlot5',
    185  'CmdActivateMediumPowerSlot6': 'UI/Commands/CmdActivateMediumPowerSlot6',
    186  'CmdActivateMediumPowerSlot7': 'UI/Commands/CmdActivateMediumPowerSlot7',
    187  'CmdActivateMediumPowerSlot8': 'UI/Commands/CmdActivateMediumPowerSlot8',
    188  'CmdAlignToItem': 'UI/Commands/CmdAlignToItem',
    189  'CmdApproachItem': 'UI/Commands/CmdApproachItem',
    190  'CmdCycleFleetBroadcastScope': 'UI/Commands/CmdCycleFleetBroadcastScope',
    191  'CmdDecelerate': 'UI/Commands/CmdDecelerate',
    192  'CmdDockOrJumpOrActivateGate': 'UI/Commands/CmdDockOrJumpOrActivateGate',
    193  'CmdDronesEngage': 'UI/Commands/CmdDronesEngage',
    194  'CmdDronesReturnAndOrbit': 'UI/Commands/CmdDronesReturnAndOrbit',
    195  'CmdDronesReturnToBay': 'UI/Commands/CmdDronesReturnToBay',
    196  'CmdLaunchFavoriteDrones': 'UI/Drones/LaunchDrones',
    197  'CmdExitStation': 'UI/Commands/CmdExitStation',
    198  'CmdEnterHangar': 'UI/Commands/EnterHangar',
    199  'CmdEnterStructure': 'UI/Commands/EnterStructure',
    200  'CmdFleetBroadcast_EnemySpotted': 'UI/Fleet/FleetBroadcast/Commands/EnemySpotted',
    201  'CmdFleetBroadcast_HealArmor': 'UI/Fleet/FleetBroadcast/Commands/HealArmor',
    202  'CmdFleetBroadcast_HealCapacitor': 'UI/Fleet/FleetBroadcast/Commands/HealCapacitor',
    203  'CmdFleetBroadcast_HealShield': 'UI/Fleet/FleetBroadcast/Commands/HealShield',
    204  'CmdFleetBroadcast_HoldPosition': 'UI/Fleet/FleetBroadcast/Commands/HoldPosition',
    205  'CmdFleetBroadcast_InPosition': 'UI/Fleet/FleetBroadcast/Commands/InPosition',
    206  'CmdFleetBroadcast_JumpBeacon': 'UI/Fleet/FleetBroadcast/Commands/JumpBeacon',
    207  'CmdFleetBroadcast_Location': 'UI/Fleet/FleetBroadcast/Commands/Location',
    208  'CmdFleetBroadcast_NeedBackup': 'UI/Fleet/FleetBroadcast/Commands/NeedBackup',
    209  'CmdForceFadeFromBlack': 'UI/Commands/CmdForceFadeFromBlack',
    210  'CmdHideCursor': 'UI/Commands/CmdHideCursor',
    211  'CmdHideUI': 'UI/Commands/CmdHideUI',
    212  'CmdKeepItemAtRange': 'UI/Commands/CmdKeepItemAtRange',
    213  'CmdLockTargetItem': 'UI/Commands/CmdLockTargetItem',
    214  'CmdSelectTargetItem': 'UI/Commands/CmdSelectTargetItem',
    215  'CmdLogOff': 'UI/Commands/CmdLogOff',
    216  'CmdMoveBackward': 'UI/Commands/CmdMoveBackward',
    217  'CmdMoveForward': 'UI/Commands/CmdMoveForward',
    218  'CmdMoveLeft': 'UI/Commands/CmdMoveLeft',
    219  'CmdMoveRight': 'UI/Commands/CmdMoveRight',
    220  'CmdNextStackedWindow': 'UI/Commands/CmdNextStackedWindow',
    221  'CmdNextTab': 'UI/Commands/CmdNextTab',
    222  'CmdOpenNewMessage': 'UI/Commands/CmdOpenNewMessage',
    223  'CmdOrbitItem': 'UI/Commands/CmdOrbitItem',
    224  'CmdOverloadHighPowerRack': 'UI/Commands/CmdOverloadHighPowerRack',
    225  'CmdOverloadHighPowerSlot1': 'UI/Commands/CmdOverloadHighPowerSlot1',
    226  'CmdOverloadHighPowerSlot2': 'UI/Commands/CmdOverloadHighPowerSlot2',
    227  'CmdOverloadHighPowerSlot3': 'UI/Commands/CmdOverloadHighPowerSlot3',
    228  'CmdOverloadHighPowerSlot4': 'UI/Commands/CmdOverloadHighPowerSlot4',
    229  'CmdOverloadHighPowerSlot5': 'UI/Commands/CmdOverloadHighPowerSlot5',
    230  'CmdOverloadHighPowerSlot6': 'UI/Commands/CmdOverloadHighPowerSlot6',
    231  'CmdOverloadHighPowerSlot7': 'UI/Commands/CmdOverloadHighPowerSlot7',
    232  'CmdOverloadHighPowerSlot8': 'UI/Commands/CmdOverloadHighPowerSlot8',
    233  'CmdOverloadLowPowerRack': 'UI/Commands/CmdOverloadLowPowerRack',
    234  'CmdOverloadLowPowerSlot1': 'UI/Commands/CmdOverloadLowPowerSlot1',
    235  'CmdOverloadLowPowerSlot2': 'UI/Commands/CmdOverloadLowPowerSlot2',
    236  'CmdOverloadLowPowerSlot3': 'UI/Commands/CmdOverloadLowPowerSlot3',
    237  'CmdOverloadLowPowerSlot4': 'UI/Commands/CmdOverloadLowPowerSlot4',
    238  'CmdOverloadLowPowerSlot5': 'UI/Commands/CmdOverloadLowPowerSlot5',
    239  'CmdOverloadLowPowerSlot6': 'UI/Commands/CmdOverloadLowPowerSlot6',
    240  'CmdOverloadLowPowerSlot7': 'UI/Commands/CmdOverloadLowPowerSlot7',
    241  'CmdOverloadLowPowerSlot8': 'UI/Commands/CmdOverloadLowPowerSlot8',
    242  'CmdOverloadMediumPowerRack': 'UI/Commands/CmdOverloadMediumPowerRack',
    243  'CmdOverloadMediumPowerSlot1': 'UI/Commands/CmdOverloadMediumPowerSlot1',
    244  'CmdOverloadMediumPowerSlot2': 'UI/Commands/CmdOverloadMediumPowerSlot2',
    245  'CmdOverloadMediumPowerSlot3': 'UI/Commands/CmdOverloadMediumPowerSlot3',
    246  'CmdOverloadMediumPowerSlot4': 'UI/Commands/CmdOverloadMediumPowerSlot4',
    247  'CmdOverloadMediumPowerSlot5': 'UI/Commands/CmdOverloadMediumPowerSlot5',
    248  'CmdOverloadMediumPowerSlot6': 'UI/Commands/CmdOverloadMediumPowerSlot6',
    249  'CmdOverloadMediumPowerSlot7': 'UI/Commands/CmdOverloadMediumPowerSlot7',
    250  'CmdOverloadMediumPowerSlot8': 'UI/Commands/CmdOverloadMediumPowerSlot8',
    251  'CmdPickPortrait0': 'UI/Commands/PickPortrait0',
    252  'CmdPickPortrait1': 'UI/Commands/PickPortrait1',
    253  'CmdPickPortrait2': 'UI/Commands/PickPortrait2',
    254  'CmdPickPortrait3': 'UI/Commands/PickPortrait3',
    255  'CmdPrevStackedWindow': 'UI/Commands/CmdPrevStackedWindow',
    256  'CmdPrevTab': 'UI/Commands/CmdPrevTab',
    257  'CmdQuitGame': 'UI/Commands/CmdQuitGame',
    258  'CmdReconnectToDrones': 'UI/Commands/ReconnectToLostDrones',
    259  'CmdReloadAmmo': 'UI/Commands/CmdReloadAmmo',
    260  'CmdResetMonitor': 'UI/Commands/CmdResetMonitor',
    261  'CmdSelectNextTarget': 'UI/Commands/CmdSelectNextTarget',
    262  'CmdSelectPrevTarget': 'UI/Commands/CmdSelectPrevTarget',
    263  'CmdSendBroadcast_Target': 'UI/Commands/CmdSendBroadcast_Target',
    264  'CmdSendBroadcast_HealTarget': 'UI/Commands/CmdSendBroadcast_HealTarget',
    265  'CmdSendBroadcast_WarpToItemID': 'UI/Fleet/FleetBroadcast/Commands/BroadcastWarpTo',
    266  'CmdSendBroadcast_AlignToItemID': 'UI/Fleet/FleetBroadcast/Commands/BroadcastAlignTo',
    267  'CmdSendBroadcast_JumpToItemID': 'UI/Fleet/FleetBroadcast/Commands/BroadcastJumpTo',
    268  'CmdSetChatChannelFocus': 'UI/Commands/CmdSetChatChannelFocus',
    269  'CmdSetSearchBarFocus': 'UI/Commands/CmdSetSearchBarFocus',
    270  'CmdSetOverviewFocus': 'UI/Commands/CmdSetOverviewFocus',
    271  'CmdSetShipFullSpeed': 'UI/Commands/CmdSetShipFullSpeed',
    272  'CmdShowItemInfo': 'UI/Commands/CmdShowItemInfo',
    273  'CmdStopShip': 'UI/Commands/CmdStopShip',
    274  'CmdToggleAggressivePassive': 'UI/Commands/CmdToggleAggressivePassive',
    275  'CmdToggleAutopilot': 'UI/Commands/CmdToggleAutopilot',
    276  'CmdToggleCombatView': 'UI/Commands/CmdToggleCombatView',
    277  'CmdToggleDroneFocusFire': 'UI/Commands/CmdToggleDroneFocusFire',
    278  'CmdToggleEffects': 'UI/Commands/CmdToggleEffects',
    279  'CmdToggleEffectTurrets': 'UI/Commands/CmdToggleEffectTurrets',
    280  'CmdToggleLookAtItem': 'UI/Commands/CmdToggleLookAtItem',
    281  'CmdToggleCameraTracking': 'UI/Commands/CmdToggleCameraTracking',
    282  'CmdToggleShowAllBrackets': 'UI/Commands/CmdToggleShowAllBrackets',
    283  'CmdToggleShowNoBrackets': 'UI/Commands/CmdToggleShowNoBrackets',
    284  'CmdToggleShowSpecialBrackets': 'UI/Commands/CmdToggleShowSpecialBrackets',
    285  'CmdToggleTacticalOverlay': 'UI/Commands/CmdToggleTacticalOverlay',
    286  'CmdToggleMiningOverlay': 'UI/Commands/CmdToggleMiningOverlay',
    287  'CmdToggleTargetItem': 'UI/Commands/CmdToggleTargetItem',
    288  'CmdUnlockTargetItem': 'UI/Commands/CmdUnlockTargetItem',
    289  'CmdUnlockTargetItems': 'UI/Commands/CmdUnlockTargetItems',
    290  'CmdWarpToItem': 'UI/Commands/CmdWarpToItem',
    291  'CmdOpenRadialMenu': 'UI/Commands/CmdOpenRadialMenu',
    292  'CmdOpenBroadcastRadialMenu': 'UI/Commands/CmdOpenBroadcastRadialMenu',
    293  'CmdRefreshDirectionalScan': 'UI/Commands/CmdRefreshDirectionalScan',
    294  'CmdToggleAutoTracking': 'UI/Commands/CmdToggleAutoTracking',
    295  'WinCmdToggleWindowed': 'UI/Commands/WinCmdToggleWindowed',
    296  'CmdSetCameraPOV': 'UI/Commands/CmdSetCameraPOV',
    297  'CmdSetCameraOrbit': 'UI/Commands/CmdSetCameraOrbit',
    298  'CmdSetCameraTactical': 'UI/Commands/CmdSetCameraTactical',
    299  'CmdTagItem_1': 'UI/Commands/CmdTagItem_1',
    300  'CmdTagItem_2': 'UI/Commands/CmdTagItem_2',
    301  'CmdTagItem_3': 'UI/Commands/CmdTagItem_3',
    302  'CmdTagItem_A': 'UI/Commands/CmdTagItem_A',
    303  'CmdTagItem_B': 'UI/Commands/CmdTagItem_B',
    304  'CmdTagItem_C': 'UI/Commands/CmdTagItem_C',
    305  'CmdTagItem_X': 'UI/Commands/CmdTagItem_X',
    306  'CmdTagItem_Y': 'UI/Commands/CmdTagItem_Y',
    307  'CmdTagItem_Z': 'UI/Commands/CmdTagItem_Z',
    308  'CmdTagItem_None': 'UI/Commands/CmdTagItem_None',
    309  'CmdTagItem_123': 'UI/Commands/CmdTagItem_123',
    310  'CmdTagItem_ABC': 'UI/Commands/CmdTagItem_ABC',
    311  'CmdTagItem_XYZ': 'UI/Commands/CmdTagItem_XYZ',
    312  'CmdTagItem_123456789': 'UI/Commands/CmdTagItem_123456789',
    313  'CmdTagItem_ABCDEFGHI': 'UI/Commands/CmdTagItem_ABCDEFGHI',
    314  'CmdToggleSensorOverlay': 'UI/Commands/CmdToggleSensorOverlay',
    315  'CmdCreateBookmark': 'UI/Inflight/BookmarkLocation',
    316  'ToggleAurumStore': 'UI/Commands/OpenStore',
    317  'ToggleRedeemItems': 'UI/Commands/RedeemItems',
    318  'ToggleActivities': 'UI/Commands/Activities',
    319  'CmdFlightControlsUp': 'UI/Commands/CmdFlightControlsUp',
    320  'CmdFlightControlsDown': 'UI/Commands/CmdFlightControlsDown',
    321  'CmdFlightControlsLeft': 'UI/Commands/CmdFlightControlsLeft',
    322  'CmdFlightControlsRight': 'UI/Commands/CmdFlightControlsRight',
    323  'CmdToggleSystemMenu': 'UI/Commands/CmdToggleSystemMenu',
    324  'CmdSetDefenceStance': 'UI/Commands/CmdSetDefenceStance',
    325  'CmdSetSniperStance': 'UI/Commands/CmdSetSniperStance',
    326  'CmdSetSpeedStance': 'UI/Commands/CmdSetSpeedStance',
    327  'CmdToggleProjectDiscovery': 'UI/Commands/CmdToggleProjectDiscovery',
    328  'CmdRefreshProbeScan': 'UI/Commands/CmdRefreshProbeScan',
    329  'CmdLaunchAllFighters': 'UI/Fighters/ShortcutLaunchAllFighters',
    330  'CmdRecallAllFightersToTubes': 'UI/Fighters/ShortcutRecallAllFighter',
    331  'CmdLaunchSelectedFighters': 'UI/Fighters/ShortcutLaunchSelectedFighter',
    332  'CmdRecallSelectedFightersToTubes': 'UI/Fighters/ShortcutRecallSelectedFighters',
    333  'CmdSelectAllFighters': 'UI/Fighters/ShortcutSelectAllFighter',
    334  'CmdDeselectAllFighters': 'UI/Fighters/ShortcutDeselectAllFighter',
    335  'CmdToggleShipSelection': 'UI/Fighters/ShortcutToggleShipSelection',
    336  'CmdToggleTubeSelection_0': 'UI/Fighters/ShortcutToggleTube1Selection',
    337  'CmdToggleTubeSelection_1': 'UI/Fighters/ShortcutToggleTube2Selection',
    338  'CmdToggleTubeSelection_2': 'UI/Fighters/ShortcutToggleTube3Selection',
    339  'CmdToggleTubeSelection_3': 'UI/Fighters/ShortcutToggleTube4Selection',
    340  'CmdToggleTubeSelection_4': 'UI/Fighters/ShortcutToggleTube5Selection',
    341  'CmdToggle3DView': 'UI/Commands/CmdToggle3DView'}
    342 CATEGORIES = {'window': 'UI/SystemMenu/Shortcuts/WindowTab',
    343  'combat': 'UI/SystemMenu/Shortcuts/CombatTab',
    344  'general': 'UI/SystemMenu/Shortcuts/GeneralTab',
    345  'navigation': 'UI/SystemMenu/Shortcuts/NavigationTab',
    346  'modules': 'UI/SystemMenu/Shortcuts/ModulesTab',
    347  'drones': 'UI/SystemMenu/Shortcuts/DronesTab',
    348  'fighters': 'UI/Common/Fighters',
    349  'charactercreator': 'UI/CharacterCreation',
    350  'movement': 'UI/SystemMenu/Shortcuts/CharacterMovementTab'}
    351 RULE_NOT_ALLOWED_WITH_MODIFIERS = 'notAllowedWithModifiers'
    352 
    353 class EveCommandService(CommandService):
    354     __guid__ = 'svc.eveCmd'
    355     __displayname__ = 'Command service'
    356     __replaceservice__ = 'cmd'
    357     __notifyevents__ = ['OnSessionChanged', 'OnGlobalConfigChanged', 'OnApplicationFocusChanged']
    358     __categoryToContext__ = {'general': (contextFiS, contextIncarna),
    359      'window': (contextFiS, contextIncarna),
    360      'combat': (contextFiS,),
    361      'drones': (contextFiS,),
    362      'fighters': (contextFiS,),
    363      'modules': (contextFiS,),
    364      'navigation': (contextFiS,),
    365      'movement': (contextIncarna,),
    366      'charactercreator': (contextIncarna,)}
    367     __dependencies__ = CommandService.__dependencies__ + ['menu', 'machoNet']
    368     __startupdependencies__ = CommandService.__startupdependencies__ + ['command_blocker']
    369     extraShortcutRules = {'CmdOpenBroadcastRadialMenu': {RULE_NOT_ALLOWED_WITH_MODIFIERS: (uiconst.VK_MBUTTON, uiconst.VK_XBUTTON1, uiconst.VK_XBUTTON2)}}
    370 
    371     def Run(self, memStream = None):
    372         CommandService.Run(self, memStream)
    373         self.combatFunctionLoaded = None
    374         self.combatCmdLoaded = None
    375         self.combatCmdCurrentHasExecuted = False
    376         self.combatCmdUnloadFunc = None
    377         self.contextToCommand = {}
    378         self.disabledCommands = set()
    379         self.labelsByFuncName.update(labelsByFuncName)
    380         self._telemetrySessionActive = False
    381         self.isCmdQuitPending = False
    382         self.commandMemory = {}
    383         self.openingWndsAutomatically = False
    384         self.SetSpeedFractionThrottled = CallCombiner(self.SetSpeedFraction, 0.3)
    385 
    386     def Reload(self, forceGenericOnly = False):
    387         CommandService.Reload(self, forceGenericOnly)
    388         self.contextToCommand = {}
    389         self.LoadAllAccelerators()
    390         self.commandMemory = {}
    391 
    392     def OnSessionChanged(self, isRemote, sess, change):
    393         CommandService.OnSessionChanged(self, isRemote, sess, change)
    394         if 'locationid' in change:
    395             self.LoadAllAccelerators()
    396 
    397     def OnGlobalConfigChanged(self, config):
    398         self.Reload()
    399 
    400     def LoadAllAccelerators(self):
    401         self.commandMap.UnloadAllAccelerators()
    402         self.commandMap.LoadAcceleratorsByCategory('general')
    403         self.commandMap.LoadAcceleratorsByCategory('window')
    404         if getattr(session, 'locationid', None):
    405             if idCheckers.IsStation(session.locationid):
    406                 self.commandMap.LoadAcceleratorsByCategory('movement')
    407             else:
    408                 self.commandMap.LoadAcceleratorsByCategory('combat')
    409                 self.commandMap.LoadAcceleratorsByCategory('drones')
    410                 self.commandMap.LoadAcceleratorsByCategory('fighters')
    411                 self.commandMap.LoadAcceleratorsByCategory('modules')
    412                 self.commandMap.LoadAcceleratorsByCategory('navigation')
    413 
    414     def OnApplicationFocusChanged(self, hasFocus):
    415         if hasFocus:
    416             uthread.new(self._CheckLoadCombatCommand)
    417 
    418     def _CheckLoadCombatCommand(self):
    419         if getattr(session, 'locationid', None) and idCheckers.IsSolarSystem(session.locationid):
    420             cmds = self.commandMap.GetAllCommands()
    421             combatCmds = [ cmd for cmd in cmds if cmd.category == 'combat' ]
    422             for cmd in combatCmds:
    423                 allPressed = True
    424                 if not cmd.shortcut:
    425                     continue
    426                 for key in cmd.shortcut:
    427                     if not uicore.uilib.Key(key):
    428                         allPressed = False
    429 
    430                 if allPressed:
    431                     cmd.callback()
    432                     return
    433 
    434     def GetExtraShortcutRulesForCmd(self, cmdName):
    435         return self.extraShortcutRules.get(cmdName, None)
    436 
    437     def GetCategoryContext(self, category):
    438         return self.__categoryToContext__[category]
    439 
    440     def CheckContextIntersection(self, context1, context2):
    441         for context in context1:
    442             if context in context2:
    443                 return True
    444 
    445         return False
    446 
    447     def CheckDuplicateShortcuts(self):
    448         for cmd in self.defaultShortcutMapping:
    449             for cmdCheck in self.defaultShortcutMapping:
    450                 if cmdCheck.shortcut:
    451                     sameName = cmdCheck.name == cmd.name
    452                     sameShortcut = cmdCheck.shortcut == cmd.shortcut
    453                     cmdCheckContext = self.__categoryToContext__[cmdCheck.category]
    454                     cmdContext = self.__categoryToContext__[cmd.category]
    455                     sameContext = self.CheckContextIntersection(cmdCheckContext, cmdContext)
    456                     if sameShortcut and sameContext and not sameName:
    457                         self.LogError('Same default shortcut used for multiple commands:', cmd)
    458 
    459     def SetDefaultShortcutMappingGAME(self):
    460         ret = []
    461         c = command.CommandMapping
    462         CTRL = uiconst.VK_CONTROL
    463         ALT = uiconst.VK_MENU
    464         SHIFT = uiconst.VK_SHIFT
    465         COMMAND = uiconst.VK_LWIN
    466 
    467         def k(win, mac):
    468             if sys.platform.startswith('darwin'):
    469                 return mac
    470             return win
    471 
    472         m = [c(self.CmdOverloadLowPowerRack, (CTRL, uiconst.VK_1)),
    473          c(self.CmdOverloadMediumPowerRack, (CTRL, uiconst.VK_2)),
    474          c(self.CmdOverloadHighPowerRack, (CTRL, uiconst.VK_3)),
    475          c(self.CmdReloadAmmo, (CTRL, uiconst.VK_R)),
    476          c(self.CmdMiningScan, None)]
    477         for i in xrange(1, 9):
    478             key = getattr(uiconst, 'VK_F%s' % i)
    479             m.extend([c(getattr(self, 'CmdActivateHighPowerSlot%s' % i), key),
    480              c(getattr(self, 'CmdActivateMediumPowerSlot%s' % i), (ALT, key)),
    481              c(getattr(self, 'CmdActivateLowPowerSlot%s' % i), (k(win=CTRL, mac=COMMAND), key)),
    482              c(getattr(self, 'CmdOverloadHighPowerSlot%s' % i), (SHIFT, key)),
    483              c(getattr(self, 'CmdOverloadMediumPowerSlot%s' % i), (ALT, SHIFT, key)),
    484              c(getattr(self, 'CmdOverloadLowPowerSlot%s' % i), (k(win=CTRL, mac=COMMAND), SHIFT, key))])
    485 
    486         for cm in m:
    487             cm.category = 'modules'
    488             ret.append(cm)
    489 
    490         m = [c(self.CmdSelectPrevTarget, k(win=(ALT, uiconst.VK_LEFT), mac=(CTRL, uiconst.VK_OEM_PERIOD))),
    491          c(self.CmdSelectNextTarget, k(win=(ALT, uiconst.VK_RIGHT), mac=(CTRL, uiconst.VK_OEM_COMMA))),
    492          c(self.CmdToggleAutopilot, (CTRL, uiconst.VK_S)),
    493          c(self.CmdToggleTacticalOverlay, (CTRL, uiconst.VK_D)),
    494          c(self.CmdDecelerate, uiconst.VK_SUBTRACT, repeatable=True),
    495          c(self.CmdAccelerate, uiconst.VK_ADD, repeatable=True),
    496          c(self.CmdStopShip, (k(win=CTRL, mac=SHIFT), uiconst.VK_SPACE)),
    497          c(self.CmdSetShipFullSpeed, (ALT, CTRL, uiconst.VK_SPACE)),
    498          c(self.CmdFlightControlsUp, uiconst.VK_UP),
    499          c(self.CmdFlightControlsDown, uiconst.VK_DOWN),
    500          c(self.CmdFlightControlsLeft, uiconst.VK_LEFT),
    501          c(self.CmdFlightControlsRight, uiconst.VK_RIGHT),
    502          c(self.CmdToggleShowAllBrackets, (ALT, uiconst.VK_Z)),
    503          c(self.CmdToggleShowNoBrackets, (ALT, SHIFT, uiconst.VK_Z)),
    504          c(self.CmdToggleShowSpecialBrackets, (ALT, SHIFT, uiconst.VK_X)),
    505          c(self.CmdFleetBroadcast_EnemySpotted, uiconst.VK_Z),
    506          c(self.CmdFleetBroadcast_NeedBackup, None),
    507          c(self.CmdFleetBroadcast_HealArmor, None),
    508          c(self.CmdFleetBroadcast_HealShield, None),
    509          c(self.CmdFleetBroadcast_HealCapacitor, None),
    510          c(self.CmdFleetBroadcast_InPosition, None),
    511          c(self.CmdFleetBroadcast_HoldPosition, None),
    512          c(self.CmdFleetBroadcast_JumpBeacon, None),
    513          c(self.CmdFleetBroadcast_Location, None),
    514          c(self.CmdSendBroadcast_Target, uiconst.VK_X),
    515          c(self.CmdSendBroadcast_HealTarget, None),
    516          c(self.CmdSendBroadcast_WarpToItemID, None),
    517          c(self.CmdSendBroadcast_AlignToItemID, None),
    518          c(self.CmdSendBroadcast_JumpToItemID, None),
    519          c(self.CmdCycleFleetBroadcastScope, None),
    520          c(self.CmdSetCameraTactical, (ALT, uiconst.VK_1)),
    521          c(self.CmdSetCameraOrbit, (ALT, uiconst.VK_2)),
    522          c(self.CmdSetCameraPOV, (ALT, uiconst.VK_3)),
    523          c(self.CmdToggleSensorOverlay, (CTRL, uiconst.VK_O)),
    524          c(self.CmdCreateBookmark, (CTRL, uiconst.VK_B)),
    525          c(self.CmdFleetGroup, None),
    526          c(self.CmdClearFleetBroadcastIcons, None)]
    527         if evespacemouse.IsEnabled():
    528             m += [c(self.CmdIncreaseSpaceMouseSpeed, None, repeatable=True),
    529              c(self.CmdDecreaseSpaceMouseSpeed, None, repeatable=True),
    530              c(self.CmdIncreaseSpaceMouseAcceleration, None, repeatable=True),
    531              c(self.CmdDecreaseSpaceMouseAcceleration, None, repeatable=True)]
    532         for cm in m:
    533             cm.category = 'navigation'
    534             ret.append(cm)
    535 
    536         m = [c(self.CmdDronesEngage, (uiconst.VK_F,)),
    537          c(self.CmdDronesReturnAndOrbit, (SHIFT, ALT, uiconst.VK_R)),
    538          c(self.CmdDronesReturnToBay, (SHIFT, uiconst.VK_R)),
    539          c(self.CmdReconnectToDrones, None),
    540          c(self.CmdToggleAggressivePassive, None),
    541          c(self.CmdToggleDroneFocusFire, None),
    542          c(self.CmdLaunchFavoriteDrones, (SHIFT, uiconst.VK_F))]
    543         for cm in m:
    544             cm.category = 'drones'
    545             ret.append(cm)
    546 
    547         m = [c(self.CmdLaunchAllFighters, None),
    548          c(self.CmdRecallAllFightersToTubes, None),
    549          c(self.CmdLaunchSelectedFighters, None),
    550          c(self.CmdRecallSelectedFightersToTubes, None),
    551          c(self.CmdSelectAllFighters, None),
    552          c(self.CmdDeselectAllFighters, None),
    553          c(self.CmdToggleShipSelection, None),
    554          c(self.CmdToggleTubeSelection_0, None),
    555          c(self.CmdToggleTubeSelection_1, None),
    556          c(self.CmdToggleTubeSelection_2, None),
    557          c(self.CmdToggleTubeSelection_3, None),
    558          c(self.CmdToggleTubeSelection_4, None)]
    559         for cm in m:
    560             cm.category = 'fighters'
    561             ret.append(cm)
    562 
    563         m = [c(self.CmdPrevStackedWindow, (CTRL, SHIFT, uiconst.VK_PRIOR)),
    564          c(self.CmdNextStackedWindow, (CTRL, SHIFT, uiconst.VK_NEXT)),
    565          c(self.CmdPrevTab, (CTRL, uiconst.VK_PRIOR)),
    566          c(self.CmdNextTab, (CTRL, uiconst.VK_NEXT)),
    567          c(self.CmdExitStation, None),
    568          c(self.CmdAbortUndock, None),
    569          c(self.CmdEnterHangar, None),
    570          c(self.CmdEnterStructure, None),
    571          c(self.CmdHideUI, (CTRL, uiconst.VK_F9)),
    572          c(self.CmdHideCursor, (ALT, uiconst.VK_F9)),
    573          c(self.CmdToggle3DView, (CTRL, SHIFT, uiconst.VK_F9)),
    574          c(self.CmdToggleEffects, (CTRL,
    575           ALT,
    576           SHIFT,
    577           uiconst.VK_E)),
    578          c(self.CmdToggleEffectTurrets, (CTRL,
    579           ALT,
    580           SHIFT,
    581           uiconst.VK_T)),
    582          c(self.CmdOpenRadialMenu, None, hintPath='UI/SystemMenu/Shortcuts/RadialMenuHint'),
    583          c(self.CmdOpenBroadcastRadialMenu, None, hintPath='UI/SystemMenu/Shortcuts/BroadcastRadialMenuHint'),
    584          c(self.CmdZoomIn, (CTRL, SHIFT, uiconst.VK_A), repeatable=True),
    585          c(self.CmdZoomOut, (CTRL, SHIFT, uiconst.VK_Z), repeatable=True),
    586          c(self.CmdToggleSystemMenu, None, enabled=False),
    587          c(self.CmdSetSearchBarFocus, (SHIFT, uiconst.VK_S)),
    588          c(self.CmdCompressAllOreInCurrentship, None),
    589          c(self.CmdOpenSelectedCargoContainer, None)]
    590         ret.extend(m)
    591         if bool(session.role & ROLE_CONTENT):
    592             ret.append(c(self.OpenDungeonEditor, (CTRL, SHIFT, uiconst.VK_D)))
    593         if bool(session.role & ROLEMASK_ELEVATEDPLAYER):
    594             ret.append(c(self.CmdToggleCombatView, (CTRL, ALT, uiconst.VK_T)))
    595         m = [c(self.CmdToggleTargetItem, None),
    596          c(self.CmdLockTargetItem, CTRL),
    597          c(self.CmdSelectTargetItem, SHIFT),
    598          c(self.CmdUnlockTargetItem, (CTRL, SHIFT)),
    599          c(self.CmdUnlockTargetItems, None),
    600          c(self.CmdToggleLookAtItem, ALT),
    601          c(self.CmdToggleCameraTracking, uiconst.VK_C),
    602          c(self.CmdApproachItem, uiconst.VK_Q),
    603          c(self.CmdAlignToItem, uiconst.VK_A),
    604          c(self.CmdOrbitItem, uiconst.VK_W),
    605          c(self.CmdKeepItemAtRange, uiconst.VK_E),
    606          c(self.CmdShowItemInfo, uiconst.VK_T),
    607          c(self.CmdDockOrJumpOrActivateGate, uiconst.VK_D),
    608          c(self.CmdWarpToItem, uiconst.VK_S),
    609          c(self.MakeCmdTagItem('1'), uiconst.VK_1),
    610          c(self.MakeCmdTagItem('2'), uiconst.VK_2),
    611          c(self.MakeCmdTagItem('3'), uiconst.VK_3),
    612          c(self.MakeCmdTagItem('A'), uiconst.VK_4),
    613          c(self.MakeCmdTagItem('B'), uiconst.VK_5),
    614          c(self.MakeCmdTagItem('C'), uiconst.VK_6),
    615          c(self.MakeCmdTagItem('X'), None),
    616          c(self.MakeCmdTagItem('Y'), None),
    617          c(self.MakeCmdTagItem('Z'), None),
    618          c(self.MakeCmdTagItem(None), None),
    619          c(self.MakeCmdTagItemFromSequence(['1', '2', '3']), uiconst.VK_7),
    620          c(self.MakeCmdTagItemFromSequence(['A', 'B', 'C']), uiconst.VK_8),
    621          c(self.MakeCmdTagItemFromSequence(['X', 'Y', 'Z']), uiconst.VK_9),
    622          c(self.MakeCmdTagItemFromSequence(['1',
    623           '2',
    624           '3',
    625           '4',
    626           '5',
    627           '6',
    628           '7',
    629           '8',
    630           '9']), None),
    631          c(self.MakeCmdTagItemFromSequence(['A',
    632           'B',
    633           'C',
    634           'D',
    635           'E',
    636           'F',
    637           'G',
    638           'H',
    639           'I']), None),
    640          c(self.CmdSetDefenceStance, (SHIFT, uiconst.VK_1)),
    641          c(self.CmdSetSniperStance, (SHIFT, uiconst.VK_2)),
    642          c(self.CmdSetSpeedStance, (SHIFT, uiconst.VK_3)),
    643          c(self.CmdIncreaseProbeScanRange, None),
    644          c(self.CmdDecreaseProbeScanRange, None),
    645          c(self.CmdRefreshProbeScan, uiconst.VK_B),
    646          c(self.CmdRefreshDirectionalScan, uiconst.VK_V),
    647          c(self.CmdToggleAutoTracking, (SHIFT, uiconst.VK_C)),
    648          c(self.CmdGetLocationMenuForNavigation, None)]
    649         for cm in m:
    650             cm.category = 'combat'
    651             ret.append(cm)
    652 
    653         m = [c(self.CmdOpenNewMessage, None),
    654          c(self.CmdSetChatChannelFocus, uiconst.VK_SPACE),
    655          c(self.CmdSetOverviewFocus, (ALT, uiconst.VK_SPACE)),
    656          c(self.CmdToggleMap, uiconst.VK_F10),
    657          c(self.CmdToggleSolarSystemMap, uiconst.VK_F9),
    658          c(self.CmdToggleShipTree, None),
    659          c(self.OpenAssets, (ALT, uiconst.VK_T)),
    660          c(self.OpenCalculator, None),
    661          c(self.OpenCalendar, None),
    662          c(self.OpenCapitalNavigation, None),
    663          c(self.OpenCargoHoldOfActiveShip, None),
    664          c(self.OpenGeneralMiningHoldOfActiveShip, None),
    665          c(self.OpenMineralHoldOfActiveShip, None),
    666          c(self.OpenPlanetaryCommoditiesHoldOfActiveShip, None),
    667          c(self.OpenFuelBayOfActiveShip, None),
    668          c(self.OpenFwEnlistment, None),
    669          c(self.OpenInsurgencyDashboard, None),
    670          c(self.OpenRelevantFWWindow, None),
    671          c(self.ToggleTheatersOfWarWindow, None),
    672          c(self.OpenAmmoHoldOfActiveShip, None),
    673          c(self.OpenFleetHangarOfActiveShip, None),
    674          c(self.OpenShipMaintenanceOfBayActiveShip, None),
    675          c(self.OpenInfrastructureBayOfActiveShip, None),
    676          c(self.OpenChannels, None),
    677          c(self.OpenCharactersheet, (ALT, uiconst.VK_A)),
    678          c(self.OpenConfigMenu, None),
    679          c(self.OpenContracts, None),
    680          c(self.OpenCorpDeliveries, None),
    681          c(self.OpenCorporationItemDeliveries, None),
    682          c(self.OpenCorpHangar, None),
    683          c(self.OpenCorporationPanel, None),
    684          c(self.OpenDroneBayOfActiveShip, None),
    685          c(self.OpenFighterBayOfActiveShip, None),
    686          c(self.OpenIndustry, (ALT, uiconst.VK_S)),
    687          c(self.OpenFitting, (ALT, uiconst.VK_F)),
    688          c(self.OpenFleet, None),
    689          c(self.OpenFpsMonitor, (CTRL, uiconst.VK_F)),
    690          c(self.OpenHangarFloor, (ALT, uiconst.VK_G)),
    691          c(self.OpenPlexVault, None),
    692          c(self.OpenHelp, uiconst.VK_F12),
    693          c(self.OpenInsurance, None),
    694          c(self.OpenAgencyNew, (ALT, uiconst.VK_M)),
    695          c(self.OpenLoginRewardWindow, None),
    696          c(self.OpenLog, None),
    697          c(self.OpenLpstore, None),
    698          c(self.OpenMail, (ALT, uiconst.VK_I)),
    699          c(self.OpenMapBrowser, k(win=uiconst.VK_F11, mac=(ALT, uiconst.VK_B))),
    700          c(self.OpenMarket, (ALT, uiconst.VK_R)),
    701          c(self.OpenMarketOrders, (ALT, uiconst.VK_O)),
    702          c(self.OpenMultibuy, None),
    703          c(self.OpenMedical, None),
    704          c(self.OpenMilitia, None),
    705          c(self.OpenMiningScanResultsWindow, None),
    706          c(self.OpenMoonMining, None),
    707          c(self.OpenNotepad, None),
    708          c(self.OpenOverviewSettings, None),
    709          c(self.OpenPeopleAndPlaces, (ALT, uiconst.VK_E)),
    710          c(self.OpenCharacterCustomization, None),
    711          c(self.OpenRepairshop, None),
    712          c(self.OpenReprocessingPlant, None),
    713          c(self.ToggleProbeScanner, (ALT, uiconst.VK_P)),
    714          c(self.OpenDirectionalScanner, (ALT, uiconst.VK_D)),
    715          c(self.OpenMoonScan, None),
    716          c(self.OpenSecurityOffice, None),
    717          c(self.OpenShipConfig, None),
    718          c(self.OpenShipHangar, (ALT, uiconst.VK_N)),
    719          c(self.OpenInventory, (ALT, uiconst.VK_C)),
    720          c(self.OpenSkillsWindow, (ALT, uiconst.VK_X)),
    721          c(self.OpenWallet, (ALT, uiconst.VK_W)),
    722          c(self.CmdForceFadeFromBlack, (SHIFT, uiconst.VK_BACK)),
    723          c(self.OpenCompare, None),
    724          c(self.OpenEveMenu, uiconst.VK_OEM_5),
    725          c(self.OpenFittingMgmt, None),
    726          c(self.ToggleAurumStore, (ALT, uiconst.VK_4)),
    727          c(self.ToggleRedeemItems, (ALT, uiconst.VK_Y)),
    728          c(self.OpenPlanets, None),
    729          c(self.OpenMyMercenaryDens, None),
    730          c(self.OpenStructureBrowser, None),
    731          c(self.OpenAccessGroupsWindow, None),
    732          c(self.OpenLedger, None),
    733          c(self.OpenSeason, None),
    734          c(self.OpenContextualOffersWindow, None),
    735          c(self.OpenPVPFilamentEventWindow, None),
    736          c(self.CmdGetUiPointer, None),
    737          c(self.OpenCombatAnomaliesInAgency, None),
    738          c(self.OpenEncounterSurveillanceSystemInAgency, None),
    739          c(self.CmdToggleAirCareerProgram, None),
    740          c(self.OpenFrigateEscapeBay, None),
    741          c(self.OpenManageRoute, None),
    742          c(self.OpenFleetWatchlist, None),
    743          c(self.OpenPaintToolWindow, None),
    744          c(self.OpenShipSKINRWindow, None),
    745          c(self.OpenOmegaUpsellWindow, None)]
    746         m.append(c(self.OpenAchievementsWindow, None))
    747         m.append(c(self.OpenLocations, uiconst.VK_L))
    748         m.append(c(self.ToggleCurrentSystemLocationWnd, None))
    749         if sm.GetService('raffleSvc').is_available:
    750             m.append(c(self.OpenRaffleWindow, None))
    751         if is_job_board_available():
    752             m.append(c(self.OpenJobBoardWindow, (ALT, uiconst.VK_J)))
    753             if not are_missions_in_job_board_available():
    754                 m.append(c(self.OpenJournal, (ALT, None)))
    755         else:
    756             m.append(c(self.OpenJournal, (ALT, uiconst.VK_J)))
    757         if aura_guidance_enabled():
    758             m.append(c(self.OpenAuraGuidance, None))
    759         if ArePointerLinksActive(sm.GetService('machoNet')):
    760             m += [c(self.OpenPointerWnd, None)]
    761         if not IsPlayerBountyHidden(sm.GetService('machoNet')):
    762             m.append(c(self.OpenBountyOffice, None))
    763         if not AmOnChineseServer():
    764             m.append(c(self.ToggleProjectDiscovery, None))
    765         if bool(session.role & ROLE_PROGRAMMER):
    766             m.append(c(self.OpenUIDebugger, None))
    767             m.append(c(self.ToggleTelemetryRecord, None))
    768             m.append(c(self.ToggleUILinearColor, None))
    769             m.append(c(self.ToggleGammaCorrectText, None))
    770             m.append(c(self.OpenSkillTreeWindow, None))
    771             m.append(c(self.OpenImageCacheDemo, None))
    772         if localization.util.AmOnChineseServer():
    773             m.append(c(self.ToggleActivities, None))
    774         for cm in m:
    775             cm.category = 'window'
    776             ret.append(cm)
    777 
    778         m = [c(self.CmdPickPortrait0, uiconst.VK_F1),
    779          c(self.CmdPickPortrait1, uiconst.VK_F2),
    780          c(self.CmdPickPortrait2, uiconst.VK_F3),
    781          c(self.CmdPickPortrait3, uiconst.VK_F4)]
    782         for cm in m:
    783             cm.category = 'charactercreator'
    784             ret.append(cm)
    785 
    786         return ret
    787 
    788     def CmdActivateHighPowerSlot1(self, *args):
    789         self._cmdshipui(0, 0)
    790 
    791     def CmdActivateHighPowerSlot2(self, *args):
    792         self._cmdshipui(1, 0)
    793 
    794     def CmdActivateHighPowerSlot3(self, *args):
    795         self._cmdshipui(2, 0)
    796 
    797     def CmdActivateHighPowerSlot4(self, *args):
    798         self._cmdshipui(3, 0)
    799 
    800     def CmdActivateHighPowerSlot5(self, *args):
    801         self._cmdshipui(4, 0)
    802 
    803     def CmdActivateHighPowerSlot6(self, *args):
    804         self._cmdshipui(5, 0)
    805 
    806     def CmdActivateHighPowerSlot7(self, *args):
    807         self._cmdshipui(6, 0)
    808 
    809     def CmdActivateHighPowerSlot8(self, *args):
    810         self._cmdshipui(7, 0)
    811 
    812     def CmdActivateMediumPowerSlot1(self, *args):
    813         self._cmdshipui(0, 1)
    814 
    815     def CmdActivateMediumPowerSlot2(self, *args):
    816         self._cmdshipui(1, 1)
    817 
    818     def CmdActivateMediumPowerSlot3(self, *args):
    819         self._cmdshipui(2, 1)
    820 
    821     def CmdActivateMediumPowerSlot4(self, *args):
    822         self._cmdshipui(3, 1)
    823 
    824     def CmdActivateMediumPowerSlot5(self, *args):
    825         self._cmdshipui(4, 1)
    826 
    827     def CmdActivateMediumPowerSlot6(self, *args):
    828         self._cmdshipui(5, 1)
    829 
    830     def CmdActivateMediumPowerSlot7(self, *args):
    831         self._cmdshipui(6, 1)
    832 
    833     def CmdActivateMediumPowerSlot8(self, *args):
    834         self._cmdshipui(7, 1)
    835 
    836     def CmdActivateLowPowerSlot1(self, *args):
    837         self._cmdshipui(0, 2)
    838 
    839     def CmdActivateLowPowerSlot2(self, *args):
    840         self._cmdshipui(1, 2)
    841 
    842     def CmdActivateLowPowerSlot3(self, *args):
    843         self._cmdshipui(2, 2)
    844 
    845     def CmdActivateLowPowerSlot4(self, *args):
    846         self._cmdshipui(3, 2)
    847 
    848     def CmdActivateLowPowerSlot5(self, *args):
    849         self._cmdshipui(4, 2)
    850 
    851     def CmdActivateLowPowerSlot6(self, *args):
    852         self._cmdshipui(5, 2)
    853 
    854     def CmdActivateLowPowerSlot7(self, *args):
    855         self._cmdshipui(6, 2)
    856 
    857     def CmdActivateLowPowerSlot8(self, *args):
    858         self._cmdshipui(7, 2)
    859 
    860     def CmdOverloadHighPowerSlot1(self, *args):
    861         self._cmdoverload(0, 0)
    862 
    863     def CmdOverloadHighPowerSlot2(self, *args):
    864         self._cmdoverload(1, 0)
    865 
    866     def CmdOverloadHighPowerSlot3(self, *args):
    867         self._cmdoverload(2, 0)
    868 
    869     def CmdOverloadHighPowerSlot4(self, *args):
    870         self._cmdoverload(3, 0)
    871 
    872     def CmdOverloadHighPowerSlot5(self, *args):
    873         self._cmdoverload(4, 0)
    874 
    875     def CmdOverloadHighPowerSlot6(self, *args):
    876         self._cmdoverload(5, 0)
    877 
    878     def CmdOverloadHighPowerSlot7(self, *args):
    879         self._cmdoverload(6, 0)
    880 
    881     def CmdOverloadHighPowerSlot8(self, *args):
    882         self._cmdoverload(7, 0)
    883 
    884     def CmdOverloadMediumPowerSlot1(self, *args):
    885         self._cmdoverload(0, 1)
    886 
    887     def CmdOverloadMediumPowerSlot2(self, *args):
    888         self._cmdoverload(1, 1)
    889 
    890     def CmdOverloadMediumPowerSlot3(self, *args):
    891         self._cmdoverload(2, 1)
    892 
    893     def CmdOverloadMediumPowerSlot4(self, *args):
    894         self._cmdoverload(3, 1)
    895 
    896     def CmdOverloadMediumPowerSlot5(self, *args):
    897         self._cmdoverload(4, 1)
    898 
    899     def CmdOverloadMediumPowerSlot6(self, *args):
    900         self._cmdoverload(5, 1)
    901 
    902     def CmdOverloadMediumPowerSlot7(self, *args):
    903         self._cmdoverload(6, 1)
    904 
    905     def CmdOverloadMediumPowerSlot8(self, *args):
    906         self._cmdoverload(7, 1)
    907 
    908     def CmdOverloadLowPowerSlot1(self, *args):
    909         self._cmdoverload(0, 2)
    910 
    911     def CmdOverloadLowPowerSlot2(self, *args):
    912         self._cmdoverload(1, 2)
    913 
    914     def CmdOverloadLowPowerSlot3(self, *args):
    915         self._cmdoverload(2, 2)
    916 
    917     def CmdOverloadLowPowerSlot4(self, *args):
    918         self._cmdoverload(3, 2)
    919 
    920     def CmdOverloadLowPowerSlot5(self, *args):
    921         self._cmdoverload(4, 2)
    922 
    923     def CmdOverloadLowPowerSlot6(self, *args):
    924         self._cmdoverload(5, 2)
    925 
    926     def CmdOverloadLowPowerSlot7(self, *args):
    927         self._cmdoverload(6, 2)
    928 
    929     def CmdOverloadLowPowerSlot8(self, *args):
    930         self._cmdoverload(7, 2)
    931 
    932     def CmdOverloadHighPowerRack(self, *args):
    933         self._cmdoverloadrack('Hi')
    934 
    935     def CmdOverloadMediumPowerRack(self, *args):
    936         self._cmdoverloadrack('Med')
    937 
    938     def CmdOverloadLowPowerRack(self, *args):
    939         self._cmdoverloadrack('Lo')
    940 
    941     def CmdSelectPrevTarget(self, *args):
    942         sm.GetService('target').SelectPrevTarget()
    943         self.CmdSetOverviewFocus()
    944 
    945     def CmdSelectNextTarget(self, *args):
    946         sm.GetService('target').SelectNextTarget()
    947         self.CmdSetOverviewFocus()
    948 
    949     def CmdZoomIn(self, *args):
    950         self._Zoom(direction=-1)
    951 
    952     CmdZoomIn.nameLabelPath = 'UI/Inflight/ZoomIn'
    953 
    954     def CmdZoomOut(self, *args):
    955         self._Zoom(direction=1)
    956 
    957     CmdZoomOut.nameLabelPath = 'UI/Inflight/ZoomOut'
    958 
    959     def _Zoom(self, direction):
    960         viewSvc = sm.GetService('viewState')
    961         simulatedMouseScroll = direction * 120
    962         activeWindow = uicore.registry.GetActiveStackOrWindow()
    963         if activeWindow and hasattr(activeWindow, 'CmdZoomInOut'):
    964             activeWindow.CmdZoomInOut(simulatedMouseScroll)
    965         elif viewSvc.IsViewActive('planet', 'starmap', 'systemmap', 'shiptree', 'inflight', 'station', 'hangar'):
    966             view = viewSvc.GetCurrentView()
    967             view.ZoomBy(simulatedMouseScroll)
    968         if eveCfg.InSpace():
    969             if simulatedMouseScroll < 0:
    970                 sm.ScatterEvent('OnClientMouseZoomInSpace', simulatedMouseScroll)
    971             else:
    972                 sm.ScatterEvent('OnClientMouseZoomOutSpace', simulatedMouseScroll)
    973 
    974     def CmdToggleAutopilot(self, *args):
    975         if eveCfg.InSpace():
    976             if sm.GetService('autoPilot').GetState():
    977                 sm.GetService('autoPilot').SetOff()
    978             else:
    979                 sm.GetService('autoPilot').SetOn()
    980 
    981     CmdToggleAutopilot.nameLabelPath = 'Tooltips/Hud/Autopilot'
    982     CmdToggleAutopilot.descriptionLabelPath = 'Tooltips/Hud/Autopilot_description'
    983 
    984     def CmdCompressAllOreInCurrentship(self, *args):
    985         if not eveCfg.InSpace():
    986             return
    987         CompressInSpaceController().CompressAllOreInCurrentship()
    988 
    989     CmdCompressAllOreInCurrentship.nameLabelPath = 'UI/Inflight/CompressAllOreInCurrentShip'
    990 
    991     def CmdToggleTacticalOverlay(self, *args):
    992         if eveCfg.InSpace():
    993             sm.GetService('tactical').ToggleOnOff()
    994 
    995     CmdToggleTacticalOverlay.nameLabelPath = 'Tooltips/Hud/Tactical'
    996     CmdToggleTacticalOverlay.descriptionLabelPath = 'Tooltips/Hud/Tactical_description'
    997 
    998     def CmdMiningScan(self, *args):
    999         if eveCfg.InSpace():
   1000             from mining.client.mining_overlay_controller import MiningOverlayController
   1001             MiningOverlayController.get_instance().perform_scan()
   1002 
   1003     CmdMiningScan.nameLabelPath = 'Tooltips/Hud/MiningScan'
   1004     CmdMiningScan.descriptionLabelPath = 'Tooltips/Hud/MiningScan_description'
   1005 
   1006     def OpenMiningScanResultsWindow(self, *args):
   1007         if eveCfg.InSpace():
   1008             MiningScanResultsWindow.ToggleOpenClose()
   1009 
   1010     OpenMiningScanResultsWindow.nameLabelPath = 'UI/Inflight/Scanner/MiningScanResults'
   1011 
   1012     def SetSpeedFraction(self, speed):
   1013         remote = sm.GetService('michelle').GetRemotePark()
   1014         if remote:
   1015             remote.CmdSetSpeedFraction(speed)
   1016 
   1017     def CmdDecelerate(self, *args):
   1018         if eveCfg.InShipInSpace():
   1019             bp = sm.GetService('michelle').GetBallpark()
   1020             ownBall = bp.GetBall(session.shipid)
   1021             if ownBall is not None:
   1022                 self.SetSpeedFractionThrottled(min(1.0, ownBall.speedFraction - 0.1))
   1023 
   1024     def CmdAccelerate(self, *args):
   1025         if eveCfg.InShipInSpace():
   1026             rp = sm.GetService('michelle').GetRemotePark()
   1027             bp = sm.GetService('michelle').GetBallpark()
   1028             ownBall = bp.GetBall(session.shipid)
   1029             if rp is not None and ownBall is not None:
   1030                 if ownBall.mode == destiny.DSTBALL_STOP and not sm.GetService('autoPilot').GetState():
   1031                     direction = trinity.TriVector(0.0, 0.0, 1.0)
   1032                     currentDirection = ownBall.GetQuaternionAt(blue.os.GetSimTime())
   1033                     direction.TransformQuaternion(currentDirection)
   1034                     rp.CmdGotoDirection(direction.x, direction.y, direction.z)
   1035                     GetMenuService().ClearAlignTargets()
   1036                 self.SetSpeedFractionThrottled(min(1.0, ownBall.speedFraction + 0.1))
   1037 
   1038     def CmdStopShip(self, *args):
   1039         if eveCfg.InShipInSpace():
   1040             autoPilot = sm.GetService('autoPilot')
   1041             autoPilot.CancelSystemNavigation()
   1042             if session.IsItSafe():
   1043                 bp = sm.GetService('michelle').GetRemotePark()
   1044                 if bp and session.IsItSafe():
   1045                     bp.CmdStop()
   1046             sm.GetService('logger').AddText(GetByLabel('UI/Commands/ShipStopping'), 'notify')
   1047             GetAudioService().SendUIEvent('ui_radial_select_play')
   1048             HudActionIndicationController.get_instance().set_temporary_indication(IndicationData(GetByLabel('UI/Inflight/Messages/ShipStoppingHeader')), blink=True)
   1049             if autoPilot.GetState():
   1050                 autoPilot.SetOff()
   1051             sm.ScatterEvent('OnClientEvent_StopShip')
   1052 
   1053     def CmdSetShipFullSpeed(self, *args):
   1054         bp = sm.GetService('michelle').GetBallpark()
   1055         rbp = sm.GetService('michelle').GetRemotePark()
   1056         if bp is None or rbp is None:
   1057             return
   1058         if eveCfg.IsControllingStructure():
   1059             return
   1060         ownBall = bp.GetBall(session.shipid)
   1061         if ownBall and rbp is not None and ownBall.mode == destiny.DSTBALL_STOP:
   1062             if not sm.GetService('autoPilot').GetState():
   1063                 direction = trinity.TriVector(0.0, 0.0, 1.0)
   1064                 currentDirection = ownBall.GetQuaternionAt(blue.os.GetSimTime())
   1065                 direction.TransformQuaternion(currentDirection)
   1066                 rbp.CmdGotoDirection(direction.x, direction.y, direction.z)
   1067                 GetMenuService().ClearAlignTargets()
   1068         if rbp is not None:
   1069             rbp.CmdSetSpeedFraction(1.0)
   1070             speedText = self._FormatSpeed(ownBall.maxVelocity)
   1071             sm.GetService('logger').AddText(speedText, 'notify')
   1072             GetAudioService().SendUIEvent('ui_radial_select_play')
   1073             HudActionIndicationController.get_instance().set_temporary_indication(IndicationData(GetByLabel('UI/Inflight/Messages/ShipFullSpeedHeader'), speedText), blink=True)
   1074 
   1075     def _FormatSpeed(self, speed):
   1076         if speed >= 100:
   1077             speed = long(speed)
   1078         return localization.GetByLabel('UI/Commands/SpeedChangedTo', speed=speed)
   1079 
   1080     def CmdToggleShowAllBrackets(self, *args):
   1081         if eveCfg.InSpace():
   1082             bracketSettings.toggle_show_all_brackets()
   1083 
   1084     def CmdToggleShowNoBrackets(self, *args):
   1085         if eveCfg.InSpace():
   1086             bracketSettings.toggle_show_no_brackets()
   1087 
   1088     def CmdToggleShowSpecialBrackets(self, *args):
   1089         if eveCfg.InSpace():
   1090             bracketSettings.bracket_showing_specials_setting.toggle()
   1091 
   1092     def CmdReloadAmmo(self, *args):
   1093         if uicore.layer.shipui.isopen:
   1094             uicore.layer.shipui.OnReloadAmmo()
   1095 
   1096     def _cmdshipui(self, sidx, gidx):
   1097         if uicore.layer.shipui.isopen:
   1098             uicore.layer.shipui.OnF(sidx, gidx)
   1099 
   1100     def _cmdoverload(self, sidx, gidx):
   1101         if uicore.layer.shipui.isopen:
   1102             uicore.layer.shipui.OnFKeyOverload(sidx, gidx)
   1103 
   1104     def _cmdoverloadrack(self, what):
   1105         if uicore.layer.shipui.isopen:
   1106             uicore.layer.shipui.ToggleRackOverload(what)
   1107 
   1108     def CmdQuitGame(self, *args):
   1109         if self.isCmdQuitPending:
   1110             return
   1111         self.isCmdQuitPending = True
   1112         try:
   1113             if MessageBox.is_disconnect_dialog_open() or prompt_player_fsd_dialog('AskQuitGame', {}, uiconst.YESNO, suppress=uiconst.ID_YES) == uiconst.ID_YES:
   1114                 self.DoQuitGame()
   1115         finally:
   1116             self.isCmdQuitPending = False
   1117 
   1118     CmdQuitGame.nameLabelPath = 'UI/Commands/CmdQuitGame'
   1119 
   1120     def DoQuitGame(self):
   1121         try:
   1122             check_for_character_creation_exit()
   1123             if session.charid:
   1124                 sm.GetService('skillqueue').OnCloseApp()
   1125             self.settings.SaveSettings()
   1126             sm.GetService('clientStatsSvc').OnProcessExit()
   1127         except:
   1128             self.LogException()
   1129         finally:
   1130             bluepy.Terminate(0, 'User requesting close')
   1131 
   1132     def _CheckLogoffApplicable(self):
   1133         viewStateSvc = sm.GetService('viewState')
   1134         if eveCfg.IsControllingStructure():
   1135             raise UserError('CannotWhileControllingStructure')
   1136         if viewStateSvc.IsViewActive('planet'):
   1137             currentPlanet = sm.GetService('planetUI').GetCurrentPlanet()
   1138             if currentPlanet and currentPlanet.IsInEditMode():
   1139                 raise UserError('CannotWhileEditingPlanetaryProduction')
   1140         return True
   1141 
   1142     def CmdLogOff(self, *args):
   1143         check_for_character_creation_exit()
   1144         if AllowCharacterLogoff(sm.GetService('machoNet')):
   1145             viewStateSvc = sm.GetService('viewState')
   1146             if viewStateSvc.HasActiveTransition():
   1147                 self.LogWarn("Denying logoff attempt as we're currently transitioning between viewStates.")
   1148                 return False
   1149             if session.charid:
   1150                 if not self._CheckLogoffApplicable():
   1151                     return
   1152                 if viewStateSvc.GetCurrentViewInfo().IsSecondary():
   1153                     viewStateSvc.CloseSecondaryView()
   1154                 if SessionChecker(session, sm).IsPilotInShipInSpace():
   1155                     ShipTreeDockablePanel.CloseIfOpen()
   1156                     self.LogNotice('Initiating safe logoff for character %s' % cfg.eveowners.Get(session.charid).name)
   1157                     GetMenuService().SafeLogoff()
   1158                 else:
   1159                     if not (viewStateSvc.IsViewActive('hangar') or viewStateSvc.IsViewActive('structure')):
   1160                         self.LogWarn('Cannot logoff with view %s active' % viewStateSvc.GetCurrentView())
   1161                         return False
   1162                     if prompt_player_fsd_dialog('AskLogoffToCharacterSelection', {}, uiconst.YESNO, suppress=uiconst.ID_YES) == uiconst.ID_YES:
   1163                         sm.GetService('gameui').LogOffCharacter()
   1164         else:
   1165             modalWnd = uicore.registry.GetModalWindow()
   1166             if modalWnd and modalWnd.__guid__ == 'form.MessageBox':
   1167                 return
   1168             if prompt_player_fsd_dialog('AskLogoffGame', {}, uiconst.YESNO, suppress=uiconst.ID_YES) == uiconst.ID_YES:
   1169                 check_for_character_creation_exit()
   1170                 self.settings.SaveSettings()
   1171                 appUtils.Reboot('Generic Logoff')
   1172 
   1173     CmdLogOff.nameLabelPath = 'UI/Commands/CmdLogOff'
   1174     CmdLogOff.descriptionFunc = GetCmdLogoffHint
   1175 
   1176     def CmdDronesEngage(self, *args):
   1177         drones = sm.GetService('michelle').GetDrones()
   1178         if drones is None:
   1179             return
   1180         entity = eveMoniker.GetEntityAccess()
   1181         if not entity:
   1182             return
   1183         droneItemIDsAndTypeIDs = [ (droneID, drone.typeID) for droneID, drone in drones.iteritems() ]
   1184         droneFunctions.PerformPrimaryAction(droneItemIDsAndTypeIDs)
   1185 
   1186     CmdDronesEngage.nameLabelPath = 'UI/Commands/CmdDronesEngage'
   1187 
   1188     def CmdDronesReturnAndOrbit(self, *args):
   1189         drones = sm.GetService('michelle').GetDrones()
   1190         if drones:
   1191             droneIDs = drones.keys()
   1192             targetID = sm.GetService('target').GetActiveTargetID()
   1193             entity = eveMoniker.GetEntityAccess()
   1194             if entity:
   1195                 ret = entity.CmdReturnHome(droneIDs)
   1196                 GetMenuService().HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
   1197                 if droneIDs and targetID:
   1198                     prompt_player_fsd_dialog('Command', {'command': localization.GetByLabel('UI/Commands/DronesReturningAndOrbiting')})
   1199         sm.GetService('fighters').RecallAllFightersAndOrbit()
   1200 
   1201     CmdDronesReturnAndOrbit.nameLabelPath = 'UI/Commands/CmdDronesReturnAndOrbit'
   1202 
   1203     def CmdDronesReturnToBay(self, *args):
   1204         drones = sm.GetService('michelle').GetDrones()
   1205         if drones:
   1206             droneIDs = drones.keys()
   1207             targetID = sm.GetService('target').GetActiveTargetID()
   1208             entity = eveMoniker.GetEntityAccess()
   1209             if entity:
   1210                 ret = entity.CmdReturnBay(droneIDs)
   1211                 GetMenuService().HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
   1212                 if droneIDs and targetID:
   1213                     prompt_player_fsd_dialog('Command', {'command': localization.GetByLabel('UI/Commands/DronesReturningToDroneBay')})
   1214         self.CmdRecallAllFightersToTubes()
   1215 
   1216     CmdDronesReturnToBay.nameLabelPath = 'UI/Commands/CmdDronesReturnToBay'
   1217 
   1218     def _GetDronesToLaunch(self):
   1219         favoriteDroneIDsPresent = GetDroneGroupsController().GetFavoriteGroupDroneIDsInBayOrSpace()
   1220         if favoriteDroneIDsPresent:
   1221             return [ x for x in GetDronesInBay() if x.itemID in favoriteDroneIDsPresent ]
   1222         return GetDronesInBay()
   1223 
   1224     def CmdLaunchFavoriteDrones(self, *args):
   1225         if not session.shipid or sm.GetService('michelle').GetBallpark() is None:
   1226             return
   1227         dronesToLaunch = self._GetDronesToLaunch()
   1228         if dronesToLaunch:
   1229             GetMenuService().LaunchDrones(dronesToLaunch)
   1230 
   1231     CmdLaunchFavoriteDrones.nameLabelPath = 'UI/Drones/LaunchDrones'
   1232     CmdLaunchFavoriteDrones.descriptionLabelPath = 'UI/Drones/HintOnFavoriteIcon'
   1233 
   1234     def CmdReconnectToDrones(self, *args):
   1235         GetMenuService().ReconnectToDrones()
   1236 
   1237     def CmdLaunchAllFighters(self, *args):
   1238         sm.GetService('fighters').LaunchAllFighters()
   1239 
   1240     def CmdRecallAllFightersToTubes(self):
   1241         sm.GetService('fighters').RecallAllFightersToTubes()
   1242 
   1243     def CmdToggleTubeSelection_0(self, *args):
   1244         self._DoToggleTubeSelection(appConst.flagFighterTube0)
   1245 
   1246     def CmdToggleTubeSelection_1(self, *args):
   1247         self._DoToggleTubeSelection(appConst.flagFighterTube1)
   1248 
   1249     def CmdToggleTubeSelection_2(self, *args):
   1250         self._DoToggleTubeSelection(appConst.flagFighterTube2)
   1251 
   1252     def CmdToggleTubeSelection_3(self, *args):
   1253         self._DoToggleTubeSelection(appConst.flagFighterTube3)
   1254 
   1255     def CmdToggleTubeSelection_4(self, *args):
   1256         self._DoToggleTubeSelection(appConst.flagFighterTube4)
   1257 
   1258     def _DoToggleTubeSelection(self, tubeFlagID):
   1259         sm.GetService('fighters').ToggleSelectionForFightersForTube(tubeFlagID)
   1260 
   1261     def CmdLaunchSelectedFighters(self):
   1262         sm.GetService('fighters').LaunchSelectedFighters()
   1263 
   1264     def CmdRecallSelectedFightersToTubes(self):
   1265         sm.GetService('fighters').RecallSelectedFightersToTubes()
   1266 
   1267     def CmdSelectAllFighters(self):
   1268         sm.GetService('fighters').SelectAllFighters()
   1269 
   1270     def CmdDeselectAllFighters(self):
   1271         sm.GetService('fighters').DeselectAllFighters()
   1272 
   1273     def CmdToggleShipSelection(self):
   1274         if session.shipid:
   1275             movementFunctions.ToggleSelectForNavigation(session.shipid)
   1276 
   1277     def CmdToggleAggressivePassive(self, *args):
   1278         drones_aggressive_setting.toggle()
   1279 
   1280     def CmdToggleDroneFocusFire(self, *args):
   1281         drones_focus_fire_setting.toggle()
   1282 
   1283     def WinCmdToggleWindowed(self, *args):
   1284         lastTimeToggled = settings.user.ui.Get('LastTimeToggleWindowed', 0)
   1285         if blue.os.GetWallclockTime() - lastTimeToggled > 2 * appConst.SEC:
   1286             settings.user.ui.Set('LastTimeToggleWindowed', blue.os.GetWallclockTime())
   1287             sm.GetService('device').ToggleWindowed()
   1288 
   1289     def CmdResetMonitor(self, *args):
   1290         sm.GetService('device').ResetMonitor()
   1291 
   1292     def CmdToggleSolarSystemMap(self, **kwargs):
   1293         if session.charid:
   1294             from eve.client.script.ui.shared.mapView.mapViewUtil import ToggleSolarSystemMap
   1295             if is_solarsystem_map_suppressed(session.solarsystemid2):
   1296                 raise UserError('CannotProbeScanInSystem')
   1297             ToggleSolarSystemMap(**kwargs)
   1298 
   1299     CmdToggleSolarSystemMap.nameLabelPath = 'UI/Map/MapPallet/btnSolarsystemMap'
   1300     CmdToggleSolarSystemMap.descriptionLabelPath = ''
   1301 
   1302     def CmdToggleMap(self, *args):
   1303         if session.charid is not None and not getattr(self, 'loadingCharacterCustomization', False):
   1304             if not classic_map_enabled_setting.is_enabled():
   1305                 self._CmdToggleMapBeta()
   1306             else:
   1307                 uthread.new(sm.GetService('map').Toggle).context = 'svc.map.Toggle'
   1308                 sm.ScatterEvent('OnClientEvent_OpenMap')
   1309 
   1310     CmdToggleMap.nameLabelPath = 'UI/Neocom/MapBtn'
   1311     CmdToggleMap.descriptionLabelPath = 'Tooltips/Neocom/Map_description'
   1312 
   1313     def _CmdToggleMapBeta(self, *args):
   1314         from eve.client.script.ui.shared.mapView.mapViewPanel import MapViewPanel
   1315         wnd = MapViewPanel.GetIfOpen()
   1316         if not wnd:
   1317             MapViewPanel.Open(parent=uicore.layer.main)
   1318         elif wnd.IsMinimized():
   1319             wnd.Maximize()
   1320         else:
   1321             MapViewPanel.CloseIfOpen()
   1322 
   1323     def CmdToggleShipTree(self):
   1324         wnd = ShipTreeDockablePanel.GetIfOpen()
   1325         if not wnd:
   1326             if not sm.GetService('viewState').SafeLogoffInProgress():
   1327                 ShipTreeDockablePanel.Open(parent=uicore.layer.main)
   1328         elif wnd.IsMinimized():
   1329             wnd.Maximize()
   1330         else:
   1331             ShipTreeDockablePanel.CloseIfOpen()
   1332 
   1333     CmdToggleShipTree.nameLabelPath = 'UI/Neocom/ShipTreeBtn'
   1334     CmdToggleShipTree.descriptionLabelPath = 'Tooltips/Neocom/ISIS_description'
   1335 
   1336     def CmdToggleAirCareerProgram(self, **kwargs):
   1337         wnd = CareerPortalDockablePanel.GetIfOpen()
   1338         if not wnd:
   1339             CareerPortalDockablePanel.Open(parent=uicore.layer.main)
   1340         elif wnd.IsMinimized():
   1341             wnd.Maximize()
   1342         else:
   1343             CareerPortalDockablePanel.ToggleMinimize(wnd)
   1344 
   1345     CmdToggleAirCareerProgram.nameLabelPath = 'UI/CareerPortal/CareerPortalWnd'
   1346     CmdToggleAirCareerProgram.descriptionLabelPath = 'UI/CareerPortal/CareerPortalWndDescription'
   1347 
   1348     def CmdPrevStackedWindow(self, *args):
   1349         wnd = uicore.registry.GetActive()
   1350         if wnd is None or not wnd.stacked:
   1351             return
   1352         tabGroup = wnd.stack.GetTabGroup()
   1353         tabGroup.SelectPrev()
   1354 
   1355     def CmdNextStackedWindow(self, *args):
   1356         wnd = uicore.registry.GetActive()
   1357         if wnd is None or not isinstance(wnd, Window) or not wnd.stacked:
   1358             return
   1359         tabGroup = wnd.stack.GetTabGroup()
   1360         tabGroup.SelectNext()
   1361 
   1362     def CmdPrevTab(self, *args):
   1363         tabGroup = self._GetTabgroup()
   1364         if tabGroup:
   1365             tabGroup.SelectPrev()
   1366 
   1367     def CmdNextTab(self, *args):
   1368         tabGroup = self._GetTabgroup()
   1369         if tabGroup:
   1370             tabGroup.SelectNext()
   1371 
   1372     def _GetTabgroup(self):
   1373         wnd = uicore.registry.GetActive()
   1374         if not wnd:
   1375             return
   1376         MAXRECURS = 10
   1377         tabGroup = self._FindTabGroup(wnd.sr.maincontainer, MAXRECURS)
   1378         if not tabGroup and wnd.stacked:
   1379             tabGroup = wnd.stack.GetTabGroup()
   1380         return tabGroup
   1381 
   1382     def _FindTabGroup(self, parent, maxLevel):
   1383         if isinstance(parent, TabGroup) and not parent.destroyed:
   1384             return parent
   1385         if not hasattr(parent, 'children') or not parent.children or maxLevel == 0:
   1386             return
   1387         blue.pyos.BeNice()
   1388         for c in parent.children:
   1389             tabGroup = self._FindTabGroup(c, maxLevel - 1)
   1390             if tabGroup:
   1391                 return tabGroup
   1392 
   1393     def CmdExitStation(self, *args):
   1394         if uicore.registry.GetModalWindow():
   1395             return
   1396         ccLayer = uicore.layer.Get('charactercreation')
   1397         if ccLayer and ccLayer.isopen:
   1398             return
   1399         if sm.GetService('viewState').HasActiveTransition():
   1400             return
   1401         if eveCfg.IsControllingStructure():
   1402             return
   1403         if session.stationid or session.structureid:
   1404             sm.GetService('undocking').ExitDockableLocation()
   1405 
   1406     def CmdAbortUndock(self, *args):
   1407         if not eveCfg.IsDocked():
   1408             return
   1409         sm.GetService('undocking').AbortUndock()
   1410 
   1411     CmdAbortUndock.nameLabelPath = 'UI/Station/AbortUndock'
   1412 
   1413     def CmdEnterHangar(self, *args):
   1414         if session.stationid and not sm.GetService('viewState').IsViewActive('hangar'):
   1415             change = {'stationid': (session.stationid, session.stationid)}
   1416             uthread.pool('eveCommands::CmdEnterHangar', sm.GetService('viewState').ChangePrimaryView, 'hangar', change=change)
   1417         elif eveCfg.IsDockedInStructure() and not sm.GetService('viewState').IsViewActive('hangar'):
   1418             uthread.pool('eveCommands::CmdEnterHangar', sm.GetService('viewState').ChangePrimaryView, 'hangar')
   1419 
   1420     def CmdEnterStructure(self, *args):
   1421         if eveCfg.IsDockedInStructure() and not sm.GetService('viewState').IsViewActive('structure', 'charactercreation'):
   1422             uthread.pool('eveCommands::CmdEnterStructure', sm.GetService('viewState').ChangePrimaryView, 'structure')
   1423 
   1424     def CmdSetChatChannelFocus(self, *args):
   1425         sm.GetService('focus').SetChannelFocus()
   1426 
   1427     def CmdSetSearchBarFocus(self, *args):
   1428         sm.ScatterEvent('OnSetSearchBarFocus')
   1429 
   1430     def CmdSetOverviewFocus(self, *args):
   1431         wnd = overviewWindowUtil.GetOverviewWndIfOpen()
   1432         if wnd:
   1433             uicore.registry.SetFocus(wnd)
   1434 
   1435     def GetWndMenu(self, *args):
   1436         if uicore.registry.GetModalWindow() or not session.charid:
   1437             return None
   1438         wnd = CtrlTabWindow.GetIfOpen()
   1439         if not wnd:
   1440             ClearMenuLayer()
   1441             wnd = CtrlTabWindow.Open()
   1442         return wnd
   1443 
   1444     def CmdFleetBroadcast_EnemySpotted(self):
   1445         sm.GetService('fleet').SendBroadcast_EnemySpotted()
   1446 
   1447     def CmdFleetBroadcast_NeedBackup(self):
   1448         sm.GetService('fleet').SendBroadcast_NeedBackup()
   1449 
   1450     def CmdFleetBroadcast_HealArmor(self):
   1451         sm.GetService('fleet').SendBroadcast_HealArmor()
   1452 
   1453     def CmdFleetBroadcast_HealShield(self):
   1454         sm.GetService('fleet').SendBroadcast_HealShield()
   1455 
   1456     def CmdFleetBroadcast_HealCapacitor(self):
   1457         sm.GetService('fleet').SendBroadcast_HealCapacitor()
   1458 
   1459     def CmdFleetBroadcast_InPosition(self):
   1460         sm.GetService('fleet').SendBroadcast_InPosition()
   1461 
   1462     def CmdFleetBroadcast_HoldPosition(self):
   1463         sm.GetService('fleet').SendBroadcast_HoldPosition()
   1464 
   1465     def CmdFleetBroadcast_JumpBeacon(self):
   1466         sm.GetService('fleet').SendBroadcast_JumpBeacon()
   1467 
   1468     def CmdFleetBroadcast_Location(self):
   1469         sm.GetService('fleet').SendBroadcast_Location()
   1470 
   1471     def CmdSetCameraPOV(self):
   1472         if not self._IsSpaceCameraSwitchAllowed():
   1473             return
   1474         sm.GetService('sceneManager').SetPrimaryCamera(evecamera.CAM_SHIPPOV)
   1475 
   1476     CmdSetCameraPOV.nameLabelPath = 'Tooltips/Hud/POVCamera'
   1477     CmdSetCameraPOV.descriptionLabelPath = 'Tooltips/Hud/POVCamera_description'
   1478 
   1479     def CmdSetCameraOrbit(self):
   1480         if not self._IsSpaceCameraSwitchAllowed():
   1481             return
   1482         cam = sm.GetService('sceneManager').GetActiveSpaceCamera()
   1483         if cam.cameraID in (evecamera.CAM_SHIPORBIT, evecamera.CAM_SHIPORBIT_ABYSSAL_SPACE, evecamera.CAM_SHIPORBIT_HAZARD):
   1484             if cam.GetItemID() != session.shipid:
   1485                 cam.LookAt(session.shipid)
   1486             elif cam.isManualFovEnabled:
   1487                 cam.DisableManualFov()
   1488             else:
   1489                 cam.Track(session.shipid)
   1490         else:
   1491             sm.GetService('sceneManager').SetPrimaryCamera(get_orbit_camera_by_solar_system(session.solarsystemid2))
   1492 
   1493     CmdSetCameraOrbit.nameLabelPath = 'Tooltips/Hud/OrbitCamera'
   1494     CmdSetCameraOrbit.descriptionLabelPath = 'Tooltips/Hud/OrbitCamera_description'
   1495 
   1496     def CmdSetCameraTactical(self):
   1497         if is_tactical_camera_suppressed(session.solarsystemid):
   1498             return
   1499         if not self._IsSpaceCameraSwitchAllowed():
   1500             return
   1501         cam = sm.GetService('sceneManager').GetActiveSpaceCamera()
   1502         if cam.cameraID == evecamera.CAM_TACTICAL:
   1503             cam.LookAt(session.shipid, allowSwitchCamera=False)
   1504         else:
   1505             sm.GetService('sceneManager').SetPrimaryCamera(evecamera.CAM_TACTICAL)
   1506 
   1507     CmdSetCameraTactical.nameLabelPath = 'Tooltips/Hud/TacticalCamera'
   1508     CmdSetCameraTactical.descriptionLabelPath = 'Tooltips/Hud/TacticalCamera_description'
   1509 
   1510     def CmdIncreaseSpaceMouseSpeed(self):
   1511         cam = sm.GetService('sceneManager').GetActiveSpaceCamera()
   1512         if cam.cameraID in (evecamera.CAM_TACTICAL, evecamera.CAM_DEBUG):
   1513             speed = min(1.0, gfxsettings.Get(gfxsettings.UI_CAMERA_SPACEMOUSE_SPEED_COEFFICIENT) + 0.01)
   1514             gfxsettings.Set(gfxsettings.UI_CAMERA_SPACEMOUSE_SPEED_COEFFICIENT, speed, pending=False)
   1515             acceleration = gfxsettings.Get(gfxsettings.UI_CAMERA_SPACEMOUSE_ACCELERATION_COEFFICIENT)
   1516             sm.ScatterEvent('OnSpaceMouseSpeedCoefficientChanged')
   1517             self._indicate_space_mouse_acceleration(acceleration, speed)
   1518 
   1519     CmdIncreaseSpaceMouseSpeed.nameLabelPath = 'Tooltips/Hud/SpaceMouseSpeedIncrease'
   1520     CmdIncreaseSpaceMouseSpeed.descriptionLabelPath = 'Tooltips/Hud/SpaceMouseSpeedIncrease_description'
   1521 
   1522     def CmdDecreaseSpaceMouseSpeed(self):
   1523         cam = sm.GetService('sceneManager').GetActiveSpaceCamera()
   1524         if cam.cameraID in (evecamera.CAM_TACTICAL, evecamera.CAM_DEBUG):
   1525             speed = max(0.01, gfxsettings.Get(gfxsettings.UI_CAMERA_SPACEMOUSE_SPEED_COEFFICIENT) - 0.01)
   1526             gfxsettings.Set(gfxsettings.UI_CAMERA_SPACEMOUSE_SPEED_COEFFICIENT, speed, pending=False)
   1527             acceleration = gfxsettings.Get(gfxsettings.UI_CAMERA_SPACEMOUSE_ACCELERATION_COEFFICIENT)
   1528             sm.ScatterEvent('OnSpaceMouseSpeedCoefficientChanged')
   1529             self._indicate_space_mouse_acceleration(acceleration, speed)
   1530 
   1531     CmdDecreaseSpaceMouseSpeed.nameLabelPath = 'Tooltips/Hud/SpaceMouseSpeedDecrease'
   1532     CmdDecreaseSpaceMouseSpeed.descriptionLabelPath = 'Tooltips/Hud/SpaceMouseSpeedDecrease_description'
   1533 
   1534     def CmdIncreaseSpaceMouseAcceleration(self):
   1535         cam = sm.GetService('sceneManager').GetActiveSpaceCamera()
   1536         if cam.cameraID in (evecamera.CAM_TACTICAL, evecamera.CAM_DEBUG):
   1537             acceleration = min(1.0, gfxsettings.Get(gfxsettings.UI_CAMERA_SPACEMOUSE_ACCELERATION_COEFFICIENT) + 0.01)
   1538             gfxsettings.Set(gfxsettings.UI_CAMERA_SPACEMOUSE_ACCELERATION_COEFFICIENT, acceleration, pending=False)
   1539             speed = gfxsettings.Get(gfxsettings.UI_CAMERA_SPACEMOUSE_SPEED_COEFFICIENT)
   1540             sm.ScatterEvent('OnSpaceMouseAccelerationCoefficientChanged')
   1541             self._indicate_space_mouse_acceleration(acceleration, speed)
   1542 
   1543     CmdIncreaseSpaceMouseAcceleration.nameLabelPath = 'Tooltips/Hud/SpaceMouseAccelerationIncrease'
   1544     CmdIncreaseSpaceMouseAcceleration.descriptionLabelPath = 'Tooltips/Hud/SpaceMouseAccelerationIncrease_description'
   1545 
   1546     def CmdDecreaseSpaceMouseAcceleration(self):
   1547         cam = sm.GetService('sceneManager').GetActiveSpaceCamera()
   1548         if cam.cameraID in (evecamera.CAM_TACTICAL, evecamera.CAM_DEBUG):
   1549             acceleration = max(0.01, gfxsettings.Get(gfxsettings.UI_CAMERA_SPACEMOUSE_ACCELERATION_COEFFICIENT) - 0.01)
   1550             gfxsettings.Set(gfxsettings.UI_CAMERA_SPACEMOUSE_ACCELERATION_COEFFICIENT, acceleration, pending=False)
   1551             speed = gfxsettings.Get(gfxsettings.UI_CAMERA_SPACEMOUSE_SPEED_COEFFICIENT)
   1552             sm.ScatterEvent('OnSpaceMouseAccelerationCoefficientChanged')
   1553             self._indicate_space_mouse_acceleration(acceleration, speed)
   1554 
   1555     def _indicate_space_mouse_acceleration(self, acceleration, speed):
   1556         HudActionIndicationController.get_instance().set_shortcut_indication(IndicationData(GetByLabel('Tooltips/Hud/SpaceMouseCaption'), GetByLabel('Tooltips/Hud/SpaceMouseInfo', speed=speed * 100, acceleration=acceleration * 100)), delay=0.75)
   1557 
   1558     CmdDecreaseSpaceMouseAcceleration.nameLabelPath = 'Tooltips/Hud/SpaceMouseAccelerationDecrease'
   1559     CmdDecreaseSpaceMouseAcceleration.descriptionLabelPath = 'Tooltips/Hud/SpaceMouseAccelerationDecrease_description'
   1560 
   1561     def _IsSpaceCameraSwitchAllowed(self):
   1562         if not sm.GetService('viewState').IsViewActive(ViewState.Space):
   1563             return
   1564         cam = sm.GetService('sceneManager').GetActiveSpaceCamera()
   1565         if not cam or cam.IsLocked():
   1566             return False
   1567         return True
   1568 
   1569     def OpenCapitalNavigation(self, *args):
   1570         if eveCfg.GetActiveShip():
   1571             CapitalNav.ToggleOpenClose()
   1572 
   1573     OpenCapitalNavigation.nameLabelPath = CapitalNav.default_captionLabelPath
   1574 
   1575     def OpenMonitor(self, *args):
   1576         EngineToolsLauncher.Open()
   1577 
   1578     OpenMonitor.nameLabelPath = 'UI/Commands/OpenMonitor'
   1579 
   1580     def OpenFpsMonitor(self, *args):
   1581         from carbonui.modules.fpsmonitor import FpsMonitor
   1582         FpsMonitor.ToggleOpenClose(parent=uicore.layer.alwaysvisible)
   1583 
   1584     OpenFpsMonitor.nameLabelPath = 'UI/Commands/OpenFpsMonitor'
   1585 
   1586     def OpenConfigMenu(self, *args):
   1587         sysMenu = uicore.layer.systemmenu
   1588         if sysMenu.isopen:
   1589             uthread.new(sysMenu.CloseMenu)
   1590         else:
   1591             sysMenu.OpenView()
   1592 
   1593     OpenConfigMenu.nameLabelPath = 'UI/Commands/OpenConfigMenu'
   1594 
   1595     def OpenMail(self, *args):
   1596         if session.charid:
   1597             return MailWindow.ToggleOpenClose()
   1598 
   1599     OpenMail.nameLabelPath = MailWindow.default_captionLabelPath
   1600     OpenMail.descriptionLabelPath = MailWindow.default_descriptionLabelPath
   1601 
   1602     def CmdOpenNewMessage(self, *args):
   1603         if session.charid:
   1604             sm.GetService('mailSvc').SendMsgDlg()
   1605 
   1606     def OpenWallet(self, *args):
   1607         if session.solarsystemid2:
   1608             WalletWindow.ToggleOpenClose()
   1609 
   1610     OpenWallet.nameLabelPath = WalletWindow.default_captionLabelPath
   1611 
   1612     def OpenCorporationPanel(self, *args):
   1613         if session.solarsystemid2:
   1614             wnd = CorporationWindow.GetIfOpen()
   1615             if wnd:
   1616                 CorporationWindow.ToggleOpenClose()
   1617             elif idCheckers.IsNPC(session.corpid):
   1618                 panel_id = CorpPanel.MY_APPLICATIONS if sm.GetService('corp').GetMyOpenInvitations() else None
   1619                 sm.GetService('corpui').Show(panel_id=panel_id)
   1620             else:
   1621                 sm.GetService('corpui').Show()
   1622 
   1623     OpenCorporationPanel.nameLabelPath = CorporationWindow.default_captionLabelPath
   1624     OpenCorporationPanel.descriptionLabelPath = CorporationWindow.default_descriptionLabelPath
   1625 
   1626     def OpenAssets(self, *args):
   1627         if session.solarsystemid2:
   1628             AssetsWindow.ToggleOpenClose()
   1629 
   1630     OpenAssets.nameLabelPath = AssetsWindow.default_captionLabelPath
   1631     OpenAssets.descriptionLabelPath = AssetsWindow.default_descriptionLabelPath
   1632 
   1633     def OpenChannels(self, *args):
   1634         if session.solarsystemid2:
   1635             XmppChatChannels.Open()
   1636 
   1637     OpenChannels.nameLabelPath = XmppChatChannels.default_captionLabelPath
   1638     OpenChannels.descriptionLabelPath = XmppChatChannels.default_descriptionLabelPath
   1639 
   1640     def OpenJournal(self, *args):
   1641         if session.solarsystemid2:
   1642             JournalWindow.ToggleOpenClose()
   1643 
   1644     OpenJournal.nameLabelPath = JournalWindow.default_captionLabelPath
   1645     OpenJournal.descriptionLabelPath = JournalWindow.default_descriptionLabelPath
   1646 
   1647     def OpenAgencyNew(self, *args):
   1648         if not session.solarsystemid2:
   1649             return
   1650         AgencyWndNew.ToggleOpenClose()
   1651 
   1652     OpenAgencyNew.nameLabelPath = 'UI/Agency/Caption'
   1653     OpenAgencyNew.descriptionLabelPath = 'UI/Agency/Description'
   1654 
   1655     def OpenCombatAnomaliesInAgency(self, *args):
   1656         if not session.solarsystemid2:
   1657             return
   1658         AgencyWndNew.OpenAndShowContentGroup(contentGroupID=agencyContentGroupConst.contentGroupCombatAnomalies)
   1659 
   1660     OpenCombatAnomaliesInAgency.nameLabelPath = 'UI/Agency/CaptionCombatAnomalies'
   1661     OpenCombatAnomaliesInAgency.descriptionLabelPath = 'UI/Agency/Description'
   1662 
   1663     def OpenFactionWarfareInAgency(self, *args):
   1664         if not session.solarsystemid2:
   1665             return
   1666         AgencyWndNew.OpenAndShowContentGroup(contentGroupID=agencyContentGroupConst.contentGroupFactionalWarfareSystems)
   1667 
   1668     OpenCombatAnomaliesInAgency.nameLabelPath = 'UI/Agency/Caption'
   1669     OpenCombatAnomaliesInAgency.descriptionLabelPath = 'UI/Agency/Description'
   1670 
   1671     def OpenSeason(self, *args):
   1672         OpenSeasonsWindow()
   1673 
   1674     OpenSeason.nameLabelPath = 'UI/Seasons/Title'
   1675     OpenSeason.descriptionLabelPath = 'UI/Seasons/Subcaption'
   1676 
   1677     def OpenEncounterSurveillanceSystemInAgency(self):
   1678         if not session.solarsystemid2:
   1679             return
   1680         AgencyWndNew.OpenAndShowContentGroup(contentGroupID=agencyContentGroupConst.contentGroupESSSystems)
   1681 
   1682     OpenEncounterSurveillanceSystemInAgency.nameLabelPath = 'UI/Agency/CaptionEncounterSurveillanceSystem'
   1683     OpenEncounterSurveillanceSystemInAgency.descriptionLabelPath = 'UI/Agency/Description'
   1684 
   1685     def OpenAgencyContentGroup(self, contentGroupID):
   1686         if not session.solarsystemid2:
   1687             return
   1688         AgencyWndNew.OpenAndShowContentGroup(contentGroupID=contentGroupID)
   1689 
   1690     def OpenLoginRewardWindow(self, *args):
   1691         if not session.solarsystemid2:
   1692             return
   1693         inDailyCampaign = sm.GetService('loginCampaignService').is_user_enrolled_in_campaign()
   1694         seasonActive = sm.GetService('seasonalLoginCampaignService').is_login_campaign_active()
   1695         if inDailyCampaign or seasonActive:
   1696             from eve.client.script.ui.shared.loginRewards.loginRewardsWnd import DailyLoginRewardsWnd
   1697             DailyLoginRewardsWnd.ToggleOpenClose()
   1698 
   1699     OpenLoginRewardWindow.nameLabelPath = 'UI/LoginRewards/WindowCaption'
   1700     OpenLoginRewardWindow.descriptionLabelPath = 'UI/LoginRewards/WindowDescription'
   1701 
   1702     def OpenSkillsWindow(self, forceClose = False, *args, **kwds):
   1703         if session.charid:
   1704             if forceClose:
   1705                 if SkillPlanDockablePanel.CloseIfOpen():
   1706                     uthread2.sleep(0.1)
   1707                 SkillPlanDockablePanel.Open(*args, **kwds)
   1708             else:
   1709                 SkillPlanDockablePanel.ToggleOpenClose(*args, **kwds)
   1710 
   1711     OpenSkillsWindow.nameLabelPath = 'UI/SkillPlan/Skills'
   1712     OpenSkillsWindow.descriptionLabelPath = 'Tooltips/Neocom/SkillPlans_description'
   1713 
   1714     def OpenEveMenu(self, *args):
   1715         sm.GetService('neocom').ToggleEveMenu()
   1716 
   1717     OpenEveMenu.nameLabelPath = 'Tooltips/Neocom/NeocomMenu'
   1718     OpenEveMenu.descriptionLabelPath = 'Tooltips/Neocom/NeocomMenu_description'
   1719 
   1720     def ToggleAurumStore(self, *args):
   1721         sm.GetService('vgsService').ToggleStore()
   1722 
   1723     ToggleAurumStore.nameLabelPath = 'UI/VirtualGoodsStore/VgsName'
   1724     ToggleAurumStore.descriptionLabelPath = 'Tooltips/Neocom/Vgs_description'
   1725 
   1726     def ToggleProjectDiscovery(self, *args):
   1727         get_project_discovery_window_class().ToggleOpenClose()
   1728 
   1729     ToggleProjectDiscovery.nameLabelPath = 'UI/ProjectDiscovery/ProjectName'
   1730     ToggleProjectDiscovery.descriptionLabelPath = 'Tooltips/Neocom/ProjectDiscoveryDescription'
   1731 
   1732     def OpenProjectDiscovery(self):
   1733         get_project_discovery_window_class().Open()
   1734 
   1735     @ThrottlePerMinute(5)
   1736     def CmdBuyPlex(self, logContext):
   1737         sm.GetService('fastCheckoutClientService').buy_plex(log_context=logContext)
   1738 
   1739     def ToggleRedeemItems(self, *args):
   1740         if session.charid is not None:
   1741             sm.StartService('redeem').ToggleRedeemWindow()
   1742 
   1743     ToggleRedeemItems.nameLabelPath = 'UI/Commands/RedeemItems'
   1744     ToggleRedeemItems.descriptionLabelPath = 'Tooltips/Neocom/RedeemItems_description'
   1745 
   1746     def ToggleActivities(self, *args):
   1747         if session.charid is not None:
   1748             sm.StartService('activities').ToggleActivities()
   1749 
   1750     ToggleActivities.nameLabelPath = 'UI/Commands/Activities'
   1751     ToggleActivities.descriptionLabelPath = 'Tooltips/Neocom/Activities_description'
   1752 
   1753     def OpenLog(self, *args):
   1754         uthread.new(self.__OpenLog_thread).context = 'cmd.OpenLog'
   1755 
   1756     OpenLog.nameLabelPath = LoggerWindow.default_captionLabelPath
   1757     OpenLog.descriptionLabelPath = LoggerWindow.default_descriptionLabelPath
   1758 
   1759     def OpenStructureBrowser(self, *args):
   1760         StructureBrowserWnd.ToggleOpenClose()
   1761 
   1762     OpenStructureBrowser.nameLabelPath = StructureBrowserWnd.default_captionLabelPath
   1763     OpenStructureBrowser.descriptionLabelPath = 'Tooltips/Neocom/StructureBrowserDescription'
   1764 
   1765     def OpenAccessGroupsWindow(self, *args):
   1766         AccessGroupsWnd.ToggleOpenClose()
   1767 
   1768     OpenAccessGroupsWindow.nameLabelPath = AccessGroupsWnd.default_captionLabelPath
   1769     OpenAccessGroupsWindow.descriptionLabelPath = 'Tooltips/Neocom/AccessListsDescription'
   1770 
   1771     def __OpenLog_thread(self, *args):
   1772         LoggerWindow.ToggleOpenClose()
   1773 
   1774     def OpenDroneBayOfActiveShip(self, *args):
   1775         if eveCfg.GetActiveShip() is not None:
   1776             uthread.new(self.__OpenDroneBayOfActiveShip_thread).context = 'cmd.OpenDroneBayOfActiveShip'
   1777 
   1778     OpenDroneBayOfActiveShip.nameLabelPath = 'UI/Commands/OpenDroneBayOfActiveShip'
   1779 
   1780     def __OpenDroneBayOfActiveShip_thread(self, *args):
   1781         shipID = eveCfg.GetActiveShip()
   1782         if shipID is None:
   1783             return
   1784         shipItem = sm.GetService('clientDogmaIM').GetDogmaLocation().GetDogmaItemWithWait(shipID)
   1785         godmaType = sm.GetService('godma').GetType(shipItem.typeID)
   1786         if godmaType.droneCapacity or IsModularShip(shipItem.typeID):
   1787             invID = ('ShipDroneBay', shipID)
   1788             Inventory.OpenOrShow(invID=invID, usePrimary=False, toggle=True)
   1789         else:
   1790             raise UserError('ShipHasNoDroneBay')
   1791 
   1792     def OpenFighterBayOfActiveShip(self, *args):
   1793         if eveCfg.GetActiveShip() is not None:
   1794             uthread.new(self.__OpenFighterBayOfActiveShip_thread).context = 'cmd.OpenFighterBayOfActiveShip'
   1795 
   1796     OpenFighterBayOfActiveShip.nameLabelPath = 'UI/Commands/OpenFighterBayOfActiveShip'
   1797 
   1798     def __OpenFighterBayOfActiveShip_thread(self, *args):
   1799         shipID = session.shipid
   1800         if shipID is None:
   1801             return
   1802         shipItem = sm.GetService('clientDogmaIM').GetDogmaLocation().GetDogmaItemWithWait(shipID)
   1803         godmaType = sm.GetService('godma').GetType(shipItem.typeID)
   1804         if godmaType.fighterCapacity:
   1805             if session.shipid == session.structureid:
   1806                 invID = ('StructureFighterBay', shipID)
   1807             else:
   1808                 invID = ('ShipFighterBay', shipID)
   1809             Inventory.OpenOrShow(invID=invID, usePrimary=False, toggle=True)
   1810         else:
   1811             raise UserError('ShipHasNoFighterBay')
   1812 
   1813     def OpenCargoHoldOfActiveShip(self, *args):
   1814         if eveCfg.GetActiveShip() is not None:
   1815             uthread.new(self.__OpenCargoHoldOfActiveShip_thread).context = 'cmd.OpenCargoHoldOfActiveShip'
   1816 
   1817     OpenCargoHoldOfActiveShip.nameLabelPath = 'Tooltips/Hud/CargoHold'
   1818     OpenCargoHoldOfActiveShip.descriptionLabelPath = 'Tooltips/Hud/CargoHold_description'
   1819 
   1820     def __OpenCargoHoldOfActiveShip_thread(self, *args):
   1821         shipID = eveCfg.GetActiveShip()
   1822         if eveCfg.IsControllingStructure():
   1823             return self.OpenStructureCargo()
   1824         if shipID is None:
   1825             return
   1826         shipItem = sm.GetService('clientDogmaIM').GetDogmaLocation().GetDogmaItemWithWait(shipID)
   1827         if shipItem is None:
   1828             return
   1829         invID = (invConst.INVENTORY_ID_SHIP_CARGO, shipID)
   1830         Inventory.OpenOrShow(invID=invID, usePrimary=False, toggle=True)
   1831 
   1832     def OpenStructureCargo(self):
   1833         invID = ('Structure', session.structureid)
   1834         Inventory.OpenOrShow(invID=invID, usePrimary=False, toggle=True)
   1835 
   1836     def OpenPlexVault(self):
   1837         invID = (invConst.INVENTORY_ID_PLEX_VAULT, None)
   1838         Inventory.OpenOrShow(invID=invID, usePrimary=True, toggle=True)
   1839 
   1840     OpenPlexVault.nameLabelPath = 'UI/Neocom/PlexVault'
   1841     OpenPlexVault.descriptionLabelPath = 'Tooltips/Neocom/PlexVaultDescription'
   1842     OpenStructureCargo.nameLabelPath = 'Tooltips/Hud/CargoHold'
   1843     OpenStructureCargo.descriptionLabelPath = 'Tooltips/Hud/CargoHoldStructure_description'
   1844 
   1845     def OpenRaffleWindow(self):
   1846         sm.GetService('raffleSvc').toggle_window()
   1847 
   1848     OpenRaffleWindow.nameLabelPath = 'UI/HyperNet/WindowTitle'
   1849     OpenRaffleWindow.descriptionLabelPath = 'UI/HyperNet/WindowDescription'
   1850 
   1851     def OpenJobBoardWindow(self):
   1852         get_job_board_service().toggle_window()
   1853 
   1854     OpenJobBoardWindow.nameLabelPath = 'UI/Opportunities/WindowTitle'
   1855     OpenJobBoardWindow.descriptionLabelPath = 'UI/Opportunities/WindowDescription'
   1856 
   1857     def OpenPVPFilamentEventWindow(self):
   1858         sm.GetService('pvpFilamentSvc').OpenPVPFilamentEventWindow()
   1859 
   1860     OpenPVPFilamentEventWindow.nameLabelPath = 'UI/PVPFilament/EventWindow/WindowTitle'
   1861     OpenPVPFilamentEventWindow.descriptionLabelPath = 'UI/PVPFilament/EventWindow/WindowDescription'
   1862 
   1863     def OpenFuelBayOfActiveShip(self):
   1864         self._OpenSpecialHoldOfActiveship(appConst.attributeSpecialFuelBayCapacity, 'ShipFuelBay')
   1865 
   1866     OpenFuelBayOfActiveShip.nameLabelPath = 'UI/Commands/OpenFuelBayOfActiveShip'
   1867 
   1868     def OpenGeneralMiningHoldOfActiveShip(self):
   1869         self._OpenSpecialHoldOfActiveship(appConst.attributeGeneralMiningHoldCapacity, 'ShipGeneralMiningHold')
   1870 
   1871     OpenGeneralMiningHoldOfActiveShip.nameLabelPath = 'UI/Commands/OpenGeneralMiningHoldOfActiveShip'
   1872 
   1873     def OpenMineralHoldOfActiveShip(self):
   1874         self._OpenSpecialHoldOfActiveship(appConst.attributeSpecialMineralHoldCapacity, 'ShipMineralHold')
   1875 
   1876     OpenMineralHoldOfActiveShip.nameLabelPath = 'UI/Commands/OpenMineralHoldOfActiveShip'
   1877 
   1878     def OpenPlanetaryCommoditiesHoldOfActiveShip(self):
   1879         self._OpenSpecialHoldOfActiveship(appConst.attributeSpecialPlanetaryCommoditiesHoldCapacity, 'ShipPlanetaryCommoditiesHold')
   1880 
   1881     OpenPlanetaryCommoditiesHoldOfActiveShip.nameLabelPath = 'UI/Commands/OpenPlanetaryCommoditiesHoldOfActiveShip'
   1882 
   1883     def OpenAmmoHoldOfActiveShip(self):
   1884         self._OpenSpecialHoldOfActiveship(appConst.attributeSpecialAmmoHoldCapacity, 'ShipAmmoHold')
   1885 
   1886     OpenAmmoHoldOfActiveShip.nameLabelPath = 'UI/Commands/OpenAmmoHold'
   1887 
   1888     def OpenFleetHangarOfActiveShip(self):
   1889         self._OpenSpecialHoldOfActiveship(appConst.attributeFleetHangarCapacity, 'ShipFleetHangar')
   1890 
   1891     OpenFleetHangarOfActiveShip.nameLabelPath = 'UI/Commands/OpenFleetHangar'
   1892 
   1893     def OpenShipMaintenanceOfBayActiveShip(self):
   1894         self._OpenSpecialHoldOfActiveship(appConst.attributeShipMaintenanceBayCapacity, 'ShipMaintenanceBay')
   1895 
   1896     OpenShipMaintenanceOfBayActiveShip.nameLabelPath = 'UI/Commands/OpenShipMaintenanceBay'
   1897 
   1898     def OpenInfrastructureBayOfActiveShip(self):
   1899         self._OpenSpecialHoldOfActiveship(appConst.attributeSpecialColonyResourcesHoldCapacity, ContainerType.SHIP_COLONY_RESOURCES_HOLD)
   1900 
   1901     OpenInfrastructureBayOfActiveShip.nameLabelPath = 'UI/Commands/OpenInfrastructureHold'
   1902 
   1903     def OpenFrigateEscapeBay(self):
   1904         self._OpenSpecialHoldOfActiveship(appConst.attributeFrigateEscapeBayCapacity, 'ShipFrigateEscapeBay')
   1905 
   1906     OpenFrigateEscapeBay.nameLabelPath = 'UI/Commands/OpenFrigateEscapeBay'
   1907 
   1908     def _OpenSpecialHoldOfActiveship(self, attr, invCtrlName):
   1909         itemID = eveCfg.GetActiveShip()
   1910         if itemID is None:
   1911             return
   1912         ship = sm.GetService('clientDogmaIM').GetDogmaLocation().GetDogmaItemWithWait(itemID)
   1913         if bool(sm.GetService('godma').GetTypeAttribute(ship.typeID, attr)):
   1914             invID = (invCtrlName, itemID)
   1915             Inventory.OpenOrShow(invID=invID, usePrimary=False, toggle=True)
   1916 
   1917     def OpenCharactersheet(self, *args):
   1918         if session.solarsystemid2:
   1919             CharacterSheetWindow.ToggleOpenClose()
   1920 
   1921     OpenCharactersheet.nameLabelPath = CharacterSheetWindow.default_captionLabelPath
   1922     OpenCharactersheet.descriptionLabelPath = CharacterSheetWindow.default_descriptionLabelPath
   1923 
   1924     def OpenFleet(self, *args):
   1925         FleetWindow.ToggleOpenClose()
   1926 
   1927     OpenFleet.nameLabelPath = FleetWindow.default_captionLabelPath
   1928     OpenFleet.descriptionLabelPath = FleetWindow.default_descriptionLabelPath
   1929 
   1930     def OpenFleetWatchlist(self):
   1931         if not session.fleetid:
   1932             return
   1933         WatchListPanel.Open(showActions=False, panelName=localization.GetByLabel('UI/Fleet/WatchList'))
   1934 
   1935     OpenFleetWatchlist.nameLabelPath = 'UI/Fleet/Watchlist/WatchListWindow'
   1936 
   1937     def OpenPeopleAndPlaces(self, *args):
   1938         if session.solarsystemid2:
   1939             AddressBookWindow.ToggleOpenClose()
   1940 
   1941     OpenPeopleAndPlaces.nameLabelPath = AddressBookWindow.default_captionLabelPath
   1942     OpenPeopleAndPlaces.descriptionLabelPath = AddressBookWindow.default_descriptionLabelPath
   1943 
   1944     def OpenAuraGuidance(self, *args):
   1945         wnd = AuraGuidanceWindow.Open()
   1946         if aura_guidance_intro.is_enabled():
   1947             wnd.display_first_time_intro()
   1948             aura_guidance_intro.disable()
   1949 
   1950     OpenAuraGuidance.nameLabelPath = AuraGuidanceWindow.neocom_titleLabelPath
   1951     OpenAuraGuidance.descriptionLabelPath = AuraGuidanceWindow.default_descriptionLabelPath
   1952 
   1953     def OpenLocations(self, *args):
   1954         if session.solarsystemid2:
   1955             LocationsWindow.ToggleOpenClose()
   1956 
   1957     OpenLocations.nameLabelPath = LocationsWindow.default_captionLabelPath
   1958     OpenLocations.descriptionLabelPath = LocationsWindow.default_descriptionLabelPath
   1959 
   1960     def OpenHelp(self, *args):
   1961         if not session.charid:
   1962             return
   1963         HelpWindow.ToggleOpenClose()
   1964 
   1965     OpenHelp.nameLabelPath = HelpWindow.default_captionLabelPath
   1966     OpenHelp.descriptionLabelPath = HelpWindow.default_descriptionLabelPath
   1967 
   1968     def OpenReportBug(self, *args):
   1969         BugReportingWindow.ToggleOpenClose()
   1970 
   1971     def OpenManageRoute(self, *args):
   1972         if not session.charid:
   1973             return
   1974         AutopilotSettings.ToggleOpenClose()
   1975 
   1976     OpenManageRoute.nameLabelPath = AutopilotSettings.default_captionLabelPath
   1977 
   1978     def OpenProbeScanner(self, *args):
   1979         if eveCfg.InSpace():
   1980             if is_scanning_suppressed(session.solarsystemid2):
   1981                 raise UserError('CannotProbeScanInSystem')
   1982             from eve.client.script.ui.inflight.probeScannerWindow import ProbeScannerWindow
   1983             ProbeScannerWindow.OpenProbeScanner(*args)
   1984         else:
   1985             message_player(GetByLabel('UI/ErrorDialog/mustUndockToTakeAction'))
   1986 
   1987     OpenProbeScanner.nameLabelPath = ProbeScannerWindow.default_captionLabelPath
   1988     OpenProbeScanner.descriptionLabelPath = ProbeScannerWindow.default_descriptionLabelPath
   1989 
   1990     def ToggleProbeScanner(self, *args):
   1991         if eveCfg.InSpace():
   1992             if is_scanning_suppressed(session.solarsystemid2):
   1993                 raise UserError('CannotProbeScanInSystem')
   1994             from eve.client.script.ui.inflight.probeScannerWindow import ProbeScannerWindow
   1995             ProbeScannerWindow.ToggleOpenCloseProbeScanner()
   1996         else:
   1997             message_player(GetByLabel('UI/ErrorDialog/mustUndockToTakeAction'))
   1998 
   1999     ToggleProbeScanner.nameLabelPath = ProbeScannerWindow.default_captionLabelPath
   2000     ToggleProbeScanner.descriptionLabelPath = ProbeScannerWindow.default_descriptionLabelPath
   2001 
   2002     def OpenDirectionalScanner(self, toggle = True, *args):
   2003         if eveCfg.InSpace():
   2004             if is_directional_scanner_suppressed(session.solarsystemid2):
   2005                 message_player(GetByLabel('UI/InfoWindow/DscanDisabled'))
   2006                 return
   2007             if toggle:
   2008                 DirectionalScanner.ToggleOpenCloseDirectionalScanner()
   2009             else:
   2010                 DirectionalScanner.OpenDirectionalScanner()
   2011 
   2012     OpenDirectionalScanner.nameLabelPath = DirectionalScanner.default_captionLabelPath
   2013     OpenDirectionalScanner.descriptionLabelPath = DirectionalScanner.default_descriptionLabelPath
   2014 
   2015     def OpenMoonScan(self, *args):
   2016         if eveCfg.InShipInSpace():
   2017             MoonScanner.ToggleOpenClose()
   2018 
   2019     OpenMoonScan.nameLabelPath = MoonScanner.default_captionLabelPath
   2020 
   2021     def OpenMapBrowser(self, locationID = None):
   2022         if session.solarsystemid2:
   2023             if is_map_browser_suppressed(session.solarsystemid2):
   2024                 wnd = MapBrowserWnd.GetIfOpen()
   2025                 if wnd and not wnd.destroyed:
   2026                     wnd.Close()
   2027                 raise UserError('CannotOpenMapBrowserInAbyssSpace')
   2028             wnd = MapBrowserWnd.GetIfOpen()
   2029             if wnd and not wnd.destroyed:
   2030                 if locationID is None:
   2031                     wnd.ToggleOpenClose()
   2032                 else:
   2033                     if wnd.state == uiconst.UI_HIDDEN:
   2034                         wnd.Show()
   2035                     wnd.DoLoad(locationID)
   2036                 return
   2037             MapBrowserWnd.Open(locationID=locationID)
   2038 
   2039     OpenMapBrowser.nameLabelPath = MapBrowserWnd.default_captionLabelPath
   2040     OpenMapBrowser.descriptionLabelPath = MapBrowserWnd.default_descriptionLabelPath
   2041 
   2042     def OpenHangarFloor(self, *args):
   2043         if session.stationid:
   2044             invWindow.StationItems.ToggleOpenClose(windowInstanceID=session.stationid)
   2045         if session.structureid:
   2046             invWindow.StructureItems.ToggleOpenClose(windowInstanceID=session.structureid)
   2047 
   2048     OpenHangarFloor.nameLabelPath = 'UI/Commands/OpenHangarFloor'
   2049 
   2050     def OpenShipHangar(self, *args, **kwds):
   2051         if session.stationid:
   2052             invWindow.StationShips.ToggleOpenClose(windowInstanceID=session.stationid)
   2053         if session.structureid:
   2054             invWindow.StructureShips.ToggleOpenClose(windowInstanceID=session.structureid)
   2055 
   2056     OpenShipHangar.nameLabelPath = 'UI/Commands/OpenShipHangar'
   2057 
   2058     def OpenInventory(self, *args):
   2059         if not session.charid:
   2060             return
   2061         invWindow.InventoryPrimary.ToggleOpenClose()
   2062 
   2063     OpenInventory.nameLabelPath = 'UI/Neocom/InventoryBtn'
   2064     OpenInventory.descriptionLabelPath = 'Tooltips/Neocom/Inventory_description'
   2065 
   2066     def OpenCalculator(self, *args):
   2067         Calculator.ToggleOpenClose()
   2068 
   2069     OpenCalculator.nameLabelPath = Calculator.default_captionLabelPath
   2070     OpenCalculator.descriptionLabelPath = Calculator.default_descriptionLabelPath
   2071 
   2072     def OpenOverviewSettings(self, *args):
   2073         OverviewSettingsWnd.Open()
   2074 
   2075     OpenOverviewSettings.nameLabelPath = OverviewSettingsWnd.default_captionLabelPath
   2076     OpenOverviewSettings.descriptionLabelPath = OverviewSettingsWnd.default_descriptionLabelPath
   2077 
   2078     def OpenCorpHangar(self, *args):
   2079         office = sm.GetService('officeManager').GetCorpOfficeAtLocation()
   2080         if office:
   2081             invClass = 'StationCorpHangars' if session.stationid else 'StructureCorpHangars'
   2082             invID = (invClass, office.officeID)
   2083             Inventory.OpenOrShow(invID=invID, usePrimary=False, toggle=True)
   2084 
   2085     OpenCorpHangar.nameLabelPath = 'UI/Commands/OpenCorpHangar'
   2086 
   2087     def OpenCorpDeliveries(self, *args):
   2088         if session.stationid or session.structureid:
   2089             uthread.new(self.__OpenCorpDeliveries_thread)
   2090 
   2091     OpenCorpDeliveries.nameLabelPath = 'UI/Commands/OpenCorpDeliveries'
   2092 
   2093     def __OpenCorpDeliveries_thread(self, *args):
   2094         locationID = session.stationid or session.structureid
   2095         if not locationID:
   2096             return
   2097         invWindow.StationCorpDeliveries.ToggleOpenClose(windowInstanceID=locationID)
   2098 
   2099     def OpenCorporationItemDeliveries(self, *args):
   2100         if session.stationid or session.structureid:
   2101             uthread.new(self.__OpenCorporationItemDeliveries_thread)
   2102 
   2103     OpenCorporationItemDeliveries.nameLabelPath = 'UI/Commands/OpenCapsuleerDeliveries'
   2104 
   2105     def __OpenCorporationItemDeliveries_thread(self, *args):
   2106         locationID = session.stationid or session.structureid
   2107         if not locationID:
   2108             return
   2109         invWindow.CorporationItemDeliveries.ToggleOpenClose(windowInstanceID=locationID)
   2110 
   2111     def OpenVideoPlayerWindow(self, videoPath):
   2112         VideoPlayerWindow.Open().SetVideoPath(videoPath)
   2113 
   2114     def OpenPaintToolWindow(self, *args):
   2115         PaintToolWnd.ToggleOpenClose()
   2116 
   2117     OpenPaintToolWindow.nameLabelPath = PaintToolWnd.default_captionLabelPath
   2118     OpenPaintToolWindow.descriptionLabelPath = PaintToolWnd.default_descriptionLabelPath
   2119 
   2120     def OpenShipSKINRWindow(self, *args):
   2121         ShipSKINRWindow.ToggleOpenClose()
   2122 
   2123     OpenShipSKINRWindow.nameLabelPath = ShipSKINRWindow.default_captionLabelPath
   2124     OpenShipSKINRWindow.descriptionLabelPath = ShipSKINRWindow.default_descriptionLabelPath
   2125 
   2126     def OpenOmegaUpsellWindow(self, *args):
   2127         OmegaUpsellWindow.ToggleOpenClose()
   2128 
   2129     OpenOmegaUpsellWindow.nameLabelPath = OmegaUpsellWindow.default_captionLabelPath
   2130     OpenOmegaUpsellWindow.descriptionLabelPath = OmegaUpsellWindow.default_descriptionLabelPath
   2131 
   2132     def OpenAchievementsWindow(self, *args):
   2133         AchievementsWindow.ToggleOpenClose()
   2134 
   2135     OpenAchievementsWindow.nameLabelPath = AchievementsWindow.default_captionLabelPath
   2136     OpenAchievementsWindow.descriptionLabelPath = AchievementsWindow.default_descriptionLabelPath
   2137 
   2138     def OpenAchievement(self, achievement_id):
   2139         AchievementsWindow.open_achievement(achievement_id)
   2140 
   2141     def OpenAchievementCategory(self, category_id):
   2142         AchievementsWindow.open_category(category_id)
   2143 
   2144     def BuyMultipleCharacterTrainingOnline(self, origin = None, reason = None):
   2145         try:
   2146             base_url = get_eve_store_url()
   2147             plex_url = get_url_with_token_and_parameters(url=base_url, path='mct', origin=origin, reason=reason, utm_medium='app', utm_source='eveonline', utm_campaign='newedenstore', utm_content='cta_buymct')
   2148             if 'secure' in base_url.lower():
   2149                 plex_url = get_url_with_token_and_parameters(url=urlparse.urljoin(base_url, 'multiple-character-training'), origin=origin, reason=reason, utm_medium='app', utm_source='eveonline', utm_campaign='newedenstore', utm_content='cta_buymct')
   2150             blue.os.ShellExecute(plex_url)
   2151         except Exception:
   2152             LogException('Failed to open URL to buy MCT online')
   2153             raise UserError('FailedToOpenBuyPlexUrl')
   2154 
   2155     def BuyContextualOfferOnline(self, url, offerID):
   2156         try:
   2157             baseurl = urllib.splitquery(url)[0]
   2158             kwargs = self.UrlParamsToKwargDict(url) if '?' in url else {}
   2159             contextualOfferUrl = get_url_with_token_and_parameters(url=baseurl, origin='contextualofferwindow', utm_medium='app', utm_source='eveonline', utm_campaign='contextualoffers', utm_content=str(offerID), **kwargs)
   2160             blue.os.ShellExecute(contextualOfferUrl)
   2161         except Exception:
   2162             LogException('Failed to open URL for the offer (offerID: %s, URL: %s)' % (offerID, url))
   2163             raise
   2164 
   2165     def ViewSpecialOffersOnline(self, origin = None, reason = None):
   2166         try:
   2167             specialOffersUrl = get_url_with_token_and_parameters(url=self.GetStoreServerURL(), origin=origin, reason=reason)
   2168             blue.os.ShellExecute(specialOffersUrl)
   2169         except Exception:
   2170             LogException('Failed to open Special Offers URL')
   2171             raise
   2172 
   2173     def UrlParamsToKwargDict(self, url):
   2174         kwargs = {}
   2175         queryResults = urllib.splitquery(url)
   2176         if len(queryResults) > 1:
   2177             query = queryResults[1]
   2178             splitquery = query.split('&')
   2179             for keyvalueset in splitquery:
   2180                 key, value = urllib.splitvalue(keyvalueset)
   2181                 kwargs[key] = value
   2182 
   2183         return kwargs
   2184 
   2185     def OpenAccountManagement(self, origin = None, reason = None):
   2186         try:
   2187             accountUrl = get_url_with_token_and_parameters(get_eve_secure_url(), origin=origin, reason=reason)
   2188             blue.os.ShellExecute(accountUrl)
   2189         except Exception:
   2190             LogException('Failed to open URL to access account management online')
   2191             raise UserError('FailedToOpenAccountManagementUrl')
   2192 
   2193     def OpenBrowser(self, url = None, windowName = 'virtualbrowser', args = {}, data = None, newTab = False):
   2194         parsedUrl = urlparse.urlparse(url or '')
   2195         if not session.charid:
   2196             if url is not None and url != 'home' and parsedUrl.scheme in ('http', 'https'):
   2197                 blue.os.ShellExecute(url)
   2198             return
   2199         if parsedUrl.hostname and (parsedUrl.hostname.count('secure.eveonline.com') > 0 or parsedUrl.hostname.count('store.eveonline.com') > 0):
   2200             if parsedUrl.path.lower().count('plex') > 0:
   2201                 sm.GetService('fastCheckoutClientService').buy_plex_online()
   2202             else:
   2203                 self.OpenAccountManagement()
   2204             return
   2205 
   2206     OpenBrowser.nameLabelPath = 'UI/Neocom/BrowserBtn'
   2207 
   2208     def OpenNotepad(self, *args):
   2209         NotepadWindow.ToggleOpenClose()
   2210 
   2211     OpenNotepad.nameLabelPath = NotepadWindow.default_captionLabelPath
   2212     OpenNotepad.descriptionLabelPath = NotepadWindow.default_descriptionLabelPath
   2213 
   2214     def OpenMoonMining(self, id = None):
   2215         bp = sm.GetService('michelle').GetBallpark()
   2216         if not id:
   2217             for itemID in bp.slimItems:
   2218                 if bp.slimItems[itemID].groupID == appConst.groupControlTower:
   2219                     id = bp.slimItems[itemID]
   2220                     break
   2221 
   2222         if not id:
   2223             return
   2224         MoonMining.ToggleOpenClose(slimItem=id)
   2225 
   2226     OpenMoonMining.nameLabelPath = MoonMining.default_captionLabelPath
   2227     OpenMoonMining.descriptionLabelPath = MoonMining.default_descriptionLabelPath
   2228 
   2229     def OpenLedger(self, *args):
   2230         LedgerWindow.ToggleOpenClose()
   2231 
   2232     OpenLedger.nameLabelPath = LedgerWindow.default_captionLabelPath
   2233     OpenLedger.descriptionLabelPath = LedgerWindow.default_descriptionLabelPath
   2234 
   2235     def OpenCloneUpgradeWindow(self, origin = None, reason = None):
   2236         open_omega_upgrade_window(origin=origin, reason=reason)
   2237 
   2238     def OpenShipConfig(self, id = None):
   2239         activeShipID = eveCfg.GetActiveShip()
   2240         if activeShipID is not None:
   2241             ship = sm.GetService('clientDogmaIM').GetDogmaLocation().GetShip()
   2242             typeObj = sm.GetService('godma').GetType(ship.typeID)
   2243             if bool(typeObj.canReceiveCloneJumps):
   2244                 ShipConfig.ToggleOpenClose()
   2245 
   2246     OpenShipConfig.nameLabelPath = ShipConfig.default_captionLabelPath
   2247     OpenShipConfig.descriptionLabelPath = ShipConfig.default_descriptionLabelPath
   2248 
   2249     def HasServiceAccess(self, serviceName, onlyCheckFacWarSystems = False):
   2250         if onlyCheckFacWarSystems and not sm.GetService('fwWarzoneSvc').IsWarzoneSolarSystem(session.solarsystemid2):
   2251             return True
   2252         from eve.client.script.ui.shared.dockedUI.lobbyWnd import LobbyWnd
   2253         lobby = LobbyWnd.GetIfOpen()
   2254         if lobby is None:
   2255             return False
   2256         lobby.CheckCanAccessService(serviceName)
   2257         return True
   2258 
   2259     def _IsRepairServiceAvailable(self):
   2260         if session.stationid and sm.GetService('station').IsStationServiceAvailable(appConst.stationServiceRepairFacilities):
   2261             if self.HasServiceAccess('repairshop'):
   2262                 return True
   2263         if session.structureid:
   2264             if sm.GetService('structureServices').IsServiceAvailableForCharacter(structures.SERVICE_REPAIR):
   2265                 return True
   2266         return False
   2267 
   2268     def _IsInsuranceServiceAvailable(self):
   2269         if session.stationid and sm.GetService('station').IsStationServiceAvailable(appConst.stationServiceInsurance):
   2270             if self.HasServiceAccess('insurance'):
   2271                 return True
   2272         if session.structureid:
   2273             if sm.GetService('structureServices').IsServiceAvailableForCharacter(structures.SERVICE_INSURANCE):
   2274                 return True
   2275         return False
   2276 
   2277     def _IsReprocessingServiceAvailable(self):
   2278         if session.stationid and sm.GetService('station').IsStationServiceAvailable(appConst.stationServiceReprocessingPlant):
   2279             if self.HasServiceAccess('reprocessingPlant'):
   2280                 return True
   2281         if session.structureid:
   2282             if sm.GetService('structureSettings').CharacterHasService(session.structureid, structures.SERVICE_REPROCESSING):
   2283                 return True
   2284         return False
   2285 
   2286     def OpenMarket(self, *args):
   2287         if session.stationid is None or self.HasServiceAccess('market', True):
   2288             RegionalMarket.ToggleOpenClose()
   2289 
   2290     OpenMarket.nameLabelPath = RegionalMarket.default_captionLabelPath
   2291     OpenMarket.descriptionLabelPath = RegionalMarket.default_descriptionLabelPath
   2292 
   2293     def OpenMarketOrders(self, *args):
   2294         MarketOrdersWnd.ToggleOpenClose()
   2295 
   2296     OpenMarketOrders.nameLabelPath = MarketOrdersWnd.default_captionLabelPath
   2297     OpenMarketOrders.descriptionLabelPath = MarketOrdersWnd.default_descriptionLabelPath
   2298 
   2299     def OpenContracts(self, *args):
   2300         wnd = ContractsWindow.ToggleOpenClose()
   2301 
   2302     OpenContracts.nameLabelPath = ContractsWindow.default_captionLabelPath
   2303     OpenContracts.descriptionLabelPath = ContractsWindow.default_descriptionLabelPath
   2304 
   2305     def OpenIndustry(self, *args):
   2306         if session.solarsystemid2:
   2307             Industry.ToggleOpenClose()
   2308 
   2309     OpenIndustry.nameLabelPath = Industry.default_captionLabelPath
   2310     OpenIndustry.descriptionLabelPath = Industry.default_descriptionLabelPath
   2311 
   2312     def OpenMultibuy(self, *args):
   2313         BuyMultipleTypesWithQty({})
   2314 
   2315     OpenMultibuy.nameLabelPath = 'UI/Market/Multibuy'
   2316     OpenMultibuy.descriptionLabelPath = 'UI/Market/Multibuy_description'
   2317 
   2318     def OpenPlanets(self, *args):
   2319         if session.solarsystemid2:
   2320             PlanetWindow.ToggleOpenClose()
   2321 
   2322     OpenPlanets.nameLabelPath = PlanetWindow.default_captionLabelPath
   2323     OpenPlanets.descriptionLabelPath = PlanetWindow.default_descriptionLabelPath
   2324 
   2325     def OpenMyMercenaryDens(self, *args):
   2326         if session.solarsystemid2:
   2327             MyMercDensWnd.ToggleOpenClose()
   2328 
   2329     OpenMyMercenaryDens.nameLabelPath = MyMercDensWnd.default_captionLabelPath
   2330     OpenMyMercenaryDens.descriptionLabelPath = MyMercDensWnd.default_descriptionLabelPath
   2331 
   2332     def OpenFitting(self, *args):
   2333         return self._OpenNewFittingWnd()
   2334 
   2335     OpenFitting.nameLabelPath = FittingWindow.default_captionLabelPath
   2336     OpenFitting.descriptionLabelPath = FittingWindow.default_descriptionLabelPath
   2337 
   2338     def _OpenNewFittingWnd(self):
   2339         fittingSvc = sm.GetService('fittingSvc')
   2340         shipID = fittingSvc.GetShipIDForFittingWindow()
   2341         if shipID is None:
   2342             if fittingSvc.IsShipSimulated():
   2343                 fittingSvc.SetSimulationState(False)
   2344             else:
   2345                 prompt_player_fsd_dialog('CannotPerformActionWithoutShip')
   2346                 return
   2347         if session.stationid is None or self.HasServiceAccess('fitting'):
   2348             FittingWindow.ToggleOpenClose(shipID=shipID)
   2349 
   2350     def OpenMedical(self, *args):
   2351         CharacterSheetWindow.ToggleOpenWithPanel(PANEL_JUMPCLONES)
   2352 
   2353     OpenMedical.nameLabelPath = 'Tooltips/StationServices/CloneBay'
   2354     OpenMedical.descriptionLabelPath = 'Tooltips/StationServices/CloneBay_description'
   2355 
   2356     def OpenRepairshop(self, *args):
   2357         if self._IsRepairServiceAvailable():
   2358             RepairShopWindow.ToggleOpenClose()
   2359 
   2360     OpenRepairshop.nameLabelPath = RepairShopWindow.default_captionLabelPath
   2361     OpenRepairshop.descriptionLabelPath = RepairShopWindow.default_descriptionLabelPath
   2362 
   2363     def OpenInsurance(self, *args):
   2364         if self._IsInsuranceServiceAvailable():
   2365             InsuranceWindow.ToggleOpenClose()
   2366 
   2367     OpenInsurance.nameLabelPath = InsuranceWindow.default_captionLabelPath
   2368     OpenInsurance.descriptionLabelPath = InsuranceWindow.default_descriptionLabelPath
   2369 
   2370     def OpenBountyOffice(self, *args):
   2371         if not IsPlayerBountyHidden(sm.GetService('machoNet')):
   2372             BountyWindow.ToggleOpenClose()
   2373 
   2374     OpenBountyOffice.nameLabelPath = BountyWindow.default_captionLabelPath
   2375     OpenBountyOffice.descriptionLabelPath = BountyWindow.default_descriptionLabelPath
   2376 
   2377     def OpenSecurityOffice(self, *args):
   2378         if session.stationid:
   2379             if sm.GetService('securityOfficeSvc').CanAccessServiceInStation(session.stationid):
   2380                 SecurityOfficeWindow.ToggleOpenClose()
   2381 
   2382     OpenSecurityOffice.nameLabelPath = SecurityOfficeWindow.default_captionLabelPath
   2383     OpenSecurityOffice.descriptionLabelPath = SecurityOfficeWindow.default_descriptionLabelPath
   2384 
   2385     def OpenFwEnlistment(self, *args, **kwargs):
   2386         theatersOfWarUtil.open_enlistment_window(**kwargs)
   2387 
   2388     OpenFwEnlistment.nameLabelPath = 'UI/FactionWarfare/FwEnlistmentWnd'
   2389 
   2390     def OpenInsurgencyDashboard(self, *args, **kwargs):
   2391         theatersOfWarUtil.open_insurgencies_window(**kwargs)
   2392 
   2393     OpenInsurgencyDashboard.nameLabelPath = 'UI/PirateInsurgencies/dashboardCaption'
   2394     OpenInsurgencyDashboard.descriptionLabelPath = 'UI/PirateInsurgencies/Insurgency_description'
   2395 
   2396     def OpenMilitia(self, *args, **kwargs):
   2397         theatersOfWarUtil.open_fw_window(**kwargs)
   2398 
   2399     OpenMilitia.nameLabelPath = 'Tooltips/StationServices/FactionalWarfare'
   2400     OpenMilitia.descriptionLabelPath = 'Tooltips/StationServices/FactionalWarfare_description'
   2401 
   2402     def OpenRelevantFWWindow(self, *args, **kwargs):
   2403         if session.warfactionid is None:
   2404             self.OpenFwEnlistment(*args, **kwargs)
   2405         elif IsPirateFWFaction(session.warfactionid):
   2406             self.OpenInsurgencyDashboard(*args, **kwargs)
   2407         else:
   2408             self.OpenMilitia(*args, **kwargs)
   2409 
   2410     OpenRelevantFWWindow.nameLabelPath = 'Tooltips/StationServices/FactionalWarfare'
   2411     OpenRelevantFWWindow.descriptionLabelPath = 'Tooltips/StationServices/FactionalWarfare_description'
   2412 
   2413     def OpenFWInfoTab(self, *args, **kwargs):
   2414         wnd = self.OpenFwWindow(tab_id='Objectives')
   2415 
   2416     def OpenFwWindow(self, *args, **kwargs):
   2417         return theatersOfWarUtil.open_fw_window(*args, **kwargs)
   2418 
   2419     def OpenReprocessingPlant(self, items = None):
   2420         if self._IsReprocessingServiceAvailable():
   2421             if ReprocessingWnd.IsOpen() and items:
   2422                 wnd = ReprocessingWnd.GetIfOpen()
   2423                 wnd.AddPreselectedItems(items)
   2424                 if wnd.IsMinimized():
   2425                     wnd.Maximize()
   2426             else:
   2427                 ReprocessingWnd.ToggleOpenClose(selectedItems=items)
   2428 
   2429     OpenReprocessingPlant.nameLabelPath = ReprocessingWnd.default_captionLabelPath
   2430     OpenReprocessingPlant.descriptionLabelPath = ReprocessingWnd.default_descriptionLabelPath
   2431 
   2432     def OpenLpstore(self, *args):
   2433         lpstore = sm.GetService('lpstore')
   2434         if session.stationid:
   2435             stationOwnerCorpID = sm.GetService('station').stationItem.ownerID
   2436             if idCheckers.IsNPC(stationOwnerCorpID) and self.HasServiceAccess('lpstore'):
   2437                 stores_to_open = []
   2438                 normalStoresInStation = get_normal_lp_stores_in_station(session.stationid, stationOwnerCorpID)
   2439                 for corpID in normalStoresInStation:
   2440                     stores_to_open.append(corpID)
   2441 
   2442                 factionID = sm.GetService('map').GetItem(session.solarsystemid2).factionID
   2443                 rwCorpID = sm.GetService('rwService').get_rw_corp_for_faction_and_system(factionID)
   2444                 if rwCorpID is not None:
   2445                     stores_to_open.append(rwCorpID)
   2446                 lpstore.OpenLPStore(stores_to_open)
   2447         elif session.structureid:
   2448             structureInfo = sm.GetService('structureDirectory').GetStructureInfo(session.structureid)
   2449             stationOwnerCorpID = structureInfo.ownerID
   2450             if idCheckers.IsNPC(stationOwnerCorpID) and self.HasServiceAccess('lpstore'):
   2451                 stores_to_open = [stationOwnerCorpID]
   2452                 lpstore.OpenLPStore(stores_to_open)
   2453 
   2454     OpenLpstore.nameLabelPath = LPStoreWindow.default_captionLabelPath
   2455     OpenLpstore.descriptionLabelPath = LPStoreWindow.default_descriptionLabelPath
   2456 
   2457     def OpenCharacterCustomization(self, *args):
   2458         if IsContentComplianceControlSystemActive(sm.GetService('machoNet')):
   2459             return
   2460         if getattr(sm.GetService('map'), 'busy', False):
   2461             return
   2462         if sm.GetService('cc').NoExistingCustomization():
   2463             raise UserError('CantRecustomizeCharacterWithoutDoll')
   2464         if session.stationid or session.structureid:
   2465             try:
   2466                 self.loadingCharacterCustomization = True
   2467                 CharacterSheetWindow.CloseIfOpen()
   2468                 wnd = PreviewCharacterWnd.GetIfOpen()
   2469                 if wnd is not None:
   2470                     wnd.Close()
   2471                 if self.HasServiceAccess('charcustomization'):
   2472                     uicore.cmd.commandMap.UnloadAccelerator(uicore.cmd.commandMap.commandsByName['OpenCharactersheet'])
   2473                     sm.GetService('gameui').GoCharacterCreationCurrentCharacter()
   2474             finally:
   2475                 self.loadingCharacterCustomization = False
   2476 
   2477     OpenCharacterCustomization.nameLabelPath = 'Tooltips/StationServices/CharacterCustomization'
   2478     OpenCharacterCustomization.descriptionLabelPath = 'Tooltips/StationServices/CharacterCustomization_description'
   2479 
   2480     def OpenCalendar(self, *args):
   2481         sm.GetService('neocom').BlinkOff('clock')
   2482         if session.charid:
   2483             CalendarWnd.ToggleOpenClose()
   2484 
   2485     OpenCalendar.nameLabelPath = CalendarWnd.default_captionLabelPath
   2486     OpenCalendar.descriptionLabelPath = CalendarWnd.default_descriptionLabelPath
   2487 
   2488     def OpenAuraInteraction(self, *args):
   2489         agentService = sm.GetService('agents')
   2490         auraID = agentService.GetAuraAgentID()
   2491         agentService.OpenDialogueWindow(auraID)
   2492 
   2493     def CmdHideUI(self, force = 0):
   2494         sys = uicore.layer.systemmenu
   2495         if sys.isopen and not force:
   2496             return
   2497         sm.GetService('ui').ToggleUiVisible()
   2498 
   2499     def CmdHideCursor(self, *args):
   2500         uicore.uilib.SetCursor(uiconst.UICURSOR_NONE)
   2501 
   2502     def CmdToggle3DView(self, *args):
   2503         sm.GetService('sceneManager').ToggleEnable3DView()
   2504 
   2505     def OpenDungeonEditor(self, *args):
   2506         if eveCfg.InSpace() and session.role & ROLE_CONTENT:
   2507             DungeonEditor.Open()
   2508             if IsJessicaOpen():
   2509                 DungeonObjectProperties.Open()
   2510 
   2511     OpenDungeonEditor.nameLabelPath = 'UI/Commands/OpenDungeonEditor'
   2512 
   2513     def OpenFittingMgmt(self):
   2514         FittingMgmt.Open()
   2515 
   2516     OpenFittingMgmt.nameLabelPath = FittingMgmt.default_captionLabelPath
   2517     OpenFittingMgmt.descriptionLabelPath = 'Tooltips/Neocom/FittingManagementDescription'
   2518 
   2519     def OpenCompare(self, *args):
   2520         if use_new_comparison_tool.is_enabled():
   2521             ComparisonWindow.ToggleOpenClose()
   2522         else:
   2523             TypeCompare.ToggleOpenClose()
   2524 
   2525     OpenCompare.nameLabelPath = ComparisonWindow.default_captionLabelPath
   2526     OpenCompare.descriptionLabelPath = ComparisonWindow.default_descriptionLabelPath
   2527 
   2528     def OpenUIDebugger(self, *args):
   2529         if session.role & ROLE_GML:
   2530             UITree.ToggleOpenClose()
   2531 
   2532     def ToggleTheatersOfWarWindow(self, *args):
   2533         TheatersOfWarDashboardWnd.ToggleOpenClose()
   2534 
   2535     ToggleTheatersOfWarWindow.nameLabelPath = TheatersOfWarDashboardWnd.default_captionLabelPath
   2536 
   2537     def OpenSkillTreeWindow(self):
   2538         return SkillTreeDockablePanel.ToggleOpenClose()
   2539 
   2540     def OpenImageCacheDemo(self, *args):
   2541         from imagecaching.demo.image_cache_demo_window import ImageCacheDemoWindow
   2542         ImageCacheDemoWindow.ToggleOpenClose()
   2543 
   2544     def ToggleTelemetryRecord(self):
   2545         if self._telemetrySessionActive:
   2546             blue.statistics.StopTelemetry()
   2547             self._telemetrySessionActive = False
   2548             print('*** Telemetry session stopped ***')
   2549         else:
   2550             from pytelemetry import StartTelemetry
   2551             StartTelemetry()
   2552             self._telemetrySessionActive = True
   2553             print('*** Telemetry session started ***')
   2554 
   2555     def ToggleUILinearColor(self):
   2556         uicore.desktop.renderObject.useLinearColorSpace = not uicore.desktop.renderObject.useLinearColorSpace
   2557 
   2558     def ToggleGammaCorrectText(self):
   2559         uicore.desktop.renderObject.gammaCorrectText = not uicore.desktop.renderObject.gammaCorrectText
   2560 
   2561     def CmdToggleEffects(self, *args):
   2562         candidateEffects = []
   2563         for guid in GetEffectGuids():
   2564             if guid not in FxSequencer.fxTurretGuids and guid not in FxSequencer.fxProtectedGuids:
   2565                 candidateEffects.append(guid)
   2566 
   2567         disabledGuids = sm.GetService('FxSequencer').GetDisabledGuids()
   2568         if len(candidateEffects) > 0:
   2569             if candidateEffects[0] in disabledGuids:
   2570                 gfxsettings.Set(gfxsettings.UI_EFFECTS_ENABLED, 1, pending=False)
   2571                 sm.GetService('FxSequencer').EnableGuids(candidateEffects)
   2572                 prompt_player_fsd_dialog('CustomNotify', {'notify': 'All effects - On'})
   2573             else:
   2574                 gfxsettings.Set(gfxsettings.UI_EFFECTS_ENABLED, 0, pending=False)
   2575                 sm.GetService('FxSequencer').DisableGuids(candidateEffects)
   2576                 prompt_player_fsd_dialog('CustomNotify', {'notify': 'All effects - Off'})
   2577 
   2578     def CmdToggleEffectTurrets(self, *args):
   2579         disabledGuids = sm.GetService('FxSequencer').GetDisabledGuids()
   2580         if FxSequencer.fxTurretGuids[0] in disabledGuids:
   2581             gfxsettings.Set(gfxsettings.UI_TURRETS_ENABLED, 1, pending=False)
   2582             sm.GetService('FxSequencer').EnableGuids(FxSequencer.fxTurretGuids)
   2583             prompt_player_fsd_dialog('CustomNotify', {'notify': 'All Turret effects - On'})
   2584         else:
   2585             gfxsettings.Set(gfxsettings.UI_TURRETS_ENABLED, 0, pending=False)
   2586             sm.GetService('FxSequencer').DisableGuids(FxSequencer.fxTurretGuids)
   2587             prompt_player_fsd_dialog('CustomNotify', {'notify': 'All Turret effects - Off'})
   2588 
   2589     def CmdToggleCombatView(self, *args):
   2590         if session.solarsystemid and session.role & ROLEMASK_ELEVATEDPLAYER:
   2591             sm.GetService('target').ToggleViewMode()
   2592 
   2593     def CmdCycleFleetBroadcastScope(self, *args):
   2594         sm.GetService('fleet').CycleBroadcastScope()
   2595 
   2596     def CmdToggleTargetItem(self):
   2597         cmd = uicore.cmd.commandMap.GetCommandByName('CmdToggleTargetItem')
   2598         self.LoadCombatCommand(sm.GetService('target').ToggleLockTarget, cmd)
   2599 
   2600     def CmdLockTargetItem(self):
   2601         cmd = uicore.cmd.commandMap.GetCommandByName('CmdLockTargetItem')
   2602         self.LoadCombatCommand(sm.GetService('target').TryLockTarget, cmd)
   2603 
   2604     def CmdSelectTargetItem(self):
   2605         cmd = uicore.cmd.commandMap.GetCommandByName('CmdSelectTargetItem')
   2606         self.LoadCombatCommand(GetMenuService().SelectTarget, cmd)
   2607 
   2608     def CmdUnlockTargetItem(self):
   2609         cmd = uicore.cmd.commandMap.GetCommandByName('CmdUnlockTargetItem')
   2610         self.LoadCombatCommand(sm.GetService('target').UnlockTarget, cmd)
   2611 
   2612     def CmdUnlockTargetItems(self):
   2613         sm.GetService('target').UnlockTargets()
   2614 
   2615     def CmdToggleLookAtItem(self):
   2616         cmd = uicore.cmd.commandMap.GetCommandByName('CmdToggleLookAtItem')
   2617         self.LoadCombatCommand(GetMenuService().ToggleLookAt, cmd)
   2618 
   2619     def CmdToggleCameraTracking(self):
   2620         cmd = uicore.cmd.commandMap.GetCommandByName('CmdToggleCameraTracking')
   2621         self.LoadCombatCommand(GetMenuService().SetInterest, cmd)
   2622 
   2623     def CmdApproachItem(self):
   2624         cmd = uicore.cmd.commandMap.GetCommandByName('CmdApproachItem')
   2625         if not self._IsCombatCmdAvailableToHull():
   2626             return
   2627         uicore.layer.inflight.positionalControl.StartMoveCommand()
   2628         self.LoadCombatCommand(movementFunctions.Approach, cmd)
   2629         self.combatCmdUnloadFunc = self._CmdApproacItemUnloadCallback
   2630 
   2631     def CmdGetLocationMenuForNavigation(self):
   2632         cmd = uicore.cmd.commandMap.GetCommandByName('CmdGetLocationMenuForNavigation')
   2633         self.LoadLightCombatCommand(cmd)
   2634 
   2635     CmdGetLocationMenuForNavigation.nameLabelPath = 'UI/Commands/CmdGetLocationMenuForNavigation'
   2636     CmdGetLocationMenuForNavigation.descriptionLabelPath = 'UI/Commands/CmdGetLocationMenuForNavigationDesc'
   2637 
   2638     def CmdGetUiPointer(self):
   2639         cmd = uicore.cmd.commandMap.GetCommandByName('CmdGetUiPointer')
   2640         pointerHelper = sm.GetService('helpPointer').GetPointerOverlay(create=True)
   2641         self.combatCmdUnloadFunc = self._CmdGetUiPointerUnloadCallback
   2642         self.LogInfo('cmd:UI Pointer overlay: activate pointer')
   2643         uthread.new(pointerHelper.ShowOverlay)
   2644         self.LoadLightCombatCommand(cmd)
   2645 
   2646     CmdGetUiPointer.nameLabelPath = 'UI/Commands/CmdGetUiPointer'
   2647     CmdGetUiPointer.descriptionLabelPath = 'UI/Commands/CmdGetUiPointerDesc'
   2648 
   2649     def _CmdGetUiPointerUnloadCallback(self, *args):
   2650         sm.GetService('helpPointer').HidePointerOverlay()
   2651 
   2652     def _IsCombatCmdAvailableToHull(self):
   2653         if eveCfg.IsControllingStructure():
   2654             shipIsSelected, selectedFighterIDs = GetSelectedShipAndFighters()
   2655             if not selectedFighterIDs:
   2656                 return False
   2657         return True
   2658 
   2659     def _CmdApproacItemUnloadCallback(self, *args):
   2660         posCtrl = uicore.layer.inflight.positionalControl
   2661         if not posCtrl.IsFirstPointSet():
   2662             posCtrl.AbortCommand()
   2663 
   2664     def CmdAlignToItem(self):
   2665         if not self._IsCombatCmdAvailableToHull():
   2666             return
   2667         cmd = uicore.cmd.commandMap.GetCommandByName('CmdAlignToItem')
   2668         self.LoadCombatCommand(GetMenuService().AlignTo, cmd)
   2669 
   2670     def CmdOrbitItem(self):
   2671         if not self._IsCombatCmdAvailableToHull():
   2672             return
   2673         cmd = uicore.cmd.commandMap.GetCommandByName('CmdOrbitItem')
   2674         self.LoadCombatCommand(Orbit, cmd)
   2675 
   2676     def CmdKeepItemAtRange(self):
   2677         if not self._IsCombatCmdAvailableToHull():
   2678             return
   2679         cmd = uicore.cmd.commandMap.GetCommandByName('CmdKeepItemAtRange')
   2680         self.LoadCombatCommand(KeepAtRange, cmd)
   2681 
   2682     def CmdOpenSelectedCargoContainer(self):
   2683         if not self._IsCombatCmdAvailableToHull():
   2684             return
   2685         cmd = uicore.cmd.commandMap.GetCommandByName('CmdOpenSelectedCargoContainer')
   2686         self.LoadCombatCommand(GetMenuService().OpenCargo, cmd)
   2687 
   2688     CmdOpenSelectedCargoContainer.nameLabelPath = 'UI/Inflight/OpenSelectedCargoContainer'
   2689 
   2690     def CmdShowItemInfo(self):
   2691         cmd = uicore.cmd.commandMap.GetCommandByName('CmdShowItemInfo')
   2692         self.LoadCombatCommand(GetMenuService().ShowInfoForItem, cmd)
   2693 
   2694     def CmdDockOrJumpOrActivateGate(self):
   2695         if eveCfg.IsControllingStructure():
   2696             return
   2697         cmd = uicore.cmd.commandMap.GetCommandByName('CmdDockOrJumpOrActivateGate')
   2698         self.LoadCombatCommand(DockOrJumpOrActivateGate, cmd)
   2699 
   2700     def CmdWarpToItem(self):
   2701         if not self._IsCombatCmdAvailableToHull():
   2702             return
   2703         cmd = uicore.cmd.commandMap.GetCommandByName('CmdWarpToItem')
   2704         self.LoadCombatCommand(WarpToItem, cmd)
   2705 
   2706     def CmdOpenRadialMenu(self):
   2707         cmd = uicore.cmd.commandMap.GetCommandByName('CmdOpenRadialMenu')
   2708         self.LoadCombatCommand(None, cmd)
   2709 
   2710     def CmdOpenBroadcastRadialMenu(self):
   2711         if not session.fleetid:
   2712             return
   2713         cmd = uicore.cmd.commandMap.GetCommandByName('CmdOpenBroadcastRadialMenu')
   2714         self.LoadCombatCommand(None, cmd)
   2715 
   2716     def CmdSendBroadcast_Target(self):
   2717         cmd = uicore.cmd.commandMap.GetCommandByName('CmdSendBroadcast_Target')
   2718         self.LoadCombatCommand(sm.GetService('fleet').SendBroadcast_Target, cmd)
   2719 
   2720     def CmdSendBroadcast_HealTarget(self):
   2721         cmd = uicore.cmd.commandMap.GetCommandByName('CmdSendBroadcast_HealTarget')
   2722         self.LoadCombatCommand(sm.GetService('fleet').SendBroadcast_Heal_Target, cmd)
   2723 
   2724     def CmdSendBroadcast_WarpToItemID(self):
   2725         cmd = uicore.cmd.commandMap.GetCommandByName('CmdSendBroadcast_WarpToItemID')
   2726         self.LoadCombatCommand(sm.GetService('fleet').SendBroadcast_WarpToItemID, cmd)
   2727 
   2728     def CmdSendBroadcast_AlignToItemID(self):
   2729         cmd = uicore.cmd.commandMap.GetCommandByName('CmdSendBroadcast_AlignToItemID')
   2730         self.LoadCombatCommand(sm.GetService('fleet').SendBroadcast_AlignToItemID, cmd)
   2731 
   2732     def CmdSendBroadcast_JumpToItemID(self):
   2733         cmd = uicore.cmd.commandMap.GetCommandByName('CmdSendBroadcast_JumpToItemID')
   2734         self.LoadCombatCommand(sm.GetService('fleet').SendBroadcast_JumpToItemID, cmd)
   2735 
   2736     def MakeCmdTagItem(self, tag):
   2737         functionName = 'CmdTagItem_%s' % tag
   2738 
   2739         def CmdTagItem():
   2740             if session.fleetid is None:
   2741                 return
   2742             cmd = uicore.cmd.commandMap.GetCommandByName(functionName)
   2743 
   2744             def DoTagItem(itemID):
   2745                 if session.fleetid is None:
   2746                     return
   2747                 self.menu.TagItem(itemID, tag)
   2748 
   2749             self.LoadCombatCommand(DoTagItem, cmd)
   2750 
   2751         CmdTagItem.__name__ = functionName
   2752         return CmdTagItem
   2753 
   2754     def MakeCmdTagItemFromSequence(self, tagSequence):
   2755         functionName = 'CmdTagItem_%s' % ''.join(tagSequence)
   2756 
   2757         def CmdTagItem():
   2758             if session.fleetid is None:
   2759                 return
   2760             cmd = uicore.cmd.commandMap.GetCommandByName(functionName)
   2761 
   2762             def DoTagItemFromSequence(itemID):
   2763                 if session.fleetid is None:
   2764                     return
   2765                 index = self.commandMemory.get(functionName, 0)
   2766                 tag = tagSequence[index]
   2767                 index = (index + 1) % len(tagSequence)
   2768                 self.commandMemory[functionName] = index
   2769                 self.menu.TagItem(itemID, tag)
   2770 
   2771             self.LoadCombatCommand(DoTagItemFromSequence, cmd)
   2772 
   2773         CmdTagItem.__name__ = functionName
   2774         return CmdTagItem
   2775 
   2776     def CmdToggleSensorOverlay(self):
   2777         if eveCfg.InSpace():
   2778             sm.GetService('sensorSuite').ToggleOverlay()
   2779 
   2780     CmdToggleSensorOverlay.nameLabelPath = 'UI/Inflight/Scanner/SensorOverlay'
   2781 
   2782     def CmdCreateBookmark(self):
   2783         if eveCfg.InSpace():
   2784             sm.GetService('addressbook').BookmarkCurrentLocation()
   2785 
   2786     def CmdFleetGroup(self):
   2787         if not session.fleetid:
   2788             return
   2789         if session.fleetrole in appConst.fleetCmdrRoles:
   2790             sm.GetService('fleet').Regroup()
   2791 
   2792     CmdFleetGroup.nameLabelPath = 'UI/Fleet/FleetRegroup'
   2793 
   2794     def CmdClearFleetBroadcastIcons(self):
   2795         if not session.fleetid:
   2796             return
   2797         sm.GetService('fleet').ClearWatchlistBroadcastHistory()
   2798 
   2799     CmdClearFleetBroadcastIcons.nameLabelPath = 'UI/Fleet/ClearBroadcastIcons'
   2800 
   2801     def CmdFlightControlsUp(self):
   2802         pass
   2803 
   2804     CmdFlightControlsUp.nameLabelPath = 'UI/Commands/CmdFlightControlsUp'
   2805 
   2806     def CmdFlightControlsDown(self):
   2807         pass
   2808 
   2809     CmdFlightControlsDown.nameLabelPath = 'UI/Commands/CmdFlightControlsDown'
   2810 
   2811     def CmdFlightControlsLeft(self):
   2812         pass
   2813 
   2814     CmdFlightControlsLeft.nameLabelPath = 'UI/Commands/CmdFlightControlsLeft'
   2815 
   2816     def CmdFlightControlsRight(self):
   2817         pass
   2818 
   2819     CmdFlightControlsRight.nameLabelPath = 'UI/Commands/CmdFlightControlsRight'
   2820 
   2821     def CmdAimFighterAbility(self, fighterID, abiltySlotID):
   2822         self.CmdAimMultiSquadronFighterAbilities([fighterID], abiltySlotID)
   2823 
   2824     def CmdAimMultiSquadronFighterAbilities(self, fighterIDs, abiltySlotID):
   2825         uicore.layer.inflight.positionalControl.StartFighterAbilityTargeting(fighterIDs, abiltySlotID)
   2826 
   2827     def CmdAimWeapon(self, moduleID, effect, targetPointCount):
   2828         uicore.layer.inflight.positionalControl.StartEffectTargeting(session.shipid, moduleID, effect, targetPointCount)
   2829 
   2830     def LoadCombatCommand(self, function, cmd):
   2831         if not session.solarsystemid:
   2832             return
   2833         sm.ScatterEvent('OnFreezeOverviewWindows')
   2834         self.combatFunctionLoaded = function
   2835         self.combatCmdLoaded = cmd
   2836         uicore.event.RegisterForTriuiEvents((uiconst.UI_KEYUP,
   2837          uiconst.UI_KEYDOWN,
   2838          uiconst.UI_ACTIVE,
   2839          uiconst.UI_MOUSEUP), self.CombatKeyUnloadListener)
   2840         delay = 0.3
   2841         for key in cmd.shortcut:
   2842             if key not in uiconst.MODKEYS:
   2843                 delay = 0
   2844                 break
   2845 
   2846         HudActionIndicationController.get_instance().set_shortcut_indication(IndicationData(cmd.GetDescription(), localization.GetByLabel('UI/Commands/ClickTarget'), icon=cmd.GetIcon()), delay=delay)
   2847         sm.GetService('flightPredictionSvc').CommandKeyDown(cmd.name)
   2848 
   2849     def LoadLightCombatCommand(self, cmd):
   2850         if not session.charid:
   2851             return
   2852         self.combatFunctionLoaded = None
   2853         self.combatCmdLoaded = cmd
   2854         uicore.event.RegisterForTriuiEvents((uiconst.UI_KEYUP,
   2855          uiconst.UI_KEYDOWN,
   2856          uiconst.UI_ACTIVE,
   2857          uiconst.UI_MOUSEUP), self.CombatKeyUnloadListener)
   2858         delay = 0.3
   2859         for key in cmd.shortcut:
   2860             if key not in uiconst.MODKEYS:
   2861                 delay = 0
   2862                 break
   2863 
   2864         desc = cmd.GetDetailedDescription()
   2865         HudActionIndicationController.get_instance().set_shortcut_indication(IndicationData(cmd.GetDescription(), desc), delay)
   2866 
   2867     def UnloadCombatCommand(self):
   2868         uthread.new(self._UnloadCombatCommand)
   2869 
   2870     def _UnloadCombatCommand(self):
   2871         sm.GetService('flightPredictionSvc').CommandKeyUp()
   2872         HudActionIndicationController.get_instance().clear_shortcut_indication()
   2873         sm.ScatterEvent('OnUnfreezeOverviewWindows')
   2874         self.combatFunctionLoaded = None
   2875         self.combatCmdLoaded = None
   2876         if self.combatCmdUnloadFunc:
   2877             self.combatCmdUnloadFunc(self.combatCmdCurrentHasExecuted)
   2878             self.combatCmdUnloadFunc = None
   2879         self.combatCmdCurrentHasExecuted = False
   2880 
   2881     def CombatKeyUnloadListener(self, wnd, eventID, keyChange):
   2882         vk = keyChange[0] if keyChange else None
   2883         if eventID == uiconst.UI_MOUSEUP and vk in (uiconst.MOUSELEFT, uiconst.MOUSERIGHT):
   2884             return True
   2885         if eventID == uiconst.UI_ACTIVE:
   2886             self.UnloadCombatCommand()
   2887             return
   2888         if self.combatCmdLoaded is None:
   2889             return True
   2890         if vk not in self.combatCmdLoaded.shortcut:
   2891             self.UnloadCombatCommand()
   2892             return
   2893         for key in self.combatCmdLoaded.shortcut:
   2894             if not uicore.uilib.Key(key):
   2895                 self.UnloadCombatCommand()
   2896                 return
   2897 
   2898         return True
   2899 
   2900     def ExecuteCombatCommand(self, itemID, eventID, **kwargs):
   2901         if itemID is None or self.combatFunctionLoaded is None:
   2902             return False
   2903         if eventID == uiconst.UI_KEYUP and self.combatCmdCurrentHasExecuted:
   2904             self.UnloadCombatCommand()
   2905             return True
   2906         self.combatCmdCurrentHasExecuted = True
   2907         self.ExecuteActiveCombatCommand(itemID, **kwargs)
   2908         return True
   2909 
   2910     def ExecuteActiveCombatCommand(self, itemID, **kwargs):
   2911         if not self.IsCombatCommandLoaded('CmdSelectTargetItem'):
   2912             GetAudioService().SendUIEvent('ui_radial_select_play')
   2913         uthread.new(self.combatFunctionLoaded, itemID, **kwargs)
   2914 
   2915     def IsSomeCombatCommandLoaded(self):
   2916         return self.combatFunctionLoaded is not None
   2917 
   2918     def IsCombatCommandLoaded(self, cmdName):
   2919         return self.combatCmdLoaded == self.commandMap.GetCommandByName(cmdName)
   2920 
   2921     def GetCombatCmdLoadedName(self):
   2922         return self.combatCmdLoaded
   2923 
   2924     def CmdForceFadeFromBlack(self, *args):
   2925         loadSvc = sm.GetService('loading')
   2926         if loadSvc.IsLoading():
   2927             loadSvc.FadeOut(100)
   2928 
   2929     def Reset(self, resetKey):
   2930         if resetKey == 'windows':
   2931             GetDockPanelManager().ResetAllPanelSettings()
   2932             sm.GetService('window').ResetWindowSettings()
   2933         elif resetKey == 'window color':
   2934             sm.GetService('uiColor').ResetUIColors()
   2935         elif resetKey == 'clear cache':
   2936             sm.GetService('gameui').ClearCacheFiles()
   2937         elif resetKey == 'clear iskspammers':
   2938             sm.GetService('chat').clear_reported_spammers()
   2939         elif resetKey == 'clear settings':
   2940             sm.GetService('gameui').ClearSettings()
   2941         elif resetKey == 'clear mail':
   2942             sm.GetService('mailSvc').ClearMailCache()
   2943         elif resetKey == 'reset neocom':
   2944             ResetNeocomButtons()
   2945 
   2946     def CmdToggleSystemMenu(self):
   2947         systemMenu = uicore.layer.systemmenu
   2948         if systemMenu.isopen:
   2949             sm.GetService('uipointerSvc').RevealPointers()
   2950             uthread.new(systemMenu.CloseMenu)
   2951         else:
   2952             sm.GetService('uipointerSvc').SuppressPointers()
   2953             uthread.new(systemMenu.OpenView)
   2954 
   2955     CmdToggleSystemMenu.nameLabelPath = 'UI/Login/Settings'
   2956 
   2957     def OnEsc(self, *args):
   2958         escapeAdaptor = EscapeCommandAdapter()
   2959         escCommand = EscapeCommand(viewStateSrvc=sm.GetService('viewState'), adaptor=escapeAdaptor, dockPanelManager=GetDockPanelManager())
   2960         escCommand.Execute()
   2961 
   2962     def OnTab(self):
   2963         if uicore.uilib.Key(uiconst.VK_SHIFT):
   2964             uicore.registry.FindFocus(-1)
   2965         else:
   2966             uicore.registry.FindFocus(1)
   2967 
   2968     def MapCmd(self, cmdname, context):
   2969         self.commandMap.UnloadAllAccelerators()
   2970         wnd = MapCmdWindow.Open(cmdname=cmdname)
   2971         modalResult = wnd.ShowModal()
   2972         self.LoadAllAccelerators()
   2973         if modalResult == 1:
   2974             retval = wnd.result
   2975             shortcut = retval['shortcut']
   2976         else:
   2977             return
   2978         errorMsg, canOverride = self.MapCmdErrorCheck(cmdname, shortcut, context)
   2979         doOverride = False
   2980         if errorMsg:
   2981             if canOverride:
   2982                 questionText = localization.GetByLabel('UI/Commands/ShortcutAlreadyUsedReassign', usedText=errorMsg, cmd=self.GetStringFromShortcutKeys(shortcut), newFunc=uicore.cmd.FuncToDesc(cmdname))
   2983                 questionHeader = localization.GetByLabel('UI/Commands/ShortcutAlreadyUsedReassignHeader')
   2984                 reassingID = -1
   2985                 buttons = [Bunch(id=reassingID, label=localization.GetByLabel('UI/Commands/ReassingCmd')), Bunch(id=uiconst.ID_CANCEL, label=localization.GetByLabel('UI/Common/Buttons/Cancel'))]
   2986                 ret = prompt_player_fsd_dialog('CustomQuestion', {'question': questionText,
   2987                  'header': questionHeader}, buttons=buttons)
   2988                 if ret == reassingID:
   2989                     doOverride = True
   2990                 else:
   2991                     return self.MapCmd(cmdname, context)
   2992             else:
   2993                 prompt_player_fsd_dialog('CustomInfo', {'info': errorMsg})
   2994                 return self.MapCmd(cmdname, context)
   2995         alreadyUsing = self.commandMap.GetCommandByShortcut(shortcut)
   2996         if alreadyUsing is not None:
   2997             alreadyUsingContext = self.__categoryToContext__[alreadyUsing.category]
   2998             if alreadyUsingContext not in self.contextToCommand:
   2999                 self.contextToCommand[alreadyUsingContext] = {}
   3000             self.contextToCommand[alreadyUsingContext][shortcut] = alreadyUsing
   3001         if alreadyUsing and doOverride:
   3002             self.ClearMappedCmd(alreadyUsing.name)
   3003         self.commandMap.RemapCommand(cmdname, shortcut)
   3004         if context not in self.contextToCommand:
   3005             self.contextToCommand[context] = {}
   3006         self.ClearContextToCommandMapping(context, cmdname)
   3007         self.contextToCommand[context][shortcut] = self.commandMap.GetCommandByName(cmdname)
   3008         sm.ScatterEvent('OnMapShortcut', cmdname, shortcut)
   3009 
   3010     def ClearContextToCommandMapping(self, context, cmdname):
   3011         toDeleteShortcut = None
   3012         for shortcutKey, command in self.contextToCommand[context].iteritems():
   3013             if command.name == cmdname:
   3014                 toDeleteShortcut = shortcutKey
   3015 
   3016         if toDeleteShortcut is not None:
   3017             del self.contextToCommand[context][toDeleteShortcut]
   3018 
   3019     def MapCmdErrorCheck(self, cmdname, shortcut, context):
   3020         if not shortcut:
   3021             return (localization.GetByLabel('UI/Commands/ChooseAKeyPrompt'), False)
   3022         for key in shortcut:
   3023             keyName = self.GetKeyNameFromVK(key)
   3024             if not getattr(uiconst, 'VK_%s' % keyName.upper(), None):
   3025                 prompt_player_fsd_dialog('UnknownKey', {'key': keyName})
   3026                 return ('', False)
   3027 
   3028         extraShortcutRulesForCmd = self.GetExtraShortcutRulesForCmd(cmdname)
   3029         if extraShortcutRulesForCmd:
   3030             notAllowedWithModifiers = extraShortcutRulesForCmd.get(RULE_NOT_ALLOWED_WITH_MODIFIERS, None)
   3031             if notAllowedWithModifiers and len(shortcut) > 1 and set.intersection(set(shortcut), set(notAllowedWithModifiers)):
   3032                 cmd = labelsByFuncName.get(cmdname, None)
   3033                 cmdText = localization.GetByLabel(cmd) if cmd else cmdname
   3034                 listOfKeys = '<br>'.join([ command.GetKeyName(x) for x in notAllowedWithModifiers ])
   3035                 return (localization.GetByLabel('UI/Commands/ShortcutKeyNotAllowedWithModifiers', cmd=cmdText, listOfKeys=listOfKeys), False)
   3036         alreadyUsing = self.commandMap.GetCommandByShortcut(shortcut)
   3037         if alreadyUsing:
   3038             cmdEdit = self.commandMap.GetCommandByName(cmdname)
   3039             alreadyUsingContext = self.__categoryToContext__[alreadyUsing.category]
   3040             cmdEditContext = self.__categoryToContext__[cmdEdit.category]
   3041             sameContext = self.CheckContextIntersection(alreadyUsingContext, cmdEditContext)
   3042             if sameContext and alreadyUsing.name != cmdname:
   3043                 canOverride = not alreadyUsing.isLocked
   3044                 errorText = localization.GetByLabel('UI/Commands/ShortcutAlreadyUsedByCmd', cmd=alreadyUsing.GetShortcutAsString(), category=localization.GetByLabel(CATEGORIES[alreadyUsing.category]), func=alreadyUsing.GetDescription())
   3045                 return (errorText, canOverride)
   3046         if context in self.contextToCommand and shortcut in self.contextToCommand[context]:
   3047             alreadyUsing = self.contextToCommand[context][shortcut]
   3048             canOverride = not alreadyUsing.isLocked
   3049             errorText = localization.GetByLabel('UI/Commands/ShortcutAlreadyUsedByCmd', cmd=alreadyUsing.GetShortcutAsString(), category=localization.GetByLabel(CATEGORIES[alreadyUsing.category]), func=alreadyUsing.GetDescription())
   3050             return (errorText, canOverride)
   3051         return ('', False)
   3052 
   3053     def ClearMappedCmd(self, cmdname, showMsg = 1):
   3054         command = self.commandMap.GetCommandByName(cmdname)
   3055         context = self.__categoryToContext__[command.category]
   3056         if context in self.contextToCommand:
   3057             self.ClearContextToCommandMapping(context, cmdname)
   3058         CommandService.ClearMappedCmd(self, cmdname, showMsg)
   3059 
   3060     def CmdPickPortrait0(self, *args):
   3061         self.PickPortrait(0)
   3062 
   3063     def CmdPickPortrait1(self, *args):
   3064         self.PickPortrait(1)
   3065 
   3066     def CmdPickPortrait2(self, *args):
   3067         self.PickPortrait(2)
   3068 
   3069     def CmdPickPortrait3(self, *args):
   3070         self.PickPortrait(3)
   3071 
   3072     def PickPortrait(self, portraitID):
   3073         uicore.layer.charactercreation.controller.PickPortrait(portraitID)
   3074 
   3075     def GetCommandToExecute(self, cmdName, *args, **kwargs):
   3076         cmd = self.commandMap.GetCommandByName(cmdName)
   3077         if cmd:
   3078             return lambda : self.ExecuteCommand(cmd, *args, **kwargs)
   3079 
   3080     def GetCommandAndExecute(self, cmdName, *args, **kwargs):
   3081         cmd = self.commandMap.GetCommandByName(cmdName)
   3082         self.ExecuteCommand(cmd, *args, **kwargs)
   3083 
   3084     def ExecuteCommand(self, cmd, *args, **kwargs):
   3085         if not self.IsCommandEnabled(cmd):
   3086             return
   3087         if cmd.category in ('window', 'modules', 'drones'):
   3088             PlaySound(uiconst.SOUND_BUTTON_CLICK)
   3089         return cmd.callback(*args, **kwargs)
   3090 
   3091     def IsCommandEnabled(self, command):
   3092         references = ['cmd', 'cmd.name.{}'.format(command.name), 'cmd.category.{}'.format(command.category)]
   3093         if self.command_blocker.is_blocked(references):
   3094             return False
   3095         return command.name not in self.disabledCommands
   3096 
   3097     def EnableCommand(self, commandName):
   3098         self.disabledCommands.discard(commandName)
   3099 
   3100     def DisableCommand(self, commandName):
   3101         self.disabledCommands.add(commandName)
   3102 
   3103     def EnableAllCommands(self):
   3104         self.disabledCommands.clear()
   3105 
   3106     def DisableAllCommands(self):
   3107         for command in self.commandMap.GetAllCommands():
   3108             self.disabledCommands.add(command.name)
   3109 
   3110     def CmdSetDefenceStance(self, *args):
   3111         self._SetStance(shipmode.data.shipStanceDefense)
   3112 
   3113     def CmdSetSniperStance(self, *args):
   3114         self._SetStance(shipmode.data.shipStanceSniper)
   3115 
   3116     def CmdSetSpeedStance(self, *args):
   3117         self._SetStance(shipmode.data.shipStanceSpeed)
   3118 
   3119     def _SetStance(self, stanceID):
   3120         if eveCfg.InShip():
   3121             clientDL = sm.GetService('clientDogmaIM').GetDogmaLocation()
   3122             ship = clientDL.SafeGetDogmaItem(clientDL.GetActiveShipID(session.charid))
   3123             set_stance(stanceID, ship.itemID, ship.typeID)
   3124 
   3125     def CmdIncreaseProbeScanRange(self, *args):
   3126         if eveCfg.InSpace():
   3127             if ProbeScannerWindow.GetIfOpen():
   3128                 sm.GetService('scanSvc').ScaleFormation(2.0)
   3129             elif IsProbeScanEmbeddedPanelOpen():
   3130                 sm.GetService('scanSvc').ScaleFormation(2.0)
   3131             return True
   3132 
   3133     CmdIncreaseProbeScanRange.nameLabelPath = 'UI/Commands/CmdIncreaseProbeScanRange'
   3134 
   3135     def CmdDecreaseProbeScanRange(self, *args):
   3136         if eveCfg.InSpace():
   3137             if ProbeScannerWindow.GetIfOpen():
   3138                 sm.GetService('scanSvc').ScaleFormation(0.5)
   3139             elif IsProbeScanEmbeddedPanelOpen():
   3140                 sm.GetService('scanSvc').ScaleFormation(0.5)
   3141             return True
   3142 
   3143     CmdDecreaseProbeScanRange.nameLabelPath = 'UI/Commands/CmdDecreaseProbeScanRange'
   3144 
   3145     def CmdRefreshProbeScan(self, *args):
   3146         if eveCfg.InSpace():
   3147             from eve.client.script.ui.inflight.probeScannerWindow import ProbeScannerWindow
   3148             probeScanWindow = ProbeScannerWindow.GetIfOpen()
   3149             if probeScanWindow:
   3150                 probeScanWindow.Confirm()
   3151             else:
   3152                 scanWindow = SolarSystemViewPanel.GetIfOpen()
   3153                 if scanWindow and IsProbeScanEmbeddedPanelOpen():
   3154                     scanWindow.mapView.probeScannerPalette.Confirm()
   3155             return True
   3156 
   3157     CmdRefreshProbeScan.nameLabelPath = 'UI/Commands/CmdRefreshProbeScan'
   3158 
   3159     def CmdRefreshDirectionalScan(self, *args):
   3160         if not eveCfg.InSpace():
   3161             return
   3162         if not IsDirectionalScannerOpen():
   3163             self.OpenDirectionalScanner()
   3164         else:
   3165             cmd = uicore.cmd.commandMap.GetCommandByName('CmdRefreshDirectionalScan')
   3166             scanSvc = sm.GetService('directionalScanSvc')
   3167             self.LoadCombatCommand(scanSvc.ScanTowardsItem, cmd)
   3168             self.combatCmdUnloadFunc = scanSvc.OnCmdDirectionalScanUnload
   3169             scanSvc.OnCmdDirectionalScanLoad()
   3170 
   3171     CmdRefreshDirectionalScan.nameLabelPath = 'UI/Commands/CmdRefreshDirectionalScan'
   3172 
   3173     def CmdToggleAutoTracking(self, *args):
   3174         if not session.solarsystemid:
   3175             return
   3176         settings.char.ui.Set('orbitCameraAutoTracking', not IsAutoTrackingEnabled())
   3177 
   3178     CmdToggleAutoTracking.nameLabelPath = 'UI/Commands/CmdToggleAutoTracking'
   3179 
   3180     def OpenPointerWnd(self):
   3181         if not ArePointerLinksActive(sm.GetService('machoNet')):
   3182             return
   3183         PointerToolWnd.Open()
   3184 
   3185     OpenPointerWnd.nameLabelPath = PointerToolWnd.default_captionLabelPath
   3186     OpenPointerWnd.descriptionLabelPath = PointerToolWnd.default_descriptionLabelPath
   3187 
   3188     def OpenContextualOffersWindow(self):
   3189         sm.GetService('contextualOfferSvc').OpenContextualOffersWindow()
   3190 
   3191     OpenContextualOffersWindow.nameLabelPath = 'UI/ContextualOffers/OfferTitle'
   3192     OpenContextualOffersWindow.descriptionLabelPath = 'UI/ContextualOffers/OfferSubcaption'
   3193 
   3194     def ToggleCurrentSystemLocationWnd(self):
   3195         if not session.solarsystemid2:
   3196             return
   3197         StandaloneBookmarkWnd.ToggleOpenClose()
   3198 
   3199     ToggleCurrentSystemLocationWnd.nameLabelPath = 'UI/AclBookmarks/OpenBookmarkStandaloneWindow'
   3200 
   3201     def IsCommandAllowed(self, cmdName):
   3202         return True
   3203 
   3204     def _IsZhGiftCodeAvailable(self):
   3205         return AmOnChineseServer()
   3206 
   3207     def GetCSMVotingURL(self):
   3208         return self.machoNet.GetGlobalConfig().get('CSMVotingURL', 'https://community.eveonline.com/community/csm/vote/')
   3209 
   3210     def OpenCSMVoting(self):
   3211         try:
   3212             CSMVoteURL = self.GetCSMVotingURL()
   3213             blue.os.ShellExecute(CSMVoteURL)
   3214         except Exception:
   3215             LogException('Failed to open URL to access CSM voting')
   3216             raise UserError('FailedToOpenCSMVotingURL')
   3217 
   3218     def GetEVEPortalLandingURL(self):
   3219         return self.machoNet.GetGlobalConfig().get('CSMVotingURL', 'https://www.eveonline.com/eve-portal')
   3220 
   3221     def OpenEVEPortalLandingPage(self):
   3222         try:
   3223             EVEPortalLandingURL = self.GetEVEPortalLandingURL()
   3224             blue.os.ShellExecute(EVEPortalLandingURL)
   3225         except Exception:
   3226             LogException('Failed to open URL to access EVE Portal landing page')
   3227             raise UserError('FailedToOpenEVEPortalLandingURL')
   3228 
   3229     def GetEVEAcademyLandingPageURL(self):
   3230         return self.machoNet.GetGlobalConfig().get('AcademyLandingPageURL', 'https://www.eveonline.com/now/eve-academy')
   3231 
   3232     def OpenEVEAcademyLandingPage(self):
   3233         try:
   3234             EVEAcademyLandingURL = self.GetEVEAcademyLandingPageURL()
   3235             blue.os.ShellExecute(EVEAcademyLandingURL)
   3236         except Exception:
   3237             LogException('Failed to open URL to access EVE Academy landing page')
   3238             raise UserError('FailedToOpenEVEAcademyLandingURL')
   3239 
   3240     def GetCSMCandidateInfoURL(self):
   3241         return self.machoNet.GetGlobalConfig().get('CSMCandidateInfoURL', 'https://www.eveonline.com/news/view/csm-17-meet-your-candidates')
   3242 
   3243     def OpenCSMCandidateInfo(self):
   3244         try:
   3245             CSMCandidateInfoURL = self.GetCSMCandidateInfoURL()
   3246             blue.os.ShellExecute(CSMCandidateInfoURL)
   3247         except Exception:
   3248             LogException('Failed to open URL to access CSM Candidate Info')
   3249             raise UserError('FailedToOpenCSMVotingURL')
   3250 
   3251     def GetUprisingPatchNotesURL(self):
   3252         return self.machoNet.GetGlobalConfig().get('UprisingPatchNotesURL', 'https://www.eveonline.com/news/view/patch-notes-version-20-10')
   3253 
   3254     def OpenUprisingPatchNotes(self):
   3255         try:
   3256             UprisingPatchNotesURL = self.GetUprisingPatchNotesURL()
   3257             blue.os.ShellExecute(UprisingPatchNotesURL)
   3258         except Exception:
   3259             LogException('Failed to open URL to access Uprising Patch Notes')
   3260             raise UserError('FailedToOpenUprisingPatchNotesURL')