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

formCollapsibleSection.py (6994B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\control\forms\formCollapsibleSection.py
      2 import carbonui
      3 import carbonui.text.styles
      4 import eveicon
      5 from carbonui import Align, Density, ButtonVariant, uiconst, TextColor
      6 from carbonui.control.button import Button
      7 from carbonui.control.forms import formFields
      8 from carbonui.control.forms.formsUtil import FormatAsIncompleteInput
      9 from carbonui.primitives.container import Container
     10 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     11 from carbonui.primitives.line import Line
     12 from carbonui.primitives.sprite import Sprite
     13 from carbonui.uiconst import PickState
     14 from eve.client.script.ui import eveColor
     15 from localization import GetByLabel
     16 from signals import Signal
     17 
     18 class FormSectionState:
     19     UNTOUCHED = 1
     20     ACTIVE = 2
     21     INCOMPLETE = 3
     22     COMPLETE = 4
     23 
     24 
     25 class HeaderContainer(Container):
     26     default_height = 24
     27     default_pickState = PickState.ON
     28 
     29     def ApplyAttributes(self, attributes):
     30         super(HeaderContainer, self).ApplyAttributes(attributes)
     31         section_num = attributes.section_num
     32         self.form = attributes.form
     33         self.on_click = Signal('on_click')
     34         num_cont = Container(name='numCont', parent=self, align=Align.TOLEFT, width=self.height)
     35         self.circleSprite = Sprite(bgParent=num_cont, texturePath='res:/UI/Texture/Classes/PieCircle/circle32.png', opacity=0.6)
     36         self.number_text = carbonui.text.styles.TextDetail(parent=num_cont, align=Align.CENTER, text=str(section_num), color=eveColor.BLACK, shadowOffset=(0, 0), bold=True)
     37         self.iconCont = Container(parent=self, align=uiconst.TOLEFT, bgTexturePath='res:/UI/Texture/Classes/PieCircle/circle32.png', bgColor=list(eveColor.SMOKE_BLUE[:3]) + [0.2], width=self.height, display=False, padLeft=8)
     38         self.icon = Sprite(name='icon', parent=self.iconCont, align=uiconst.CENTER, pickState=PickState.OFF, color=TextColor.SECONDARY, pos=(0, 0, 16, 16))
     39         right_cont = ContainerAutoSize(parent=self, align=Align.TORIGHT)
     40         self.continue_btn = Button(name='ContinueBtn', parent=right_cont, align=Align.CENTERRIGHT, density=Density.COMPACT, variant=ButtonVariant.GHOST, label=GetByLabel('UI/Common/Expand'), func=self.OnClick, display=False)
     41         self.state_icon = Sprite(name='stateIcon', parent=right_cont, align=Align.CENTERRIGHT, pos=(0, 0, 16, 16), texturePath=eveicon.checkmark, color=eveColor.SUCCESS_GREEN, display=False)
     42         self.header = carbonui.text.styles.TextDetail(parent=Container(parent=self, padLeft=8), align=Align.CENTERLEFT, autoFadeSides=True)
     43 
     44     def OnClick(self, *args):
     45         self.on_click()
     46 
     47     def SetSectionState(self, state, is_expanded):
     48         self.state_icon.display = state == FormSectionState.COMPLETE
     49         if state in (FormSectionState.INCOMPLETE, FormSectionState.UNTOUCHED) and not is_expanded:
     50             self.continue_btn.state = uiconst.UI_NORMAL
     51         else:
     52             self.continue_btn.state = uiconst.UI_HIDDEN
     53         self.header.SetRGBA(*self._GetTextColor(state))
     54         self.circleSprite.rgb = self._GetCircleBGColor(state)[:3]
     55         self.number_text.SetRGBA(*self._GetNumberTextColor(state))
     56         self.number_text.bold = state != FormSectionState.COMPLETE
     57 
     58     def _GetNumberTextColor(self, state):
     59         if state == FormSectionState.COMPLETE:
     60             return eveColor.SUCCESS_GREEN
     61         else:
     62             return eveColor.BLACK
     63 
     64     def _GetTextColor(self, state):
     65         if state == FormSectionState.COMPLETE:
     66             return TextColor.DISABLED
     67         elif state == FormSectionState.ACTIVE:
     68             return TextColor.HIGHLIGHT
     69         else:
     70             return TextColor.NORMAL
     71 
     72     def _GetCircleBGColor(self, state):
     73         if state == FormSectionState.COMPLETE:
     74             color = list(eveColor.COPPER_OXIDE_GREEN[:3]) + [0.2]
     75         elif state == FormSectionState.INCOMPLETE:
     76             color = eveColor.WARNING_ORANGE
     77         elif state == FormSectionState.UNTOUCHED:
     78             color = eveColor.GUNMETAL_GREY
     79         else:
     80             color = eveColor.WHITE
     81         return color
     82 
     83     def SetHeaderText(self, text):
     84         self.header.text = text
     85 
     86     def SetIcon(self, icon = None):
     87         if icon:
     88             self.icon.texturePath = icon
     89             self.iconCont.display = True
     90         else:
     91             self.iconCont.display = False
     92 
     93 
     94 class FormCollapsibleSection(ContainerAutoSize):
     95 
     96     def ApplyAttributes(self, attributes):
     97         super(FormCollapsibleSection, self).ApplyAttributes(attributes)
     98         section_num = attributes.section_num
     99         self.form = attributes.form
    100         self._section_state = attributes.section_state or FormSectionState.UNTOUCHED
    101         self.on_expanded = Signal('on_expaned')
    102         self.ConstructLayout(section_num)
    103         self._SetSectionState(self._section_state)
    104         self.form.on_submit_failed.connect(self.OnSubmitFailed)
    105 
    106     def OnSubmitFailed(self, form):
    107         if self.form.is_valid():
    108             self._SetSectionState(FormSectionState.COMPLETE)
    109         else:
    110             self._SetSectionState(FormSectionState.INCOMPLETE)
    111 
    112     def ConstructLayout(self, section_num):
    113         if section_num > 1:
    114             Line(parent=self, align=Align.TOTOP, opacity=0.2, padding=(0, 16, 0, 16))
    115         self.header_cont = HeaderContainer(name='headerCont', align=Align.TOTOP, parent=self, section_num=section_num, form=self.form, pickState=PickState.ON)
    116         self.header_cont.on_click.connect(self.OnHeaderContClicked)
    117         self.fields_cont = ContainerAutoSize(name='fieldsCont', parent=self, align=Align.TOTOP, padTop=8, padBottom=-16, display=self._section_state == FormSectionState.ACTIVE)
    118         self.ConstructFields()
    119 
    120     def ConstructFields(self):
    121         formFields.ConstructFields(parent=self.fields_cont, form=self.form)
    122 
    123     def _SetSectionState(self, state):
    124         self._section_state = state
    125         self.header_cont.SetSectionState(state, self.fields_cont.display)
    126         self.UpdateHeaderText()
    127         self.header_cont.SetIcon(self._GetHeaderIcon())
    128 
    129     def UpdateHeaderText(self):
    130         self.header_cont.SetHeaderText(self._GetHeaderText())
    131 
    132     def _GetHeaderText(self):
    133         text = self.form.get_label()
    134         if self._section_state == FormSectionState.INCOMPLETE:
    135             text = FormatAsIncompleteInput(text)
    136         return text
    137 
    138     def _GetHeaderIcon(self):
    139         return None
    140 
    141     def OnHeaderContClicked(self):
    142         if not self.fields_cont.display:
    143             self.ExpandFields()
    144 
    145     def ExpandFields(self):
    146         self.fields_cont.display = True
    147         self._SetSectionState(FormSectionState.ACTIVE)
    148         self.on_expanded(self)
    149 
    150     def CollapseFields(self):
    151         self.fields_cont.display = False
    152         if self._section_state == FormSectionState.UNTOUCHED:
    153             return
    154         if self.form.is_valid():
    155             self._SetSectionState(FormSectionState.COMPLETE)
    156         else:
    157             self._SetSectionState(FormSectionState.INCOMPLETE)