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

fleetBroadcastCont.py (11419B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fleet\fleetBroadcastCont.py
      2 import math
      3 import evefleet
      4 import eveicon
      5 import localization
      6 from carbonui import const as uiconst, TextColor
      7 from carbonui.button.menu import MenuButtonIcon
      8 from carbonui.control.buttonIcon import ButtonIcon
      9 from carbonui.control.contextMenu.menuData import MenuData
     10 from carbonui.primitives.container import Container
     11 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     12 from carbonui.primitives.sprite import Sprite
     13 from carbonui.uianimations import animations
     14 from carbonui.uicore import uicore
     15 from carbonui.window.segment.underlay import WindowSegmentUnderlay
     16 from clientsettings.setting import CharSettingBool
     17 from eve.client.script.ui.control import eveIcon, eveLabel
     18 from eve.client.script.ui.shared.fleet import fleetBroadcastConst, fleetbroadcastexports
     19 from eve.client.script.ui.shared.fleet.fleetBroadcastConst import broadcastButtonIDs
     20 from eve.client.script.ui.shared.fleet.fleetbroadcastexports import fleetBroadcastScopeSetting
     21 from eve.client.script.ui.shared.fleet.fleetConst import FLEET_BROADCASTS_VISIBLE_SETTING
     22 from eve.client.script.ui.shared.pointerTool import pointerToolConst as pConst
     23 from eve.common.script.sys.idCheckers import IsUniverseCelestial
     24 ICONS_BY_SCOPE = {evefleet.BROADCAST_DOWN: 'res:/UI/Texture/Icons/73_16_28.png',
     25  evefleet.BROADCAST_UP: 'res:/UI/Texture/Icons/73_16_27.png',
     26  evefleet.BROADCAST_ALL: 'res:/UI/Texture/Icons/73_16_29.png'}
     27 uniqueUINameByBroadcastID = {evefleet.BROADCAST_HEAL_ARMOR: pConst.UNIQUE_NAME_BROADCAST_ARMOR,
     28  evefleet.BROADCAST_HEAL_SHIELD: pConst.UNIQUE_NAME_BROADCAST_SHIELD}
     29 ICONSIZE_SMALL = 16
     30 ICONSIZE_LARGE = 32
     31 THRESHOLD_WIDTH = 330
     32 
     33 class FleetBroadcastCont(ContainerAutoSize):
     34     __notifyevents__ = ['OnFleetBroadcast_Local', 'OnBroadcastScopeChange']
     35 
     36     def ApplyAttributes(self, attributes):
     37         super(FleetBroadcastCont, self).ApplyAttributes(attributes)
     38         sm.RegisterNotify(self)
     39         innerPadding = attributes.innerPadding
     40         self.lastBroadcast = None
     41         self.iconSize = None
     42         WindowSegmentUnderlay(name='bgFill', bgParent=self)
     43         self.mainCont = ContainerAutoSize(name='mainCont', parent=self, align=uiconst.TOTOP)
     44         self.lastBroadcastCont = Container(name='lastBroadcastCont', parent=self.mainCont, align=uiconst.TOTOP, state=uiconst.UI_NORMAL, height=18)
     45         self.buttonCont = Container(name='broadcastButtonCont', parent=self.mainCont, align=uiconst.TOTOP, padTop=4, uniqueUiName=pConst.UNIQUE_NAME_FLEET_BROADCAST_ICONS)
     46         self.toggleButton = ButtonIcon(name='broadcastExpanderIcon', parent=self.lastBroadcastCont, align=uiconst.CENTERRIGHT, pos=(0, 0, 16, 16), iconSize=7, texturePath='res:/UI/Texture/classes/Neocom/arrowUp.png', func=self.ToggleBroadcasts, uniqueUiName=pConst.UNIQUE_NAME_FLEET_SHOW_BROADCASTS)
     47         self.ConstructLastBroadcastBanner()
     48         self.UpdateBroadcastButtonState()
     49         self.SetInnerPadding(innerPadding)
     50 
     51     def ReconstructBroadcastButtons(self):
     52         self.buttonCont.Flush()
     53         self.buttonCont.height = self.iconSize
     54         settingBtn = MenuButtonIcon(parent=self.buttonCont, align=uiconst.CENTERRIGHT, width=24, height=24, iconSize=16, texturePath=eveicon.settings, get_menu_func=self._GetBroadcastBtnSettings, hint=localization.GetByLabel('UI/Common/Settings'))
     55         self.scopeSprite = Sprite(parent=self.buttonCont, align=uiconst.CENTERRIGHT, pos=(28, 0, 16, 16), uniqueUiName=pConst.UNIQUE_NAME_FLEET_BROADCAST_SCOPE, func=self.CycleBroadcastScope)
     56         self.UpdateScopeButton()
     57         for i, broadcastID in enumerate(broadcastButtonIDs):
     58             iconSetting = CharSettingBool('fleet_broadcast_icon_settings_%s' % broadcastID, True)
     59             isVisbile = iconSetting.get()
     60             if isVisbile:
     61                 self.ConstructBroadcastButton(broadcastID)
     62 
     63     def _GetBroadcastBtnSettings(self):
     64         menuData = MenuData()
     65         menuData.AddLabel(localization.GetByLabel('UI/Fleet/FleetBroadcast/BroadcastButtonsToDisplay'))
     66         for i, broadcastID in enumerate(broadcastButtonIDs):
     67             iconSetting = CharSettingBool('fleet_broadcast_icon_settings_%s' % broadcastID, True)
     68             iconSetting.on_change.connect(self.OnBroadcastIconChanged)
     69             menuData.AddCheckbox(text=fleetbroadcastexports.GetBroadcastName(broadcastID), setting=iconSetting)
     70 
     71         menuData.AddSeparator()
     72         menuData.AddLabel(localization.GetByLabel('UI/Fleet/FleetBroadcast/WhoReceivesBroadcasts'))
     73         for scopeID in [evefleet.BROADCAST_ALL, evefleet.BROADCAST_DOWN, evefleet.BROADCAST_UP]:
     74             menuData.AddRadioButton(fleetbroadcastexports.GetBroadcastScopeName(scopeID), scopeID, fleetBroadcastScopeSetting)
     75 
     76         return menuData
     77 
     78     def OnBroadcastIconChanged(self, *args):
     79         w, h = self.GetAbsoluteSize()
     80         if w:
     81             self.iconSize = self._GetButtonIconSize(w)
     82         self.ReconstructBroadcastButtons()
     83 
     84     def _GetButtonIconSize(self, width):
     85         numIcons = 0
     86         for broadcastID in broadcastButtonIDs:
     87             iconSetting = CharSettingBool('fleet_broadcast_icon_settings_%s' % broadcastID, True)
     88             if iconSetting.get():
     89                 numIcons += 1
     90 
     91         totalLargeWidth = numIcons * (ICONSIZE_LARGE + 8)
     92         totalSpaceNeeded = totalLargeWidth + 50
     93         if numIcons and width > totalSpaceNeeded:
     94             return ICONSIZE_LARGE
     95         else:
     96             return ICONSIZE_SMALL
     97 
     98     def ConstructBroadcastButton(self, broadcastID):
     99         BroadcastButton(parent=self.buttonCont, align=uiconst.TOLEFT, padRight=4 if self.iconSize == ICONSIZE_LARGE else 8, width=self.iconSize, iconSize=self.iconSize, height=0, hint=fleetbroadcastexports.GetBroadcastName(broadcastID), broadcastID=broadcastID, texturePath=self._GetBroadcastIcon(broadcastID), func=lambda *args: sm.GetService('fleet').SendBroadcast(broadcastID), uniqueUiName=uniqueUINameByBroadcastID.get(broadcastID, None))
    100 
    101     def _GetBroadcastIcon(self, broadcastID):
    102         if self.iconSize == ICONSIZE_SMALL:
    103             return fleetBroadcastConst.iconsByBroadcastType[broadcastID]
    104         else:
    105             return fleetBroadcastConst.iconsLargeByBroadcastType[broadcastID]
    106 
    107     def ToggleBroadcasts(self, *args):
    108         FLEET_BROADCASTS_VISIBLE_SETTING.toggle()
    109         self.UpdateBroadcastButtonState()
    110 
    111     def UpdateBroadcastButtonState(self):
    112         if FLEET_BROADCASTS_VISIBLE_SETTING.is_enabled():
    113             self.buttonCont.Hide()
    114             self.toggleButton.SetRotation(0)
    115         else:
    116             self.buttonCont.Show()
    117             self.toggleButton.SetRotation(math.pi)
    118 
    119     def SetInnerPadding(self, padding):
    120         self.mainCont.padding = padding
    121 
    122     def ConstructLastBroadcastBanner(self):
    123         lastBroadcastBanner = Container(name='lastBroadcastBanner', parent=self.lastBroadcastCont, state=uiconst.UI_NORMAL)
    124         lastBroadcastBanner.GetMenu = self.GetLastBroadcastMenu
    125         lastBroadcastBanner.OnClick = self.OnLastBroadcastClick
    126         lastBroadcastBanner.GetHint = self.GetLastBroadcastHint
    127         self.bannerIcon = eveIcon.Sprite(name='bannerIcon', parent=lastBroadcastBanner, align=uiconst.CENTERLEFT, pos=(4, 0, 16, 16), state=uiconst.UI_DISABLED, texturePath='res:/UI/Texture/Icons/44_32_29.png', color=TextColor.NORMAL)
    128         self.bannerLabel = eveLabel.EveLabelMedium(name='bannerLabel', text=localization.GetByLabel('UI/Fleet/FleetBroadcast/NoBroadcasts'), parent=lastBroadcastBanner, align=uiconst.CENTERLEFT, left=26, autoFadeSides=32)
    129 
    130     def GetLastBroadcastHint(self):
    131         if not self.lastBroadcast:
    132             return None
    133         member = sm.GetService('fleet').GetMemberInfo(int(self.lastBroadcast.charID))
    134         if member:
    135             rank_name = fleetbroadcastexports.GetRankName(member)
    136         else:
    137             rank_name = localization.GetByLabel('UI/Fleet/Ranks/FleetMember')
    138         scope_name = fleetbroadcastexports.GetBroadcastScopeName(self.lastBroadcast.scope, self.lastBroadcast.where)
    139         return localization.GetByLabel('UI/Fleet/FleetBroadcast/BroadcastNotificationHint', eventLabel=self.lastBroadcast.broadcastLabel, time=self.lastBroadcast.time, charID=self.lastBroadcast.charID, range=scope_name, role=rank_name)
    140 
    141     def CycleBroadcastScope(self, *args):
    142         sm.GetService('fleet').CycleBroadcastScope()
    143 
    144     def GetLastBroadcastMenu(self):
    145         if not self.lastBroadcast:
    146             return
    147         m = []
    148         func = fleetbroadcastexports.GetMenuFunc(self.lastBroadcast.name)
    149         if func:
    150             args = (self.lastBroadcast.charID, self.lastBroadcast.solarSystemID, self.lastBroadcast.itemID)
    151             if getattr(self.lastBroadcast, 'typeID', None):
    152                 args += (self.lastBroadcast.typeID,)
    153             m = func(*args)
    154             m += [None]
    155         m += fleetbroadcastexports.GetMenu_Member(self.lastBroadcast.charID)
    156         m += [None]
    157         m += fleetbroadcastexports.GetMenu_Ignore(self.lastBroadcast.name)
    158         return m
    159 
    160     def UpdateScopeButton(self):
    161         scope = sm.GetService('fleet').broadcastScope
    162         self.scopeSprite.hint = localization.GetByLabel('UI/Fleet/FleetBroadcast/BroadcastScopeHint', scope=fleetbroadcastexports.GetBroadcastScopeName(scope))
    163         texturePath = ICONS_BY_SCOPE.get(scope, 'res:/UI/Texture/Icons/73_16_28.png')
    164         self.scopeSprite.SetTexturePath(texturePath)
    165 
    166     def OnLastBroadcastClick(self):
    167         if not uicore.uilib.Key(uiconst.VK_CONTROL) or self.lastBroadcast.itemID == session.shipid or session.shipid is None or self.lastBroadcast.itemID is None or IsUniverseCelestial(self.lastBroadcast.itemID):
    168             return
    169         itemID = self.lastBroadcast.itemID
    170         if sm.GetService('target').IsInTargetingRange(itemID):
    171             sm.GetService('target').TryLockTarget(itemID)
    172 
    173     def OnFleetBroadcast_Local(self, broadcast):
    174         self.lastBroadcast = broadcast
    175         self.bannerLabel.text = self.lastBroadcast.broadcastLabel
    176         texturePath = fleetBroadcastConst.iconsByBroadcastType.get(self.lastBroadcast.name, 'res:/UI/Texture/Icons/44_32_29.png')
    177         self.bannerIcon.SetTexturePath(texturePath)
    178         animations.FadeTo(self.bannerIcon, 1.0, 0.0, duration=0.7, loops=3, curveType=uiconst.ANIM_WAVE)
    179 
    180     def OnBroadcastScopeChange(self):
    181         self.UpdateScopeButton()
    182 
    183     def _OnSizeChange_NoBlock(self, width, height):
    184         oldIconSize = self.iconSize
    185         self.iconSize = self._GetButtonIconSize(width)
    186         if self.iconSize != oldIconSize:
    187             self.ReconstructBroadcastButtons()
    188 
    189 
    190 class BroadcastButton(ButtonIcon):
    191 
    192     def ApplyAttributes(self, attributes):
    193         super(BroadcastButton, self).ApplyAttributes(attributes)
    194         self.broadcastID = attributes.broadcastID
    195 
    196     def LoadTooltipPanel(self, tooltipPanel, *args):
    197         if not self.broadcastID:
    198             return
    199         cmdName = 'CmdFleetBroadcast_%s' % self.broadcastID
    200         cmd = uicore.cmd.commandMap.GetCommandByName(cmdName)
    201         shortcutStr = cmd.GetShortcutAsString()
    202         tooltipPanel.LoadGeneric3ColumnTemplate()
    203         tooltipPanel.AddLabelMedium(text=self.hint, cellPadding=(0, 0, 7, 0), colSpan=tooltipPanel.columns - 1, width=200, autoFitToText=True)
    204         if shortcutStr:
    205             tooltipPanel.AddShortcutCell(shortcutStr)
    206         else:
    207             tooltipPanel.AddCell()