content_card.py (8942B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\jobboard\client\features\campaigns\content_card.py 2 import eveui 3 import trinity 4 import uthread2 5 from carbonui import uiconst, PickState, Align, TextColor 6 from carbonui.primitives.container import Container 7 from carbonui.primitives.fill import Fill 8 from carbonui.primitives.line import Line 9 from carbonui.primitives.sprite import Sprite 10 from carbonui.text.styles import TextDetail, TextBody, TextHeader 11 from eve.client.script.ui import eveColor, eveThemeColor 12 from eveui import skip_if_destroyed 13 from jobboard.client import get_job_board_service 14 from jobboard.client.features.campaigns.qa_tools import get_qa_menu_for_campaign_card 15 from jobboard.client.ui.card import GLOW_HOVER, GLOW_IDLE 16 from jobboard.client.ui.const import HERO_CARD_MAX_WIDTH 17 from metadata import ContentTags 18 19 class BaseContentCard(Container): 20 default_height = 176 21 default_state = uiconst.UI_NORMAL 22 default_name = 'BaseContentCard' 23 OPACITY_IDLE = 0.1 24 OPACITY_HOVER = 0.2 25 OPACITY_MOUSEDOWN = 0.4 26 27 def __init__(self, controller, *args, **kwargs): 28 super(Container, self).__init__(*args, **kwargs) 29 self.controller = controller 30 self._layout() 31 self.pickState = PickState.ON 32 uthread2.start_tasklet(self._update_state) 33 34 def _layout(self): 35 self._left_line = Line(name='leftLine', parent=self, align=Align.TOLEFT, color=self._left_line_color, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, opacity=0.6, glowBrightness=0.5) 36 self._construct_layout() 37 self._construct_top() 38 self._construct_middle() 39 self._construct_underlay() 40 41 def _construct_layout(self): 42 self.content = Container(name='content', parent=self) 43 self.underlay_cont = Container(name='underlay', parent=self) 44 self.background_cont = Container(name='background', parent=self) 45 self.top_cont = Container(name='topCont', parent=self.content, align=Align.TOTOP, height=32, padding=(16, 16, 16, 0)) 46 self.middle = Container(name='middle', parent=self.content, align=Align.TOALL, padding=16) 47 48 def _construct_top(self): 49 pass 50 51 def _construct_bottom(self): 52 pass 53 54 def _construct_underlay(self): 55 Fill(parent=self.underlay_cont, color=self.controller.bc_color, opacity=0.1) 56 self._hover_frame = eveui.Frame(name='hover_frame', parent=self, texturePath='res:/UI/Texture/classes/Opportunities/card_mask.png', cornerSize=16, color=self.controller.hover_frame_color, opacity=self.OPACITY_IDLE) 57 58 @property 59 def _left_line_color(self): 60 return self.controller.line_color 61 62 def _construct_middle(self): 63 Sprite(parent=self, pos=(0, 0, 32, 32), texturePath=self.controller.icon_path, align=Align.CENTERRIGHT) 64 TextDetail(parent=self.middle, align=Align.TOTOP, text=self.controller.title_prefix_text) 65 TextBody(parent=self.middle, align=Align.TOTOP, text=self.controller.title_text) 66 67 def OnClick(self, *args): 68 self.controller.on_click() 69 70 def _update_state(self): 71 pass 72 73 @skip_if_destroyed 74 def OnMouseEnter(self, *args): 75 eveui.Sound.entry_hover.play() 76 eveui.fade_in(self._hover_frame, end_value=self.OPACITY_HOVER, duration=0.2) 77 eveui.animate(self._left_line, 'glowBrightness', GLOW_HOVER, duration=0.2) 78 79 @skip_if_destroyed 80 def OnMouseExit(self, *args): 81 eveui.fade(self._hover_frame, end_value=self.OPACITY_IDLE, duration=0.2) 82 eveui.animate(self._left_line, 'glowBrightness', GLOW_IDLE, duration=0.2) 83 84 85 class CampaignCard(BaseContentCard): 86 default_name = 'CampaignCard' 87 OPACITY_IDLE = 0.25 88 OPACITY_HOVER = 0.05 89 OPACITY_MOUSEDOWN = 0.3 90 91 def _construct_underlay(self): 92 Fill(parent=self.underlay_cont, color=self.controller.bc_color, opacity=0.1) 93 eveui.Frame(name='card_mask_frame', bgParent=self, texturePath='res:/UI/Texture/classes/Opportunities/card_mask.png', cornerSize=16, color=(0, 0, 0, 0.9)) 94 self._hover_frame = eveui.Frame(name='hover_frame', parent=self, texturePath='res:/UI/Texture/classes/Opportunities/card_mask.png', cornerSize=16, color=eveColor.BLACK, opacity=self.OPACITY_IDLE) 95 bg_texture_path = self.controller.background_texture_path 96 if not bg_texture_path: 97 return 98 gradient_container = Container(name='gradient_container', parent=self, align=Align.TOALL, pickState=PickState.OFF, clipChildren=True) 99 bg_container = Container(name='bg_container', parent=self, align=Align.TOALL, pickState=PickState.OFF, clipChildren=True) 100 title_width, _ = TextHeader.MeasureTextSize(self.controller.title_text, bold=True, maxLines=2) 101 eveui.GradientSprite(parent=gradient_container, align=Align.TOLEFT_PROP, width=0.6, minWidth=title_width + 48, rgbData=[(0, (0, 0, 0))], alphaData=[(0, 0.9), (1.0, 0)]) 102 eveui.Sprite(name='bg_image', parent=bg_container, texturePath=bg_texture_path, textureSecondaryPath='res:/UI/Texture/classes/Opportunities/hero_card_mask.png', align=Align.CENTERRIGHT, width=HERO_CARD_MAX_WIDTH, height=self.height, spriteEffect=trinity.TR2_SFX_MODULATE) 103 104 def _construct_middle(self): 105 logo_container = Container(parent=self.middle, name='logo_container', align=Align.TORIGHT, width=64, padRight=8) 106 self.faction_logo = Sprite(name='faction_icon', parent=logo_container, align=Align.CENTERBOTTOM, width=48, height=48, color=TextColor.SECONDARY, texturePath=self.controller.icon_path, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0, pickState=PickState.OFF) 107 TextHeader(parent=self.middle, align=Align.TOBOTTOM, text=self.controller.title_text, bold=True) 108 TextDetail(parent=self.middle, align=Align.TOBOTTOM, text=self.controller.title_prefix_text) 109 110 def OnMouseEnter(self, *args): 111 super(CampaignCard, self).OnMouseEnter(*args) 112 if hasattr(self, 'faction_logo') and self.faction_logo and not self.faction_logo.destroyed: 113 eveui.animate(self.faction_logo, 'color', TextColor.NORMAL, duration=0.2) 114 eveui.animate(self.faction_logo, 'glowBrightness', 0.5, duration=0.2) 115 116 def OnMouseExit(self, *args): 117 super(CampaignCard, self).OnMouseExit(*args) 118 if hasattr(self, 'faction_logo') and self.faction_logo and not self.faction_logo.destroyed: 119 eveui.animate(self.faction_logo, 'color', TextColor.SECONDARY, duration=0.2) 120 eveui.animate(self.faction_logo, 'glowBrightness', 0, duration=0.2) 121 122 def GetMenu(self, *args): 123 definition_name = self.controller.campaign_controller.definition_name 124 m = get_qa_menu_for_campaign_card(self.controller.content_id, definition_name) 125 return m 126 127 128 class BaseContentController(object): 129 130 def __init__(self, *args): 131 pass 132 133 @property 134 def content_id(self): 135 return None 136 137 @property 138 def campaign_controller(self): 139 return None 140 141 @property 142 def icon_path(self): 143 return None 144 145 @property 146 def title_text(self): 147 return '' 148 149 @property 150 def title_prefix_text(self): 151 return '' 152 153 @property 154 def line_color(self): 155 return eveThemeColor.THEME_ACCENT 156 157 @property 158 def bc_color(self): 159 return eveThemeColor.THEME_TINT 160 161 @property 162 def hover_frame_color(self): 163 return eveThemeColor.THEME_TINT 164 165 def on_click(self, *args): 166 pass 167 168 @property 169 def background_texture_path(self): 170 return None 171 172 173 class CampaignCardController(BaseContentController): 174 175 def __init__(self, campaign_controller): 176 self._campaign_controller = campaign_controller 177 178 @property 179 def content_id(self): 180 return self._campaign_controller.campaign_id 181 182 @property 183 def campaign_controller(self): 184 return self._campaign_controller 185 186 @property 187 def icon_path(self): 188 return self._campaign_controller.textures.icon_path 189 190 @property 191 def title_text(self): 192 return self._campaign_controller.title_text 193 194 @property 195 def title_prefix_text(self): 196 return self._campaign_controller.issuer_name 197 198 @property 199 def is_finished(self): 200 return self._campaign_controller.is_finished 201 202 @property 203 def is_expired(self): 204 return self._campaign_controller.is_expired 205 206 @property 207 def line_color(self): 208 return self._campaign_controller.theme_pack.accent 209 210 @property 211 def bc_color(self): 212 return self._campaign_controller.theme_pack.main_color 213 214 @property 215 def hover_frame_color(self): 216 return self._campaign_controller.theme_pack.main_color 217 218 @property 219 def background_texture_path(self): 220 return self._campaign_controller.textures.ao_page_button_texture_path 221 222 def on_click(self, *args): 223 get_job_board_service().open_subfeature_page(content_tag_id=ContentTags.feature_campaigns, subfeature_id=self.content_id)