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

home_page.py (9165B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\jobboard\client\ui\pages\home_page.py
      2 import carbonui
      3 import carbonui.text.styles
      4 import eveicon
      5 import eveui
      6 import localization
      7 import uthread2
      8 from carbonui import Align
      9 from eve.client.script.ui.shared.agencyNew.contentGroups import contentGroupConst
     10 from eve.client.script.ui.shared.agencyNew.ui.agencyWnd import AgencyWndNew
     11 from jobboard.client import get_job_board_service, job_board_signals
     12 from jobboard.client.features.campaigns.home_page_section import CampaignsHomePageSection
     13 from jobboard.client.features.daily_goals.home_page_section import DailyGoalsHomePageSection
     14 from jobboard.client.features.freelance_projects.home_page_section import FreelanceProjectsHomePageSection
     15 from jobboard.client.features.seasons.home_page_section import SeasonHomePageSection
     16 from jobboard.client.provider_type import ProviderType
     17 from jobboard.client.ui.adverts import FeatureAdvert, CorpProjectsAdvert, FactionalWarfareEnlistmentAdvert, MercenaryTacticalOperationsAdvert
     18 from jobboard.client.ui.analytics import ANALYTICS_OPEN_AGENCY_HOMEFRONT, ANALYTICS_OPEN_AGENCY_MISSIONS
     19 from jobboard.client.ui.card_section import FeatureCardSection
     20 from jobboard.client.ui.career_path_section import CareerPathSection
     21 from jobboard.client.ui.pages.base_page import BasePage
     22 from metadata.common.content_tags import get_content_tags_as_objects
     23 
     24 class HomePage(BasePage):
     25     __notifyevents__ = ['OnSessionChanged']
     26 
     27     def __init__(self, window_controller, **kwargs):
     28         self._window_controller = window_controller
     29         super(HomePage, self).__init__(**kwargs)
     30         self._update_search_section()
     31 
     32     def _register(self):
     33         sm.RegisterNotify(self)
     34         super(HomePage, self)._register()
     35         job_board_signals.on_content_tag_count_updated.connect(self._on_content_tag_count_updated)
     36         job_board_signals.on_job_provider_state_changed.connect(self._on_job_provider_state_changed)
     37 
     38     def _unregister(self):
     39         sm.UnregisterNotify(self)
     40         super(HomePage, self)._unregister()
     41         job_board_signals.on_content_tag_count_updated.disconnect(self._on_content_tag_count_updated)
     42         job_board_signals.on_job_provider_state_changed.disconnect(self._on_job_provider_state_changed)
     43 
     44     def _on_job_provider_state_changed(self, provider):
     45         if provider.PROVIDER_ID == ProviderType.DAILY_GOALS:
     46             self._header_container.Flush()
     47             self._construct_header()
     48 
     49     @uthread2.debounce(0.2)
     50     def _on_content_tag_count_updated(self):
     51         self._update_search_section()
     52 
     53     def _update_search_section(self):
     54         jobs = self._service.get_available_jobs()
     55         self._search_section.update(len(jobs), get_content_tags_as_objects(self._service.get_available_content_tags()))
     56 
     57     def _construct_header(self):
     58         provider = get_job_board_service().get_provider(ProviderType.DAILY_GOALS)
     59         if not provider.is_hidden:
     60             DailyGoalsHomePageSection(parent=self._header_container, align=Align.TOTOP, padBottom=16)
     61 
     62     def _construct_filters(self):
     63         self._search_section = TopSearchBar(parent=self._filters_container, controller=self._window_controller.page_controller, padBottom=16)
     64 
     65     def _construct_content(self):
     66         provider = get_job_board_service().get_provider(ProviderType.CAMPAIGNS)
     67         if not provider.is_hidden:
     68             CampaignsHomePageSection(parent=self._content_container, align=Align.TOTOP, padBottom=16)
     69             uthread2.Yield()
     70         SeasonHomePageSection(parent=self._content_container, padBottom=24)
     71         uthread2.Yield()
     72         self._construct_category(provider_id=ProviderType.STORYLINES)
     73         self._construct_category(provider_id=ProviderType.ESCALATION_SITES)
     74         self._construct_category(provider_id=ProviderType.CORPORATION_GOALS)
     75         self._construct_category(provider_id=ProviderType.FREELANCE_PROJECTS, section_class=FreelanceProjectsHomePageSection)
     76         self._construct_category(provider_id=ProviderType.EPIC_ARCS)
     77         self._construct_category(provider_id=ProviderType.AGENT_MISSIONS)
     78         CareerPathSection(parent=self._content_container, padBottom=24)
     79         uthread2.Yield()
     80         self._construct_category(provider_id=ProviderType.FACTIONAL_WARFARE)
     81         self._construct_category(provider_id=ProviderType.PIRATE_INSURGENCIES)
     82         self._construct_category(provider_id=ProviderType.HOMEFRONT_OPERATIONS)
     83         self._construct_category(provider_id=ProviderType.COMBAT_ANOMALIES)
     84         self._construct_category(provider_id=ProviderType.ORE_ANOMALIES)
     85         self._construct_category(provider_id=ProviderType.ICE_BELTS)
     86         self._construct_category(provider_id=ProviderType.MERCENARY_TACTICAL_OPS)
     87         self._construct_advert(provider_id=ProviderType.CORPORATION_GOALS, section_class=CorpProjectsAdvert)
     88         self._construct_advert(provider_id=ProviderType.AGENT_MISSIONS, info={'text': localization.GetByLabel('UI/Opportunities/AgentMissionsEmpty'),
     89          'button_label': localization.GetByLabel('UI/Opportunities/OpenAgency'),
     90          'button_action': lambda *args, **kwargs: self._open_agency(contentGroupConst.contentGroupMissions),
     91          'button_analyticID': ANALYTICS_OPEN_AGENCY_MISSIONS})
     92         self._construct_advert(provider_id=ProviderType.FACTIONAL_WARFARE_ENLISTMENT, section_class=FactionalWarfareEnlistmentAdvert)
     93         self._construct_advert(provider_id=ProviderType.HOMEFRONT_OPERATIONS, info={'text': localization.GetByLabel('UI/Opportunities/DungeonsEmpty'),
     94          'button_label': localization.GetByLabel('UI/Opportunities/OpenAgency'),
     95          'button_action': lambda *args, **kwargs: self._open_agency(contentGroupConst.contentGroupHomefrontSites),
     96          'button_analyticID': ANALYTICS_OPEN_AGENCY_HOMEFRONT})
     97         self._construct_advert(ProviderType.MERCENARY_TACTICAL_OPS, section_class=MercenaryTacticalOperationsAdvert)
     98 
     99     def _construct_category(self, provider_id, section_class = FeatureCardSection):
    100         provider = get_job_board_service().get_provider(provider_id)
    101         primary_content_tag = provider.feature_tag
    102         primary_content_tag_id = primary_content_tag.id
    103         section_class(parent=self._content_container, padBottom=24, title=primary_content_tag.title, icon=primary_content_tag.icon, view_all_callback=lambda : self._view_all_category(primary_content_tag_id), hide_empty=True, content_tag_id=primary_content_tag_id, provider=provider)
    104         uthread2.Yield()
    105 
    106     def _construct_advert(self, provider_id, info = None, section_class = None):
    107         provider = get_job_board_service().get_provider(provider_id)
    108         primary_content_tag = provider.feature_tag
    109         primary_content_tag_id = primary_content_tag.id
    110         section_class = section_class or FeatureAdvert
    111         section_class(name=u'advert_{}'.format(section_class.__name__), parent=self._content_container, padBottom=24, title=primary_content_tag.title, icon=primary_content_tag.icon, view_all_callback=lambda : self._view_all_category(primary_content_tag_id), hide_empty=True, content_tag_id=primary_content_tag_id, provider=provider, info=info)
    112         uthread2.Yield()
    113 
    114     def _view_all_category(self, content_tag_id):
    115         self._service.open_browse_page(content_tag_id=content_tag_id)
    116 
    117     def _open_agency(self, content_group_id):
    118         AgencyWndNew.OpenAndShowContentGroup(contentGroupID=content_group_id)
    119 
    120 
    121 class TopSearchBar(eveui.Container):
    122     default_align = Align.TOTOP
    123     default_height = 24
    124 
    125     def __init__(self, controller, *args, **kwargs):
    126         super(TopSearchBar, self).__init__(*args, **kwargs)
    127         self._controller = controller
    128         self._available_content_tags = {}
    129         self._layout()
    130 
    131     def update(self, job_count, content_tags):
    132         self._label.text = localization.GetByLabel('UI/Opportunities/OpportunitiesAmount', amount=job_count)
    133         available_content_tags = {tag_id:tag for tag_id, tag in content_tags.iteritems()}
    134         self._available_content_tags = available_content_tags
    135 
    136     def _layout(self):
    137         self._search_field = eveui.SingleLineEditText(parent=self, align=eveui.Align.to_right, width=150, hintText=localization.GetByLabel('UI/Common/Search'), OnReturn=self._search_submitted, texturePath=eveicon.search)
    138         self._search_field.GetSuggestions = self._get_search_suggestions
    139         self._search_field.OnHistoryClick = self._search_submitted
    140         label_container = eveui.Container(parent=self, align=eveui.Align.to_all)
    141         self._label = carbonui.text.styles.TextHeader(parent=label_container, align=eveui.Align.center_left, maxLines=1, autoFadeSides=16)
    142 
    143     def _search_submitted(self, *args, **kwargs):
    144         available_tags = {tag.title:tag.id for tag in self._available_content_tags.values()}
    145         if self._search_field.text in available_tags:
    146             self._controller.add_content_tag(available_tags[self._search_field.text])
    147         else:
    148             self._controller.add_keyword(self._search_field.text)
    149         self._search_field.Clear()
    150 
    151     def _get_search_suggestions(self):
    152         return [ tag.title for tag in self._available_content_tags.values() ]