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()