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

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)