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

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'))