labels.py (7790B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\achievement_system\client\ui\window\card\components\labels.py 2 import threadutils 3 from achievement_system.client.api.signal import on_achievement_completed, on_achievement_progressed, on_admin_achievement_reset, on_admin_achievement_reset_all 4 from achievement_system.client.ui.window.const import COMPACT_CARD_WIDTH, TRANSITION_DURATION 5 from carbonui import Align, TextAlign, TextColor, uiconst 6 from carbonui.control.scrollContainer import ScrollContainer 7 from carbonui.primitives.container import Container 8 from carbonui.primitives.containerAutoSize import ContainerAutoSize 9 from carbonui.text.styles import TextBody, TextHeadline 10 from carbonui.uianimations import animations 11 from signals import Signal 12 NAME_ALIGN_THRESHOLD = COMPACT_CARD_WIDTH 13 DESCRIPTION_ALIGN_MEASURE = COMPACT_CARD_WIDTH 14 DESCRIPTION_ALIGN_THRESHOLD = 57 15 16 class CompactAchievementLabels(Container): 17 default_height = 102 18 19 def __init__(self, controller, *args, **kwargs): 20 super(CompactAchievementLabels, self).__init__(*args, **kwargs) 21 self.controller = controller 22 self.on_name_click = Signal('on_name_click') 23 self.construct_layout() 24 self.update() 25 self.connect_signals() 26 27 def Close(self): 28 try: 29 self.disconnect_signals() 30 finally: 31 super(CompactAchievementLabels, self).Close() 32 33 def connect_signals(self): 34 on_achievement_completed.connect(self.on_achievement_completed) 35 on_achievement_progressed.connect(self.on_achievement_progressed) 36 on_admin_achievement_reset.connect(self.on_achievement_reset) 37 on_admin_achievement_reset_all.connect(self.on_achievement_reset_all) 38 39 def disconnect_signals(self): 40 on_achievement_completed.disconnect(self.on_achievement_completed) 41 on_achievement_progressed.disconnect(self.on_achievement_progressed) 42 on_admin_achievement_reset.disconnect(self.on_achievement_reset) 43 on_admin_achievement_reset_all.disconnect(self.on_achievement_reset_all) 44 45 def construct_layout(self): 46 name_container = Container(name='name_container', parent=self, align=Align.TOTOP, height=37) 47 self.name_label = TextHeadline(name='name_label', parent=name_container, align=self.name_label_align, state=uiconst.UI_NORMAL, color=TextColor.HIGHLIGHT, maxLines=1, autoFadeSides=16) 48 self.name_label.OnClick = self.on_name_label_click 49 self.description_container = Container(name='description_container', parent=self, align=Align.TOTOP, height=65) 50 self.scroll_container = ScrollContainer(name='scroll_container', parent=self.description_container, padding=(0, 4, 0, 4)) 51 52 def construct_description(self): 53 self.scroll_container.Flush() 54 self.description_label = TextBody(name='description_label', parent=self.scroll_container, align=self.description_label_align, text=self.description_text, textAlign=TextAlign.CENTER, color=TextColor.HIGHLIGHT) 55 56 @threadutils.highlander_threaded 57 def update(self): 58 self.name_label.text = self.controller.name 59 self.construct_description() 60 61 @property 62 def name_label_align(self): 63 text_width, _ = TextHeadline.MeasureTextSize(self.controller.name) 64 if text_width > NAME_ALIGN_THRESHOLD: 65 return uiconst.TOLEFT 66 return uiconst.CENTER 67 68 @property 69 def description_label_align(self): 70 _, text_height = TextBody.MeasureTextSize(text=self.description_text, width=DESCRIPTION_ALIGN_MEASURE) 71 if text_height > DESCRIPTION_ALIGN_THRESHOLD: 72 return uiconst.TOTOP 73 return uiconst.VERTICALLY_CENTERED 74 75 @property 76 def description_text(self): 77 return self.controller.description_for_selected_milestone 78 79 def on_achievement_completed(self, achievement_id): 80 if achievement_id == self.controller.achievement_entry.identifier: 81 self.update() 82 83 def on_achievement_progressed(self, achievement_id, achievement_state): 84 if achievement_id == self.controller.achievement_entry.identifier: 85 self.update() 86 87 def on_achievement_reset(self, achievement_id): 88 if achievement_id == self.controller.achievement_entry.identifier: 89 self.update() 90 91 def on_achievement_reset_all(self): 92 self.update() 93 94 def on_name_label_click(self, *args): 95 self.on_name_click() 96 97 98 class HoverAchievementLabels(ContainerAutoSize): 99 100 def __init__(self, controller, *args, **kwargs): 101 super(HoverAchievementLabels, self).__init__(*args, **kwargs) 102 self.controller = controller 103 self.on_name_click = Signal('on_name_click') 104 self.construct_layout() 105 self.update() 106 self.connect_signals() 107 108 def Close(self): 109 try: 110 self.disconnect_signals() 111 finally: 112 super(HoverAchievementLabels, self).Close() 113 114 def connect_signals(self): 115 on_achievement_completed.connect(self.on_achievement_completed) 116 on_achievement_progressed.connect(self.on_achievement_progressed) 117 on_admin_achievement_reset.connect(self.on_achievement_reset) 118 on_admin_achievement_reset_all.connect(self.on_achievement_reset_all) 119 120 def disconnect_signals(self): 121 on_achievement_completed.disconnect(self.on_achievement_completed) 122 on_achievement_progressed.disconnect(self.on_achievement_progressed) 123 on_admin_achievement_reset.disconnect(self.on_achievement_reset) 124 on_admin_achievement_reset_all.disconnect(self.on_achievement_reset_all) 125 126 def construct_layout(self): 127 name_container = Container(name='name_container', parent=self, align=Align.TOTOP, height=37) 128 self.name_label = TextHeadline(name='name_label', parent=name_container, align=self.name_label_align, state=uiconst.UI_NORMAL, color=TextColor.HIGHLIGHT, maxLines=1, autoFadeSides=16) 129 self.name_label.OnClick = self.on_name_label_click 130 self.description_container = Container(name='description_container', parent=self, align=Align.TOTOP, clipChildren=True, height=65, padTop=4) 131 self.description_label = TextBody(name='description_label', parent=self.description_container, align=Align.VERTICALLY_CENTERED, textAlign=TextAlign.CENTER, color=TextColor.HIGHLIGHT) 132 133 def animate_in(self, duration = TRANSITION_DURATION): 134 _, text_height = TextBody.MeasureTextSize(self.description_text, width=COMPACT_CARD_WIDTH) 135 animations.MorphScalar(obj=self.description_container, attrName='height', startVal=self.description_container.height, endVal=text_height, duration=duration) 136 137 @threadutils.highlander_threaded 138 def update(self): 139 self.name_label.text = self.controller.name 140 self.description_label.text = self.description_text 141 142 @property 143 def name_label_align(self): 144 text_width, _ = TextHeadline.MeasureTextSize(self.controller.name) 145 if text_width > NAME_ALIGN_THRESHOLD: 146 return uiconst.TOLEFT 147 return uiconst.CENTER 148 149 @property 150 def description_text(self): 151 return self.controller.description_for_selected_milestone 152 153 def on_achievement_completed(self, achievement_id): 154 if achievement_id == self.controller.achievement_entry.identifier: 155 self.update() 156 157 def on_achievement_progressed(self, achievement_id, achievement_state): 158 if achievement_id == self.controller.achievement_entry.identifier: 159 self.update() 160 161 def on_achievement_reset(self, achievement_id): 162 if achievement_id == self.controller.achievement_entry.identifier: 163 self.update() 164 165 def on_achievement_reset_all(self): 166 self.update() 167 168 def on_name_label_click(self, *args): 169 self.on_name_click()