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)