home_page_section.py (8999B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\jobboard\client\features\campaigns\home_page_section.py 2 import math 3 import carbonui 4 import carbonui.const as uiconst 5 import eveicon 6 import eveui 7 import uthread2 8 from campaigns.client.ui_controllers.campaign_controller import CampaignController 9 from carbonui import Align, TextColor 10 from carbonui.primitives.container import Container 11 from carbonui.primitives.containerAutoSize import ContainerAutoSize 12 from carbonui.primitives.gridcontainer import GridContainer 13 from carbonui.primitives.sprite import Sprite 14 from carbonui.text.styles import TextHeader, TextBody 15 from carbonui.uianimations import animations 16 from eve.client.script.ui.control.eveLoadingWheel import LoadingWheel 17 from eve.client.script.ui.shared.theatersOfWar.campaigns.campaign_sets import CURRENT_CAMPAIGN_SET, camapaign_sets 18 from jobboard.client import get_job_board_service, ProviderType 19 from jobboard.client.features.campaigns.content_card import CampaignCard, CampaignCardController 20 from localization import GetByLabel 21 from locks import TempLock 22 from metadata import ContentTags 23 24 class CampaignsHomePageSection(ContainerAutoSize): 25 default_alignMode = Align.TOTOP 26 default_minHeight = 220 27 28 def __init__(self, show_view_all = True, **kw): 29 self._campaign_section_controller = CampaignSectionController() 30 self._show_view_all = show_view_all 31 super(CampaignsHomePageSection, self).__init__(**kw) 32 self._reconstructing = False 33 self.provider = get_job_board_service().get_provider(ProviderType.CAMPAIGNS) 34 self.content = ContainerAutoSize(name='content', parent=self, align=Align.TOTOP, alignMode=Align.TOTOP, minHeight=220) 35 self.underlay = Container(name='underlay', parent=self, align=Align.TOTOP_NOPUSH, height=30) 36 self.reconstruct_layout() 37 self._register() 38 39 def Close(self): 40 super(CampaignsHomePageSection, self).Close() 41 self._unregister() 42 43 def _register(self): 44 self.on_size_changed.connect(self._on_size_changed) 45 46 def _unregister(self): 47 self.on_size_changed.disconnect(self._on_size_changed) 48 49 def _on_cache_invalidated(self): 50 self._campaign_section_controller.invalidate_cache() 51 self.reconstruct_layout() 52 53 def reconstruct_layout(self): 54 if self._reconstructing: 55 return 56 self.content.Flush() 57 self.construct_layout() 58 59 def _on_size_changed(self, width, height): 60 if width > 600: 61 self.campaign_cont.cardMaxWidth = 350 62 else: 63 self.campaign_cont.cardMaxWidth = 410 64 self.underlay.height = height 65 66 def construct_layout(self): 67 self.construct_error_state() 68 self.top_cont = Container(name='top_cont', align=Align.TOTOP, parent=self.content, height=28, padBottom=8) 69 self.campaign_cont = GridContainer(name='campaign_cont', parent=self.content, align=uiconst.TOTOP, height=200, contentSpacing=(16, 8), columns=2) 70 self.construct_top_cont() 71 self._loading_wheel = LoadingWheel(parent=self, align=Align.CENTER) 72 uthread2.start_tasklet(self._construct_layout_thread) 73 74 def _construct_layout_thread(self): 75 if self._reconstructing: 76 return 77 campaigns_installed = 0 78 try: 79 self._reconstructing = True 80 animations.FadeIn(self._loading_wheel, endVal=1.0, duration=0.1) 81 animations.FadeOut(self.content, duration=0.1) 82 animations.FadeOut(self._error_label, duration=0.1) 83 campaigns_installed += self.construct_campaigns_cont() 84 except Exception as e: 85 animations.FadeIn(self._error_label, endVal=0.1, duration=0.1) 86 raise 87 finally: 88 self._reconstructing = False 89 animations.FadeOut(self._loading_wheel, duration=0.1) 90 animations.FadeIn(self.content, endVal=1.0, duration=0.1) 91 if campaigns_installed == 0: 92 animations.FadeIn(self._error_label, endVal=1, duration=0.1) 93 94 self._update_height_for_grid(self.campaign_cont) 95 96 def _update_height_for_grid(self, grid_container): 97 num_children = len(grid_container.children) 98 num_cols = grid_container.columns 99 num_rows = int(math.ceil(num_children / float(num_cols))) 100 max_height_for_row = 0 101 total_height = 0 102 for i, child in enumerate(grid_container.children): 103 is_first_column = i % num_cols == 0 104 if is_first_column: 105 total_height += max_height_for_row 106 max_height_for_row = 0 107 max_height_for_row = max(max_height_for_row, child.height) 108 109 total_height += max_height_for_row 110 total_height += max(0, (num_rows - 1) * grid_container.contentSpacing[1]) 111 grid_container.height = total_height 112 113 def construct_top_cont(self): 114 campaign_set_info = camapaign_sets[CURRENT_CAMPAIGN_SET] 115 headerText = GetByLabel(campaign_set_info.header_path) 116 if self._show_view_all: 117 view_all_container = ContainerAutoSize(parent=self.top_cont, name='view_all_button_container', align=Align.TORIGHT, padLeft=8) 118 eveui.Button(parent=view_all_container, state=eveui.State.normal, align=Align.CENTERRIGHT, variant=carbonui.ButtonVariant.GHOST, density=carbonui.Density.COMPACT, label=GetByLabel('UI/Generic/ViewAll'), func=self._on_view_all_clicked) 119 icon_container = Container(parent=self.top_cont, align=Align.TOLEFT, width=16, padRight=8) 120 Sprite(parent=icon_container, align=Align.CENTERLEFT, texturePath=eveicon.map_fw, height=16, width=16, color=TextColor.NORMAL) 121 label_container = ContainerAutoSize(parent=self.top_cont, align=Align.TOLEFT, alignMode=Align.CENTERLEFT) 122 TextHeader(parent=label_container, align=Align.CENTERLEFT, maxLines=1, color=TextColor.NORMAL, text=headerText) 123 124 def _on_view_all_clicked(self, *args, **kwargs): 125 get_job_board_service().open_subfeature_page(content_tag_id=ContentTags.feature_campaigns) 126 127 def construct_error_state(self): 128 self._error_label = TextBody(parent=self.content, name='error_label', align=Align.CENTER, text=GetByLabel('UI/Campaigns/NoCampaignsFound')) 129 130 def construct_campaigns_cont(self): 131 campaign_card_controllers = self._campaign_section_controller.get_campaign_card_controllers() 132 for c in campaign_card_controllers: 133 CampaignCard(parent=self.campaign_cont, controller=c, height=176, align=Align.TOTOP) 134 135 return len(campaign_card_controllers) 136 137 138 class CampaignSectionController(object): 139 140 def __init__(self): 141 self._is_initialized = False 142 self._campaign_controllers_by_id = {} 143 self._campaigns_card_controllers_by_id = None 144 self._repository = None 145 146 @property 147 def repository(self): 148 if self._repository is None: 149 from campaigns.client.api import get_campaigns_repository_v1 150 self._repository = get_campaigns_repository_v1() 151 return self._repository 152 153 @property 154 def campaign_controllers_by_id(self): 155 self._prime_campaign_data() 156 return self._campaign_controllers_by_id 157 158 @property 159 def campaigns_card_controllers_by_id(self): 160 self._prime_campaign_data() 161 return self._campaigns_card_controllers_by_id 162 163 def _prime_campaign_data(self): 164 if self._is_initialized: 165 return 166 with TempLock('CampaignSectionController._prime_campaign_data'): 167 if self._is_initialized: 168 return 169 campaign_controllers_by_id = {} 170 campaigns_card_controllers_by_id = {} 171 current_campaigns_by_id = self.repository.get_data_for_all_current_campaigns() 172 for c_id, campaign in current_campaigns_by_id.items(): 173 campaign_controller = CampaignController(campaign, self.repository) 174 campaign_controllers_by_id[c_id] = campaign_controller 175 controller = CampaignCardController(campaign_controller) 176 campaigns_card_controllers_by_id[c_id] = controller 177 178 self._campaign_controllers_by_id = campaign_controllers_by_id 179 self._campaigns_card_controllers_by_id = campaigns_card_controllers_by_id 180 self._is_initialized = True 181 182 def get_campaign_card_controllers(self): 183 current_set = CURRENT_CAMPAIGN_SET 184 ret = [] 185 for card_controller in self.campaigns_card_controllers_by_id.values(): 186 if card_controller.campaign_controller.campaign_set_name != current_set: 187 continue 188 if card_controller.is_expired: 189 continue 190 ret.append(card_controller) 191 192 ret.sort(key=lambda x: x.campaign_controller.ui_idx) 193 return ret 194 195 def get_campaign(self, campaign_id): 196 return self.campaign_controllers_by_id.get(campaign_id, None) 197 198 def invalidate_cache(self): 199 self._is_initialized = False