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

hullTreeView.py (7939B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\cosmetics\ship\pages\studio\hullTreeView.py
      2 import logging
      3 import sys
      4 import evetypes
      5 import localization
      6 import shipgroup
      7 import uthread2
      8 from carbonui import uiconst, TextColor, Align, SpriteEffect
      9 from carbonui.control.scrollContainer import ScrollContainer
     10 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     11 from carbonui.uianimations import animations
     12 from cosmetics.common.ships.skins.static_data.slot_configuration import is_skinnable_ship
     13 from eve.client.script.ui.control.eveLoadingWheel import LoadingWheel
     14 from eve.client.script.ui.control.treeData import TreeData
     15 from eve.client.script.ui.control.treeViewEntry import TreeViewEntry, TreeViewEntryShip
     16 from eve.client.script.ui.shared.shipTree import shipTreeConst
     17 from eve.common.script.sys.idCheckers import IsShipType
     18 from eveui.autocomplete import ItemTypeProvider
     19 from localization import GetByMessageID, GetByLabel
     20 from signals import Signal
     21 log = logging.getLogger(__name__)
     22 
     23 def get_tree_view_entry_class(node):
     24     if isinstance(node, ShipTreeData):
     25         return HullTreeViewEntryShip
     26     else:
     27         return ShipGroupTreeViewEntry
     28 
     29 
     30 class HullTreeView(ScrollContainer):
     31     default_alignMode = Align.TOTOP
     32 
     33     def __init__(self, **kw):
     34         super(HullTreeView, self).__init__(**kw)
     35         self.faction_id = None
     36         self.root_node = None
     37         self.search_provider = ItemTypeProvider(type_filter=IsShipType)
     38         self.reconstruct_thread = None
     39         self.loading_wheel = LoadingWheel(parent=self, align=Align.CENTERTOP, top=32, state=uiconst.UI_DISABLED, opacity=0.0)
     40         self.tree_view_cont = ContainerAutoSize(parent=self, align=Align.TOTOP)
     41         self.on_hull_type_selected = Signal('on_hull_type_selected')
     42 
     43     def apply_search_query(self, query):
     44         self.reconstruct_tree_view(query)
     45 
     46     def set_faction(self, faction_id, selected_type_id = None):
     47         if faction_id == shipTreeConst.ANY_FACTION:
     48             faction_id = None
     49         self.faction_id = faction_id
     50         if self.reconstruct_thread:
     51             self.reconstruct_thread.kill()
     52         self.reconstruct_thread = uthread2.start_tasklet(self.reconstruct_tree_view, None, selected_type_id)
     53 
     54     def reconstruct_tree_view(self, search_query = None, selected_type_id = None):
     55         self.tree_view_cont.opacity = 0.0
     56         animations.FadeIn(self.loading_wheel, duration=0.3, timeOffset=0.1)
     57         try:
     58             self.root_node = TreeData()
     59             self._construct_tree_data(search_query)
     60             self._reconstruct_tree_entries()
     61             self._set_selected_node(selected_type_id)
     62             self.root_node.on_click.connect(self.on_node_clicked)
     63             self.root_node.on_selected.connect(self.on_node_selected)
     64             self.root_node.on_deselected.connect(self.on_node_deselected)
     65         finally:
     66             animations.FadeIn(self.tree_view_cont, duration=0.3)
     67             animations.FadeOut(self.loading_wheel, duration=0.1)
     68 
     69     def _set_selected_node(self, selected_type_id):
     70         if selected_type_id:
     71             selected_node = self.root_node.GetChildByID(selected_type_id)
     72             if selected_node:
     73                 selected_node.SetSelected(animate=False)
     74 
     75     def _construct_tree_data(self, search_query):
     76         if search_query:
     77             type_ids = self.get_search_result_type_ids(search_query)
     78             for type_id in type_ids:
     79                 self.root_node.AddChild(ShipTreeData(evetypes.GetName(type_id), nodeID=type_id))
     80 
     81         else:
     82             for ship_group_id in self.get_top_level_ship_group_ids_sorted():
     83                 if ship_group_id:
     84                     self._add_ship_group_to_tree(ship_group_id, self.root_node)
     85 
     86     def get_search_result_type_ids(self, search_query):
     87         suggestions = list(self.search_provider(query=search_query, previous_suggestions=[]))
     88         type_ids = [ suggestion.type_id for _, suggestion in suggestions ]
     89         return type_ids
     90 
     91     def _reconstruct_tree_entries(self):
     92         self.tree_view_cont.Flush()
     93         for node in self.root_node.children:
     94             cls = get_tree_view_entry_class(node)
     95             cls(parent=self.tree_view_cont, data=node, level=0)
     96 
     97         self._update_no_content_hint()
     98 
     99     def _update_no_content_hint(self):
    100         if self.root_node.children:
    101             no_content_hint = None
    102         else:
    103             no_content_hint = GetByLabel('UI/Wallet/WalletWindow/SearchNoResults')
    104         self.ShowNoContentHint(no_content_hint)
    105 
    106     def get_top_level_ship_group_ids_sorted(self):
    107 
    108         def get_sort_key(group_id):
    109             if group_id in shipgroup.GROUPS_BY_SIZE:
    110                 return shipgroup.GROUPS_BY_SIZE.index(group_id)
    111             else:
    112                 return sys.maxint
    113 
    114         group_ids = shipgroup.get_ship_group_ids(faction_id=self.faction_id)
    115         return sorted(group_ids, key=get_sort_key)
    116 
    117     def on_node_selected(self, node, *args):
    118         self.on_hull_type_selected(node.GetID())
    119 
    120     def on_node_deselected(self, *args):
    121         self.on_hull_type_selected(None)
    122 
    123     def _add_ship_group_to_tree(self, ship_group_id, parent_node):
    124         name_id = cfg.infoBubbleGroups[ship_group_id]['nameID']
    125         type_ids = shipgroup.get_type_ids(ship_group_id, self.faction_id)
    126         sub_group_ids = shipgroup.get_ship_group_ids(ship_group_id, self.faction_id)
    127         if not type_ids and not sub_group_ids:
    128             return
    129         node = ShipGroupTreeData(label=localization.GetByMessageID(name_id), nodeID=ship_group_id)
    130         parent_node.AddChild(node)
    131         for type_id in type_ids:
    132             node.AddChild(ShipTreeData(evetypes.GetName(type_id), nodeID=type_id))
    133 
    134         for sub_group_id in sub_group_ids:
    135             self._add_ship_group_to_tree(sub_group_id, node)
    136 
    137     def on_node_clicked(self, node):
    138         if isinstance(node, ShipTreeData):
    139             if node.IsSelected():
    140                 node.SetDeselected()
    141             else:
    142                 node.GetRootNode().DeselectAll()
    143                 node.SetSelected()
    144         else:
    145             node.ToggleExpanded()
    146 
    147 
    148 class ShipTreeData(TreeData):
    149 
    150     def __eq__(self, other):
    151         return self.GetID() == other.GetID()
    152 
    153     def is_skinnable(self):
    154         return is_skinnable_ship(self.GetID())
    155 
    156     def GetHint(self):
    157         if not self.is_skinnable():
    158             return GetByLabel('UI/Personalization/ShipSkins/SKINR/Studio/ShipNotSkinnableTooltip')
    159 
    160     def IsSelectable(self):
    161         return is_skinnable_ship(self.GetID())
    162 
    163 
    164 class ShipGroupTreeData(TreeData):
    165 
    166     def GetHint(self):
    167         return GetByMessageID(cfg.infoBubbleGroups.get(self.GetID())['descriptionID'])
    168 
    169     def GetIcon(self):
    170         return cfg.infoBubbleGroups.get(self.GetID())['iconSmall']
    171 
    172 
    173 class ShipGroupTreeViewEntry(TreeViewEntry):
    174     default_height = 32
    175     default_iconColor = TextColor.NORMAL
    176     default_settingsID = 'ShipGroupTreeViewEntry'
    177 
    178     def GetTreeViewEntryClassByTreeData(self, node):
    179         return get_tree_view_entry_class(node)
    180 
    181     def GetTooltipPointer(self):
    182         return uiconst.POINT_LEFT_2
    183 
    184     def GetTooltipPosition(self):
    185         l, t, w, h = self.GetAbsolute()
    186         return (l,
    187          t,
    188          w,
    189          self.default_height)
    190 
    191     def GetIconSize(self):
    192         return 16
    193 
    194 
    195 class HullTreeViewEntryShip(TreeViewEntryShip):
    196 
    197     def ApplyAttributes(self, attributes):
    198         super(HullTreeViewEntryShip, self).ApplyAttributes(attributes)
    199         if not self.data.is_skinnable():
    200             self.icon.icon.spriteEffect = SpriteEffect.COLOROVERLAY
    201             self.icon.icon.saturation = 0.0
    202             self.icon.opacity = 0.5
    203             self.SetAccessability(canAccess=False)
    204 
    205     def GetTooltipPointer(self):
    206         return uiconst.POINT_LEFT_2
    207 
    208     def OnClick(self, *args):
    209         if not self.data.is_skinnable():
    210             return
    211         super(HullTreeViewEntryShip, self).OnClick(*args)