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)