comparisonGridRow.py (7920B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\comparison\comparisonGridRow.py 2 import carbonui.text.styles 3 import collections 4 import carbonui 5 import dogma.const 6 import dogma.data 7 import evetypes 8 from carbonui import Align, PickState, uiconst, TextColor 9 from carbonui.primitives.containerAutoSize import ContainerAutoSize 10 from carbonui.primitives.fill import Fill 11 from carbonui.primitives.layoutGrid import ListEntryLayoutGridRow 12 from carbonui.uianimations import animations 13 from dogma.attributes import groups as dogma_groups 14 from eve.client.script.ui import eveThemeColor 15 from eve.client.script.ui.comparison import attributeFields, comparisonSignals 16 from eve.client.script.ui.comparison.comparisonGridUtil import get_max_column_width 17 from eve.client.script.ui.control.eveWindowUnderlay import ListEntryUnderlay 18 from eve.client.script.ui.shared.shipTree.infoBubble import SkillEntry 19 from eve.common.lib import appConst 20 from evetypes.skills import get_dogma_required_skills 21 from eveui import Sprite 22 from skills.client.util import get_skill_service 23 24 def get_skill_type_ids_affecting_attribute(attribute_id, type_id): 25 skill_type_ids_by_attribute_id = get_skill_type_ids_by_attribute_id(type_id) 26 return skill_type_ids_by_attribute_id[attribute_id] 27 28 29 def get_skill_type_ids_by_attribute_id(type_id): 30 skill_type_ids = evetypes.GetTypeIDsByCategory(appConst.categorySkill) 31 skill_type_ids_by_attribute_id = collections.defaultdict(dict) 32 for skill_type_id in skill_type_ids: 33 if not evetypes.IsPublished(skill_type_id): 34 continue 35 effects = dogma.data.get_type_effects(skill_type_id) 36 for e in effects: 37 effect = dogma.data.get_effect(e.effectID) 38 if not effect.modifierInfo: 39 continue 40 for modifier in effect.modifierInfo: 41 if _affects_attribute(modifier, type_id): 42 skill_type_ids_by_attribute_id[modifier.modifiedAttributeID][skill_type_id] = modifier 43 44 return skill_type_ids_by_attribute_id 45 46 47 def _affects_attribute(modifier, type_id): 48 if modifier.func == 'OwnerRequiredSkillModifier': 49 if modifier.skillTypeID in get_dogma_required_skills(type_id): 50 return True 51 elif modifier.func == 'ItemModifier': 52 if modifier.domain == 'shipID': 53 return evetypes.GetCategoryID(type_id) == appConst.categoryShip 54 if modifier.domain == 'itemID': 55 return False 56 elif modifier.func == 'LocationRequiredSkillModifier': 57 if modifier.skillTypeID in get_dogma_required_skills(type_id): 58 return True 59 else: 60 if modifier.func == 'LocationModifier': 61 return True 62 if modifier.func == 'LocationGroupModifier': 63 if evetypes.GetGroupID(type_id) == modifier.groupID: 64 return True 65 elif modifier.func == 'ItemModifier': 66 return True 67 return False 68 69 70 def _get_first_attribute(attributes): 71 attribute = [ a for a in attributes if a ][0] 72 return attribute 73 74 75 def get_skills_effecting_attribute(attribute_id): 76 dogma.data.get_type_attributes() 77 effects_by_type_id = dogma.data.get_effects_indexed_by_effect_id_and_type_id().get() 78 79 80 class AttributeComparisonLayoutGridRow(ListEntryLayoutGridRow): 81 82 def __init__(self, attributes, comparable_types, is_compact = False, show_bg = True, **kw): 83 super(AttributeComparisonLayoutGridRow, self).__init__(**kw) 84 self.first_attribute = _get_first_attribute(attributes) 85 self.comparable_types = comparable_types 86 self.is_compact = is_compact 87 self.construct_attribute_icon_and_name() 88 for attribute in attributes: 89 self.construct_attribute_field(attribute) 90 91 if show_bg: 92 Fill(bgParent=self, color=eveThemeColor.THEME_FOCUSDARK, opacity=0.04, padRight=-1000) 93 94 def construct_attribute_field(self, attribute): 95 if not attribute: 96 self.construct_attribute_value_text() 97 elif attribute.attribute_id == dogma.const.attributeCloneGradeRestriction: 98 attributeFields.OmegaAttributeField(parent=self, align=Align.CENTERRIGHT, left=-4) 99 elif attribute.attribute_id in dogma_groups.skill_level_by_required_skill: 100 level_attribute_id = dogma_groups.skill_level_by_required_skill[attribute.attribute_id] 101 required_level = int(dogma.data.get_type_attribute(attribute.type_id, level_attribute_id)) 102 attributeFields.SkillAttributeField(name=u'attribute_{}'.format(attribute.name), parent=self, maxWidth=get_max_column_width(self.is_compact), align=Align.CENTERRIGHT, pickState=PickState.ON, skill_type_id=int(attribute.value), required_level=required_level) 103 elif attribute.attribute_id == dogma.const.attributeRequiredThermoDynamicsSkill: 104 attributeFields.SkillAttributeField(name=u'attribute_{}'.format(attribute.name), parent=self, maxWidth=get_max_column_width(self.is_compact), align=Align.CENTERRIGHT, pickState=PickState.ON, skill_type_id=appConst.typeThermodynamics, required_level=int(attribute.value)) 105 else: 106 self.construct_attribute_value_text(attribute) 107 108 def _construct_underlay(self): 109 self.underlay = ListEntryUnderlay(bgParent=self, padRight=-1000) 110 111 def construct_attribute_icon_and_name(self): 112 cont = ContainerAutoSize(name='attribute_name_cont', parent=self, align=Align.CENTERLEFT) 113 icon_size = 32 114 self.icon = Sprite(name='icon', parent=cont, align=Align.CENTERLEFT, pos=(0, 115 0, 116 icon_size, 117 icon_size), texturePath=self.first_attribute.texture_path, outputMode=uiconst.OUTPUT_COLOR_AND_GLOW, glowBrightness=0.0) 118 self.name_text = carbonui.text.styles.TextBody(name='name_text', parent=cont, text=self.first_attribute.name, align=Align.CENTERLEFT, maxWidth=120, maxLines=3, left=icon_size + 4) 119 120 def construct_attribute_value_text(self, attribute = None): 121 return attributeFields.TextAttributeField(parent=self, maxWidth=get_max_column_width(self.is_compact), align=Align.CENTERRIGHT, attribute=attribute) 122 123 def OnMouseEnter(self, *args): 124 super(AttributeComparisonLayoutGridRow, self).OnMouseEnter(*args) 125 animations.MorphScalar(self.icon, 'glowBrightness', self.icon.glowBrightness, 0.5, duration=uiconst.TIME_ENTRY) 126 animations.SpColorMorphTo(self.name_text, self.name_text.rgba, TextColor.HIGHLIGHT, duration=uiconst.TIME_ENTRY) 127 128 def OnMouseExit(self, *args): 129 super(AttributeComparisonLayoutGridRow, self).OnMouseExit(*args) 130 animations.MorphScalar(self.icon, 'glowBrightness', self.icon.glowBrightness, 0.0, duration=uiconst.TIME_EXIT) 131 animations.SpColorMorphTo(self.name_text, self.name_text.rgba, TextColor.NORMAL, duration=uiconst.TIME_EXIT) 132 133 def LoadTooltipPanel(self, tooltipPanel, *args): 134 tooltipPanel.LoadStandardSpacing() 135 tooltipPanel.columns = 2 136 title = self.first_attribute.get_tooltip_title() 137 if title: 138 tooltipPanel.AddMediumHeader(text=title, labelColSpan=2) 139 description = self.first_attribute.get_tooltip_description() 140 if description: 141 tooltipPanel.AddLabelMedium(text=description, wrapWidth=240, colSpan=2) 142 skill_type_ids = get_skill_type_ids_affecting_attribute(self.first_attribute.attribute_id, self.comparable_types[0].type_id) 143 for type_id, modifier in skill_type_ids.items(): 144 tooltipPanel.pickState = PickState.ON 145 level = get_skill_service().GetMyLevel(type_id) 146 tooltipPanel.AddRow(rowClass=SkillEntry, typeID=type_id, showLevel=False) 147 148 def GetTooltipPointer(self): 149 return uiconst.POINT_RIGHT_2 150 151 def GetMenu(self): 152 return self.first_attribute.get_menu() 153 154 def OnDropData(self, dragSource, dragData): 155 comparisonSignals.on_drop_data(dragSource, dragData)