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

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