goalDetailsCont.py (13048B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\corporation\client\goals\goalDetailsCont.py 2 import eveicon 3 from carbonui import ButtonVariant, AxisAlignment, uiconst, TextColor 4 from carbonui.text.styles import TextHeadline, TextHeader, TextDetail 5 from carbonui.button.group import ButtonGroup 6 from carbonui.control.scroll import Scroll 7 from carbonui.primitives.cardsContainer import CardsContainer 8 from carbonui.primitives.container import Container 9 from carbonui.primitives.containerAutoSize import ContainerAutoSize 10 from carbonui.primitives.sprite import Sprite 11 from corporation.client.goals import goalSignals 12 from corporation.client.goals import goalsUtil 13 from corporation.client.goals.goalsController import CorpGoalsController 14 from eve.client.script.ui.control.entries.generic import Generic 15 from eve.client.script.ui.control.entries.util import GetFromClass 16 from eve.client.script.ui.shared.neocom.corporation.corp_goals.forms import goalForms 17 from eve.client.script.ui.shared.neocom.corporation.corp_goals.goalCircularGauge import GoalCircularGauge 18 from eveformat import currency 19 from jobboard.client import get_job_board_service 20 from jobboard.client.features.corporation_goals.tooltips import TotalRewardToolTip, CoverageRatioTooltip 21 from jobboard.client.ui.pages.details_page import DetailsSection 22 from jobboard.client.ui.reward_info_container import RewardInfoContainer 23 from localization import GetByLabel 24 from localization.formatters import FormatNumeric 25 from signals import Signal 26 27 class GoalDetailsCont(Container): 28 29 def ApplyAttributes(self, attributes): 30 super(GoalDetailsCont, self).ApplyAttributes(attributes) 31 job_id = attributes.job_id 32 self.job = get_job_board_service().get_job(job_id) 33 self.goalsController = CorpGoalsController.get_instance() 34 self.buttonGroup = ButtonGroup(parent=self, button_alignment=AxisAlignment.END, padTop=16) 35 self.ConstructProgress() 36 self.ConstructParticipantsPanel() 37 self.ConstructButtons() 38 self.on_close = Signal('on_close') 39 self.update_values() 40 goalSignals.on_deleted.connect(self._CheckClose) 41 goalSignals.on_closed.connect(self._CheckClose) 42 goalSignals.on_expired.connect(self._CheckClose) 43 44 def Close(self): 45 super(GoalDetailsCont, self).Close() 46 goalSignals.on_deleted.disconnect(self._CheckClose) 47 goalSignals.on_closed.disconnect(self._CheckClose) 48 goalSignals.on_expired.disconnect(self._CheckClose) 49 50 def update_values(self): 51 self._total_progress_bar.SetValue(self.job.progress_percentage, self.job.state) 52 self._total_progress_icon.SetTexturePath(self.job.contribution_method_definition.icon) 53 self._total_progress_value.text = self._progress_label_formatted(self.job.current_progress) 54 self._total_target_value.text = u'/ {}'.format(self._progress_label_formatted(self.job.target_progress)) 55 self._total_progress_ratio.text = self._get_ratio_label(self.job.progress_percentage * 100.0) 56 if self.job.has_rewards: 57 if self.job.is_ship_insurance() and self.job.get_coverage_per_loss(): 58 self._remaining_reward.text = currency.isk(self.job.get_coverage_per_loss()) 59 self._remaining_reward.caption = GetByLabel('UI/Corporations/Goals/CoverageLimitPerLoss') 60 self._remaining_reward.icon = eveicon.spaceship_command 61 else: 62 self._remaining_reward.text = currency.isk(self.job.get_isk_payout_remaining()) 63 self._remaining_reward.caption = GetByLabel('UI/Corporations/Goals/RemainingISKReward') 64 self._remaining_reward.icon = eveicon.isk 65 66 def _CheckClose(self, goal_id): 67 if goal_id == self.job.goal_id: 68 self.on_close() 69 70 def ConstructButtons(self): 71 if goalsUtil.CanAuthorGoals(): 72 self.buttonGroup.AddButton(GetByLabel('UI/Corporations/Goals/CloneProject'), lambda button: self._clone_goal(button), texturePath=eveicon.copy, variant=ButtonVariant.GHOST) 73 if not self.job.goal.get_current_progress(): 74 self.buttonGroup.AddButton(GetByLabel('UI/Corporations/Goals/DeleteProject'), lambda button: self._delete_goal(button), texturePath=eveicon.trashcan, variant=ButtonVariant.GHOST) 75 if self.job.goal.is_active(): 76 self.buttonGroup.AddButton(GetByLabel('UI/Corporations/Goals/CloseProject'), lambda button: self._close_goal(button), texturePath=eveicon.close, variant=ButtonVariant.GHOST) 77 if self.job.goal.is_manual(): 78 self.buttonGroup.AddButton(GetByLabel('UI/Corporations/Goals/SetProgress'), lambda *args: goalForms.OpenSetGoalProgressFormWindow(self.job.goal)) 79 80 def _close_goal(self, button): 81 button.Disable() 82 button.busy = True 83 try: 84 self.goalsController.close_goal(self.job.goal_id) 85 finally: 86 button.Enable() 87 button.busy = False 88 89 def _delete_goal(self, button): 90 button.Disable() 91 button.busy = True 92 try: 93 self.goalsController.delete_goal(self.job.goal_id) 94 finally: 95 button.Enable() 96 button.busy = False 97 98 def _clone_goal(self, button): 99 button.Disable() 100 button.busy = True 101 try: 102 goalForms.OpenDuplicateGoalFormWindow(self.job.goal) 103 finally: 104 button.Enable() 105 button.busy = False 106 107 def ConstructProgress(self): 108 header_container = ContainerAutoSize(parent=self, align=uiconst.TOTOP) 109 headline = TextHeadline(parent=header_container, align=uiconst.TOTOP, text=self.job.title, padding=(0, 24, 0, 0), bold=True) 110 progress_container = ContainerAutoSize(parent=header_container, align=uiconst.TOTOP) 111 personal_card = DetailsSection(parent=progress_container, title=GetByLabel('UI/Corporations/Goals/Progress'), padTop=24, padBottom=0, headerColor=TextColor.NORMAL) 112 flow_cont = CardsContainer(name='total_prog_flow_cont', parent=personal_card.content_container, align=uiconst.TOTOP, autoHeight=True, cardHeight=100, contentSpacing=(16, 8), cardMaxWidth=500, maxColumnCount=2) 113 self._construct_progress_overview(flow_cont) 114 self._construct_reward_overview(flow_cont) 115 116 def _construct_progress_overview(self, parent): 117 container = ContainerAutoSize(name='total_prog_wrapper', parent=parent, align=uiconst.TOTOP, alignMode=uiconst.TOPLEFT) 118 self._total_progress_bar = GoalCircularGauge(parent=container, align=uiconst.TOPLEFT, radius=40, showLabel=False) 119 self._total_progress_icon = Sprite(name='total_prog_icon', parent=self._total_progress_bar, align=uiconst.CENTER, pos=(0, 0, 16, 16), color=TextColor.SECONDARY) 120 text_container = ContainerAutoSize(parent=container, align=uiconst.TOALL, padLeft=96) 121 self._total_progress_value = TextHeader(name='total_prog_progress', parent=text_container, align=uiconst.TOTOP, text='-', bold=True, padBottom=1) 122 self._total_target_value = TextDetail(name='total_prog_target', parent=text_container, align=uiconst.TOTOP, text='-', padBottom=4) 123 self._total_progress_ratio = TextDetail(name='total_prog_ratio', parent=text_container, align=uiconst.TOTOP, text='-') 124 125 def _construct_reward_overview(self, parent): 126 if self.job.reward_amount_per_contribution: 127 isk_summary_section = ContainerAutoSize(parent=parent, name='isk_summary_section', align=uiconst.TOTOP, alignMode=uiconst.TOPRIGHT) 128 self._remaining_reward = RewardInfoContainer(parent=isk_summary_section, align=uiconst.TOTOP, caption=GetByLabel('UI/Corporations/Goals/RemainingISKReward'), icon=eveicon.isk, text=currency.isk(self.job.get_isk_payout_remaining()), padBottom=16, job=self.job, tooltip=TotalRewardToolTip) 129 is_ship_insurance = self.job.is_ship_insurance() 130 if self.job.is_ship_insurance(): 131 self._reward_per_contribution = RewardInfoContainer(parent=isk_summary_section, align=uiconst.TOTOP, caption=self.job.contribution_method_definition.reward_description, icon=eveicon.ratio if is_ship_insurance else eveicon.contribution, text=self.job.get_formatted_coverage_ratio(), job=self.job, tooltip=CoverageRatioTooltip) 132 else: 133 self._reward_per_contribution = RewardInfoContainer(parent=isk_summary_section, align=uiconst.TOTOP, caption=self.job.contribution_method_definition.reward_description, icon=eveicon.ratio if is_ship_insurance else eveicon.contribution, text=currency.isk(self.job.reward_amount_per_contribution)) 134 135 def ConstructParticipantsPanel(self): 136 TextHeader(parent=self, align=uiconst.TOTOP, text=GetByLabel('UI/Corporations/Goals/Participants'), padding=(0, 16, 0, 8)) 137 ParticipantsPanel(parent=self, job=self.job) 138 139 def _progress_label_formatted(self, base_label): 140 if self.job.is_ship_insurance(): 141 return currency.isk(base_label) 142 return FormatNumeric(base_label, useGrouping=True) 143 144 def _get_ratio_label(self, ratio): 145 return u'{ratio:.0f}% <color={descColor}>{desc}</color>'.format(ratio=ratio, descColor=TextColor.SECONDARY, desc=self.job.contribution_method_definition.progress_description) 146 147 148 class ParticipantEntry(Generic): 149 isDragObject = True 150 151 def Load(self, node): 152 super(ParticipantEntry, self).Load(node) 153 self.contributor_id = node.contributor_id 154 155 def GetDragData(self): 156 from carbonui.control.dragdrop.dragdata import OwnerDragData 157 return [OwnerDragData(self.contributor_id)] 158 159 def GetMenu(self): 160 return sm.GetService('menu').GetMenuForOwner(self.contributor_id) 161 162 163 class ParticipantsPanel(Container): 164 165 def ApplyAttributes(self, attributes): 166 super(ParticipantsPanel, self).ApplyAttributes(attributes) 167 self.job = attributes.job 168 self.goal = self.job.goal 169 self.LoadPanel() 170 171 def LoadPanel(self): 172 self.Flush() 173 self.scroll = Scroll(parent=self, id='project_participants', align=uiconst.TOALL) 174 if self.goal.get_participation_limit(): 175 self.ConstructLimitedEntries() 176 else: 177 self.ConstructEntries() 178 179 def ConstructEntries(self): 180 self.scroll.Clear() 181 entries = [] 182 summaries = CorpGoalsController.get_instance().get_all_goal_contributor_summaries(self.goal.get_id()) 183 desired_progress = self.goal.get_desired_progress() 184 total_isk = self.goal.get_total_isk() 185 for contributor_id, contribution_amount in summaries: 186 contributor_name = cfg.eveowners.Get(contributor_id).ownerName 187 progress_ratio = float(contribution_amount) / desired_progress 188 payout = currency.isk(progress_ratio * total_isk) 189 data = {'label': u'{}<t>{}<t>{:.1f}%<t>{}'.format(contributor_name, contribution_amount, progress_ratio * 100, payout), 190 'sortValues': (contributor_name, contribution_amount), 191 'contributor_id': contributor_id} 192 entry = GetFromClass(ParticipantEntry, data) 193 entries.append(entry) 194 195 self.scroll.LoadContent(contentList=entries, headers=(GetByLabel('UI/Corporations/Goals/Contributor'), 196 GetByLabel('UI/Corporations/Goals/TotalAmount'), 197 GetByLabel('UI/Corporations/Goals/OfTargetValue'), 198 GetByLabel('UI/Corporations/Goals/ISKPayout')), noContentHint=GetByLabel('UI/Corporations/Goals/NoContributionsFound')) 199 200 def ConstructLimitedEntries(self): 201 self.scroll.Clear() 202 entries = [] 203 summaries = CorpGoalsController.get_instance().get_all_goal_contributor_summaries(self.goal.get_id()) 204 desired_progress = self.goal.get_desired_progress() 205 participation_limit = self.goal.get_participation_limit() 206 total_isk = self.goal.get_total_isk() 207 for contributor_id, contribution_amount in summaries: 208 contributor_name = cfg.eveowners.Get(contributor_id).ownerName 209 progress_ratio = float(contribution_amount) / desired_progress 210 personal_progress_ratio = float(contribution_amount) / participation_limit 211 payout = currency.isk(progress_ratio * total_isk) 212 data = {'label': u'{}<t>{}<t>{:.1f}%<t>{:.1f}%<t>{}'.format(contributor_name, contribution_amount, progress_ratio * 100, personal_progress_ratio * 100, payout), 213 'sortValues': (contributor_name, contribution_amount), 214 'contributor_id': contributor_id} 215 entry = GetFromClass(ParticipantEntry, data) 216 entries.append(entry) 217 218 self.scroll.LoadContent(contentList=entries, headers=(GetByLabel('UI/Corporations/Goals/Contributor'), 219 GetByLabel('UI/Corporations/Goals/TotalAmount'), 220 GetByLabel('UI/Corporations/Goals/OfTargetValue'), 221 GetByLabel('UI/Corporations/Goals/OfPersonalTarget'), 222 GetByLabel('UI/Corporations/Goals/ISKPayout')), noContentHint=GetByLabel('UI/Corporations/Goals/NoContributionsFound'))