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

contribution.py (10229B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\achievement_system\client\ui\window\card\components\contribution.py
      2 import eveicon
      3 import threadutils
      4 from achievement_system.client.api.error import DefinitionNotFoundError
      5 from achievement_system.client.api.repository import get_repository
      6 from achievement_system.client.api.signal import on_achievement_completed, on_admin_achievement_reset, on_admin_achievement_reset_all
      7 from achievement_system.client.model.definition.achievement.entry import AchievementDefinitionEntry
      8 from achievement_system.client.model.definition.achievement.identifier import AchievementDefinitionIdentifier
      9 from achievement_system.client.ui.controller.achievement_entry import AchievementEntryController
     10 from achievement_system.client.ui.util import get_controller_for_configured_parameter
     11 from carbonui import Align, TextColor, uiconst
     12 from carbonui.control.attributeContainer import AttributeContainer
     13 from carbonui.control.parametertypes.parameter_container import ParameterContainer
     14 from carbonui.primitives.container import Container
     15 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     16 from carbonui.primitives.flowcontainer import FlowContainer
     17 from carbonui.primitives.frame import Frame
     18 from carbonui.primitives.sprite import Sprite
     19 from carbonui.primitives.transform import Transform
     20 from carbonui.text.custom import TextCustom
     21 from carbonui.text.styles import TextBody, TextDetail
     22 from carbonui.uianimations import animations
     23 from carbonui.uicore import uicore
     24 from eve.client.script.ui import eveColor
     25 from eve.client.script.ui.control.infoIcon import CheckMarkGlyphIcon
     26 from localization import GetByLabel
     27 
     28 class AchievementContribution(ContainerAutoSize):
     29 
     30     def __init__(self, controller, *args, **kwargs):
     31         super(AchievementContribution, self).__init__(*args, **kwargs)
     32         self.controller = controller
     33         self.construct_layout()
     34         self.update()
     35 
     36     def construct_layout(self):
     37         self.construct_attributes()
     38         self.construct_parameters()
     39 
     40     def construct_attributes(self):
     41         AttributeContainer(name='contribution_description', parent=self, align=Align.TOTOP, hint=self.controller.contribution_progress_text, text=self.controller.contribution_description, icon=self.controller.contribution_icon)
     42 
     43     def construct_parameters(self):
     44         for component_controller in self.controller.get_contribution_param_ui_controllers():
     45             ParameterContainer(parent=self, align=Align.TOTOP, controller=component_controller, padTop=16)
     46 
     47     @threadutils.highlander_threaded
     48     def update(self):
     49         pass
     50 
     51 
     52 class ChecklistContribution(ContainerAutoSize):
     53 
     54     def __init__(self, controller, *args, **kwargs):
     55         super(ChecklistContribution, self).__init__(*args, **kwargs)
     56         self.controller = controller
     57         self.construct_layout()
     58         self.update()
     59         self.connect_signals()
     60 
     61     def Close(self):
     62         try:
     63             self.disconnect_signals()
     64         finally:
     65             super(ChecklistContribution, self).Close()
     66 
     67     def connect_signals(self):
     68         on_achievement_completed.connect(self.on_achievement_completed)
     69         on_admin_achievement_reset.connect(self.on_achievement_reset)
     70         on_admin_achievement_reset_all.connect(self.on_achievement_reset_all)
     71 
     72     def disconnect_signals(self):
     73         on_achievement_completed.disconnect(self.on_achievement_completed)
     74         on_admin_achievement_reset.disconnect(self.on_achievement_reset)
     75         on_admin_achievement_reset_all.disconnect(self.on_achievement_reset_all)
     76 
     77     def construct_layout(self):
     78         self.label = TextBody(name='label', parent=self, align=Align.TOTOP, color=TextColor.SECONDARY, text=GetByLabel('UI/Achievements/Window/Card/ListTitle'))
     79         self.content_container = ContainerAutoSize(name='content_container', parent=self, align=Align.TOTOP, alignMode=Align.TOTOP, padTop=4)
     80         self.construct_icon()
     81         self.entry_container = FlowContainer(name='entry_container', parent=self.content_container, align=Align.TOTOP, contentSpacing=(8, 8), padLeft=40)
     82 
     83     def construct_icon(self):
     84         icon_container = Container(parent=self.content_container, align=Align.TOPLEFT, state=uiconst.UI_DISABLED, pos=(0, 0, 32, 32))
     85         Sprite(parent=icon_container, align=Align.CENTER, texturePath='res:/UI/Texture/classes/Achievements/card/checklist_frame.png', opacity=0.05, pos=(0, 0, 32, 32))
     86         Sprite(parent=icon_container, align=Align.CENTER, texturePath=eveicon.trophy, color=TextColor.SECONDARY, pos=(0, 0, 16, 16))
     87 
     88     def reconstruct_entries(self):
     89         self.entry_container.Flush()
     90         for param_entry, param_config in self.controller.parameters_to_display_as_list:
     91             component_controller = get_controller_for_configured_parameter(definition=param_entry.get_ui_controller(), configuration=param_config.get_ui_controller())
     92             if component_controller is None:
     93                 continue
     94             values = component_controller.values
     95             if values and isinstance(values, list):
     96                 total_entries = len(values)
     97                 if total_entries == 0:
     98                     return
     99                 is_odd_number_of_entries = total_entries % 2
    100                 for index, entry in enumerate(values):
    101                     is_last_entry = index == total_entries - 1
    102                     if is_last_entry and is_odd_number_of_entries:
    103                         width = self.entry_max_width
    104                     else:
    105                         width = ChecklistEntry.default_width
    106                     entry_controller = self.get_achievement_controller_for_entry(entry)
    107                     if entry_controller is None:
    108                         continue
    109                     ChecklistEntry(parent=self.entry_container, controller=entry_controller, width=width)
    110 
    111     def get_achievement_controller_for_entry(self, entry):
    112         achievement_id = AchievementDefinitionIdentifier(entry)
    113         if achievement_id is None:
    114             return
    115         try:
    116             achievement_attributes = get_repository().definitions.get_achievement(achievement_id)
    117         except DefinitionNotFoundError:
    118             return
    119 
    120         achievement_entry = AchievementDefinitionEntry(achievement_id, achievement_attributes)
    121         return AchievementEntryController(achievement_entry)
    122 
    123     @property
    124     def entry_max_width(self):
    125         return self.entry_container.contentSpacing[0] + ChecklistEntry.default_width * 2
    126 
    127     @threadutils.highlander_threaded
    128     def update(self):
    129         self.reconstruct_entries()
    130 
    131     def on_achievement_completed(self, achievement_id):
    132         if achievement_id == self.controller.achievement_entry.identifier:
    133             self.update()
    134 
    135     def on_achievement_reset(self, achievement_id):
    136         if achievement_id == self.controller.achievement_entry.identifier:
    137             self.update()
    138 
    139     def on_achievement_reset_all(self):
    140         self.update()
    141 
    142 
    143 class ChecklistEntry(Container):
    144     default_width = 208
    145     default_height = 48
    146     default_state = uiconst.UI_NORMAL
    147 
    148     def __init__(self, controller, *args, **kwargs):
    149         super(ChecklistEntry, self).__init__(*args, **kwargs)
    150         self.controller = controller
    151         self.is_hovered = False
    152         self.construct_layout()
    153         self.update(animate=False)
    154 
    155     def construct_layout(self):
    156         self.completed_glyph = CheckMarkGlyphIcon(parent=self, align=Align.TOPRIGHT, state=uiconst.UI_DISABLED, pos=(4, 4, 16, 16))
    157         self.content_container = Container(name='content_container', parent=self, padding=(8, 8, 8, 8))
    158         self.construct_icon()
    159         self.construct_labels()
    160         self.construct_background()
    161 
    162     def construct_icon(self):
    163         icon_container = Container(name='icon_container', parent=self.content_container, align=Align.TOLEFT, width=32)
    164         self.icon = Sprite(name='icon', parent=icon_container, align=Align.CENTER, color=TextColor.SECONDARY, pos=(0, 0, 32, 32))
    165 
    166     def construct_labels(self):
    167         label_container = ContainerAutoSize(name='label_container', parent=self.content_container, align=Align.VERTICALLY_CENTERED, padLeft=8)
    168         self.description_label = TextDetail(name='description_label', parent=label_container, align=Align.TOTOP, text=GetByLabel('UI/Achievements/Window/Card/ChecklistAchievementDescription'), color=TextColor.SECONDARY)
    169         self.name_wrapper = Container(name='name_wrapper', parent=label_container, align=Align.TOTOP)
    170         self.name_label = TextCustom(name='name_label', parent=self.name_wrapper, align=Align.TOLEFT, color=TextColor.HIGHLIGHT, fontSize=16, maxLines=1, autoFadeSides=16)
    171 
    172     def construct_background(self):
    173         frame_transform = Transform(name='frame_transform', parent=self, align=Align.TOALL, scalingCenter=(0.5, 0.5), scale=(-1.0, 1.0))
    174         self.frame = Frame(parent=frame_transform, align=Align.TOALL, texturePath='res:/UI/Texture/classes/Achievements/card/checklist_frame.png', cornerSize=16, uiScaleVertices=True)
    175 
    176     @threadutils.highlander_threaded
    177     def update(self, animate = True):
    178         is_completed = self.controller.is_completed
    179         self.frame.color = eveColor.SUCCESS_GREEN if is_completed else eveColor.WHITE
    180         self.update_frame_opacity(animate)
    181         self.icon.texturePath = eveicon.trophy
    182         self.update_labels()
    183         self.completed_glyph.display = is_completed
    184 
    185     def update_frame_opacity(self, animate = True):
    186         target_opacity = 0.2 if self.is_hovered else 0.1
    187         if animate:
    188             animations.MorphScalar(obj=self.frame, attrName='opacity', startVal=self.frame.opacity, endVal=target_opacity, duration=0.25)
    189         else:
    190             self.frame.opacity = target_opacity
    191 
    192     def update_labels(self):
    193         _, h = TextCustom.MeasureTextSize('0', fontSize=16)
    194         self.name_wrapper.height = h
    195         self.name_label.text = self.controller.name
    196 
    197     def OnClick(self, *args):
    198         uicore.cmd.OpenAchievement(self.controller.achievement_entry.identifier)
    199 
    200     def OnMouseEnter(self, *args):
    201         self.is_hovered = True
    202         self.update_frame_opacity()
    203 
    204     def OnMouseExit(self, *args):
    205         self.is_hovered = False
    206         self.update_frame_opacity()