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

communityprogressbar.py (9440B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\seasons\client\vanguardnemesis\communityprogressbar.py
      2 import eveicon
      3 import logging
      4 import uthread2
      5 from carbon.common.script.sys.serviceConst import ROLE_QA
      6 from carbonui import Align, TextAlign, uiconst
      7 from carbonui.text.styles import TextHeadline, TextHeader, TextBody
      8 from carbonui.button.group import AxisAlignment, Density, ButtonGroup, ButtonSizeMode
      9 from carbonui.control.button import Button
     10 from carbonui.control.contextMenu.menuData import MenuData
     11 from carbonui.primitives.container import Container
     12 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     13 from carbonui.primitives.sprite import Sprite
     14 from carbonui.uianimations import animations
     15 from communitytracks.client.api.repository import get_repository
     16 from communitytracks.client.api.signal import on_community_track_completed
     17 from communitytracks.client.data.instance_identifier import InstanceIdentifier
     18 from communitytracks.common.const import LOGGER_NAME, VANGUARD_NEMESIS_INSTANCE_ID
     19 from eve.client.script.ui import eveColor
     20 from eve.client.script.ui.control.eveLoadingWheel import LoadingWheel
     21 from eve.client.script.ui.control.gaugeCircular import GaugeCircular
     22 from eve.client.script.ui.control.infoIcon import InfoGlyphIcon
     23 from player_messaging.client.ui_message import message_player
     24 from eve.client.script.ui.shared.mapView.mapViewUtil import OpenMap
     25 from localization import GetByLabel
     26 from publicGateway.grpc.exceptions import GenericException
     27 from seasons.client.seasonprogressbar import CURRENT_POINTS_COLOR, CURRENT_POINTS_ICON_COLOR, CURRENT_POINTS_ICON_SIZE, CURRENT_POINTS_LABEL_COLOR
     28 from stackless_response_router.exceptions import TimeoutException
     29 logger = logging.getLogger(LOGGER_NAME)
     30 
     31 class CommunityProgressBar(Container):
     32     GAUGE_SIZE = 77
     33     POLL_INTERVAL = 30.0
     34 
     35     def __init__(self, *args, **kwargs):
     36         super(CommunityProgressBar, self).__init__(*args, **kwargs)
     37         self._update_thread = None
     38         self._polling_thread = None
     39         self.construct_layout()
     40         self.update()
     41         self.connect_signals()
     42         self.start_polling()
     43 
     44     def Close(self):
     45         try:
     46             self.kill_update_thread()
     47             self.kill_polling_thread()
     48             self.disconnect_signals()
     49         finally:
     50             super(CommunityProgressBar, self).Close()
     51 
     52     def kill_update_thread(self):
     53         if self._update_thread is not None:
     54             self._update_thread.kill()
     55             self._update_thread = None
     56 
     57     def kill_polling_thread(self):
     58         if self._polling_thread is not None:
     59             self._polling_thread.kill()
     60             self._polling_thread = None
     61 
     62     def connect_signals(self):
     63         on_community_track_completed.connect(self.on_community_track_completed)
     64 
     65     def disconnect_signals(self):
     66         on_community_track_completed.disconnect(self.on_community_track_completed)
     67 
     68     def construct_layout(self):
     69         self.construct_containers()
     70         self.construct_loading_wheel()
     71         self.construct_header()
     72         self.construct_body()
     73 
     74     def construct_containers(self):
     75         self.loading_container = Container(name='loading_container', parent=self)
     76         self.content_container = Container(name='content_container', parent=self, opacity=0.0)
     77 
     78     def construct_loading_wheel(self):
     79         self.loading_wheel = LoadingWheel(name='loading_wheel', parent=self.loading_container, align=Align.CENTER)
     80 
     81     def construct_header(self):
     82         header_container = Container(name='points_container', parent=self.content_container, align=Align.TOTOP, height=84)
     83         header_text_container = Container(name='header_text_container', parent=header_container, align=Align.TOTOP, height=24)
     84         TextHeader(name='points_header_label', parent=header_text_container, align=Align.TOLEFT, text=GetByLabel('UI/Agency/Seasons/VanguardNemesis/VanguardPoints'), color=CURRENT_POINTS_LABEL_COLOR)
     85         info_icon_container = Container(name='info_icon_container', parent=header_text_container, align=Align.TOLEFT, width=16, padLeft=8)
     86         InfoGlyphIcon(name='info_icon', parent=info_icon_container, align=Align.CENTERLEFT, hint=GetByLabel('UI/Agency/Seasons/VanguardNemesis/InfoHint'))
     87         amount_container = Container(name='amount_container', parent=header_container, align=Align.TOBOTTOM, height=CURRENT_POINTS_ICON_SIZE)
     88         Sprite(name='points_icon', parent=amount_container, align=Align.TOLEFT, texturePath='res:/UI/Texture/classes/Seasons/eventIcon_64x64.png', color=CURRENT_POINTS_ICON_COLOR, pos=(0,
     89          0,
     90          CURRENT_POINTS_ICON_SIZE,
     91          CURRENT_POINTS_ICON_SIZE))
     92         points_label_container = ContainerAutoSize(name='points_label_container', parent=amount_container, align=Align.TOLEFT, padLeft=2)
     93         self.points_label = TextHeadline(name='points_label', parent=points_label_container, align=Align.CENTERLEFT, color=CURRENT_POINTS_COLOR)
     94         repeatable_label_container = ContainerAutoSize(name='repeatable_label_container', parent=amount_container, align=Align.TOLEFT, padLeft=8)
     95         TextBody(name='repeatable_label', parent=repeatable_label_container, align=Align.CENTERLEFT, text=GetByLabel('UI/Common/Repeatable'), color=CURRENT_POINTS_LABEL_COLOR)
     96 
     97     def construct_body(self):
     98         body_container = Container(name='body_container', parent=self.content_container, align=Align.TOBOTTOM, height=self.GAUGE_SIZE, padBottom=24)
     99         gauge_container = Container(name='gauge_container', parent=body_container, align=Align.TOLEFT, width=self.GAUGE_SIZE, height=self.GAUGE_SIZE)
    100         Sprite(name='vanguard_logo', parent=gauge_container, align=Align.CENTER, state=uiconst.UI_DISABLED, texturePath='res:/UI/Texture/classes/Seasons/VanguardNemesis/vanguard_icon_28px.png', pos=(0, 0, 28, 28))
    101         self.gauge = GaugeCircular(name='gauge', parent=gauge_container, align=Align.CENTER, radius=self.GAUGE_SIZE * 0.5, colorStart=eveColor.CRYO_BLUE, colorEnd=eveColor.CRYO_BLUE, colorMarker=eveColor.TUNGSTEN_GREY, glow=True)
    102         self.gauge.GetMenu = self.get_gauge_menu
    103         convoy_container = ContainerAutoSize(name='convoy_container', parent=body_container, align=Align.VERTICALLY_CENTERED, padLeft=24)
    104         self.convoys_label = TextHeader(name='convoys_label', parent=convoy_container, align=Align.TOTOP, textAlign=TextAlign.LEFT)
    105         button_group = ButtonGroup(parent=convoy_container, align=Align.TOTOP, button_alignment=AxisAlignment.START, button_size_mode=ButtonSizeMode.DYNAMIC, density=Density.COMPACT, padTop=8)
    106         Button(name='map_button', parent=button_group, label=GetByLabel('UI/Commands/ShowLocationOnMap'), texturePath=eveicon.open_window, func=self.on_map_button)
    107 
    108     def get_gauge_menu(self, *args):
    109         menu = MenuData()
    110         if not session.role & ROLE_QA:
    111             return menu
    112         track_instance, track_definition = self.get_track_instance_and_definition()
    113         if not track_instance or not track_definition:
    114             return menu
    115         menu.AddEntry(text='QA Progress points: %d of %d' % (track_instance.progress, track_definition.goal))
    116         return menu
    117 
    118     def update(self):
    119         self.kill_update_thread()
    120         self._update_thread = uthread2.start_tasklet(self.update_async)
    121 
    122     def update_async(self):
    123         track_instance, track_definition = self.get_track_instance_and_definition()
    124         if not track_instance or not track_definition:
    125             return
    126         progress_ratio = float(track_instance.progress) / float(track_definition.goal)
    127         self.points_label.text = '%d%%' % (progress_ratio * 100.0)
    128         self.gauge.SetValue(progress_ratio)
    129         active_tales = []
    130         for tale_template_id in track_definition.tale_templates:
    131             active_tales.extend(sm.GetService('tale').get_active_tales_by_template_id(tale_template_id))
    132 
    133         self.convoys_label.text = GetByLabel('UI/Agency/Seasons/VanguardNemesis/ActiveConvoys', amount=len(active_tales))
    134         animations.FadeOut(self.loading_wheel)
    135         animations.FadeIn(self.content_container)
    136 
    137     def get_track_instance_and_definition(self):
    138         try:
    139             repo = get_repository()
    140             instance_id = InstanceIdentifier(sequential=VANGUARD_NEMESIS_INSTANCE_ID)
    141             track_instance = repo.get_instance_attributes(instance_id=instance_id, force_refresh=True)
    142             if not track_instance:
    143                 logger.error('Unable to get community track instance')
    144                 return (None, None)
    145             track_definition = repo.get_definition_attributes(definition_id=track_instance.definition_identifier)
    146             if not track_definition:
    147                 logger.error('Unable to get community track definition')
    148                 return (None, None)
    149             return (track_instance, track_definition)
    150         except (GenericException, TimeoutException):
    151             message_player(GetByLabel('UI/Common/CannotConnectToServer'))
    152             return (None, None)
    153 
    154     def on_community_track_completed(self, instance_id):
    155         if instance_id.sequential == VANGUARD_NEMESIS_INSTANCE_ID:
    156             self.update()
    157 
    158     def on_map_button(self, *args):
    159         pass
    160 
    161     def start_polling(self):
    162         self.kill_polling_thread()
    163         self._polling_thread = uthread2.start_tasklet(self.poll_async)
    164 
    165     def poll_async(self):
    166         while not self.destroyed:
    167             uthread2.sleep(self.POLL_INTERVAL)
    168             self.update()