comparisonWindow.py (10417B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\comparison\comparisonWindow.py 2 import eveicon 3 from carbonui import const as uiconst, IdealSize, PickState, Align 4 import blue 5 from carbonui.button.group import ButtonGroup, ButtonSizeMode 6 from carbonui.control.dragResizeCont import DragResizeCont 7 from carbonui.control.window import Window 8 from carbonui.primitives.containerAutoSize import ContainerAutoSize 9 from eve.client.script.ui.comparison import comparisonSignals, comparisonSettings 10 from eve.client.script.ui.comparison.attributeFilterButtonIcon import AttributeFilterButtonIcon, AttributeFilterCont 11 from eve.client.script.ui.comparison.attributeSelectionPanel import AttributeSelectionPanel 12 from eve.client.script.ui.comparison.comparableAttribute import ComparableAttribute 13 from eve.client.script.ui.comparison.comparisonGrid import ComparisonGrid 14 from eve.client.script.ui.comparison.comparisonScroll import ComparisonScroll 15 from eve.client.script.ui.comparison.comparisonSettings import only_show_diffrentiators_setting, ViewMode, view_mode_setting 16 from eve.client.script.ui.comparison.typeComparer import TypeComparer 17 from eve.client.script.ui.shared.fittingScreen.hullAndHardwareTypeBrowser import ComparisonHullAndHardwareTypeBrowser 18 from eveui import clipboard 19 from localization import GetByLabel 20 21 class ComparisonWindow(Window): 22 default_windowID = 'comparison_window' 23 default_iconNum = 'res:/ui/Texture/WindowIcons/comparetool.png' 24 default_captionLabelPath = 'Tooltips/Neocom/CompareTool' 25 default_descriptionLabelPath = 'Tooltips/Neocom/CompareTool_description' 26 default_minSize = (IdealSize.SIZE_720, IdealSize.SIZE_410) 27 default_width = IdealSize.SIZE_960 28 default_height = IdealSize.SIZE_720 29 30 def ApplyAttributes(self, attributes): 31 super(ComparisonWindow, self).ApplyAttributes(attributes) 32 type_and_item_ids = attributes.type_and_item_ids 33 self.dogmaLocation = sm.GetService('clientDogmaIM').GetDogmaLocation() 34 self.type_comparer = TypeComparer() 35 self.type_comparer.on_types_added.connect(self.on_types_added) 36 self.type_comparer.on_types_removed.connect(self.on_types_removed) 37 self.typeLimit = 40 38 self.settingsinited = 0 39 self.graphinited = 0 40 self.ConstructLayout() 41 if type_and_item_ids: 42 self.type_comparer.add_types(type_and_item_ids) 43 self.connect_signals() 44 45 def connect_signals(self): 46 view_mode_setting.on_change.connect(self.on_view_mode_changed) 47 only_show_diffrentiators_setting.on_change.connect(self.on_only_show_diffrentiators_setting) 48 comparisonSettings.attribute_blacklist.on_attribute_added.connect(self.on_blacklist_changed) 49 comparisonSettings.attribute_blacklist.on_attribute_removed.connect(self.on_blacklist_changed) 50 comparisonSettings.attribute_blacklist.on_cleared.connect(self.on_blacklist_changed) 51 comparisonSignals.on_remove.connect(self.RemoveEntry) 52 comparisonSignals.on_drop_data.connect(self.OnDropData) 53 comparisonSignals.on_dropped_in_front_of.connect(self.on_dropped_in_front_of) 54 55 def on_blacklist_changed(self, *args): 56 self.ReconstructCompareEntries() 57 58 def on_only_show_diffrentiators_setting(self, value): 59 self.ReconstructCompareEntries() 60 61 def disconnect_signals(self): 62 view_mode_setting.on_change.disconnect(self.on_view_mode_changed) 63 comparisonSettings.attribute_blacklist.on_attribute_added.disconnect(self.on_blacklist_changed) 64 comparisonSettings.attribute_blacklist.on_attribute_removed.disconnect(self.on_blacklist_changed) 65 comparisonSettings.attribute_blacklist.on_cleared.disconnect(self.on_blacklist_changed) 66 comparisonSignals.on_remove.disconnect(self.RemoveEntry) 67 comparisonSignals.on_drop_data.disconnect(self.OnDropData) 68 comparisonSignals.on_dropped_in_front_of.disconnect(self.on_dropped_in_front_of) 69 70 def Close(self, setClosed = False, *args, **kwds): 71 super(ComparisonWindow, self).Close(setClosed, *args, **kwds) 72 self.disconnect_signals() 73 74 @classmethod 75 def open_and_compare_multiple(cls, type_and_item_ids): 76 wnd = cls.GetIfOpen() 77 if wnd: 78 wnd.AddTypes(type_and_item_ids) 79 wnd.Maximize() 80 else: 81 cls.Open(type_and_item_ids=type_and_item_ids) 82 83 @classmethod 84 def open_and_compare(cls, type_id, item_id = None): 85 cls.open_and_compare_multiple([(type_id, item_id)]) 86 87 def on_view_mode_changed(self, value): 88 if view_mode_setting.is_equal(ViewMode.vertical): 89 self.comparison_grid.display = True 90 self.comparison_scroll.display = False 91 else: 92 self.comparison_grid.display = False 93 self.comparison_scroll.display = True 94 self.ReconstructCompareEntries() 95 96 def ConstructLayout(self): 97 self.ConstructHullAndHardwareBrowser() 98 self.ConstructTypeScroll() 99 self.ConstructComparisonGrid() 100 101 def ConstructComparisonGrid(self): 102 self.comparison_grid = ComparisonGrid(parent=self.content, display=view_mode_setting.is_equal(ViewMode.vertical), padding=(16, 0, 16, 0), pickState=PickState.ON, type_comparer=self.type_comparer) 103 104 def ConstructHullAndHardwareBrowser(self): 105 self.leftCont = DragResizeCont(parent=self.content, align=uiconst.TOLEFT, settingsID='compare_DragResizeCont', minSize=160, defaultSize=240, maxSize=400) 106 self.hullAndHardwareBrowser = ComparisonHullAndHardwareTypeBrowser(parent=self.leftCont, align=uiconst.TOALL) 107 self.hullAndHardwareBrowser.Load() 108 109 def ConstructButtonGroup(self): 110 btns = ((GetByLabel('UI/Commands/ResetAll'), 111 self.RemoveAllEntries, 112 (), 113 None),) 114 bottom_cont = ContainerAutoSize(name='bottomCont', align=Align.TOBOTTOM, alignMode=Align.TOBOTTOM, parent=self.content, padTop=8) 115 ButtonGroup(btns=btns, parent=bottom_cont, button_size_mode=ButtonSizeMode.DYNAMIC) 116 AttributeFilterCont(parent=bottom_cont, align=Align.CENTERRIGHT, type_comparer=self.type_comparer) 117 118 def ConstructAttributeScroll(self): 119 self.attributes_selection_panel = AttributeSelectionPanel(parent=self.content, align=uiconst.TORIGHT, state=uiconst.UI_HIDDEN, settingsID='compare_DragResizeCont', minSize=160, defaultSize=200, maxSize=280, type_comparer=self.type_comparer) 120 self.attributes_selection_panel.on_selection_changed.connect(self.on_attribute_selection_changed) 121 122 def ConstructTypeScroll(self): 123 self.ConstructButtonGroup() 124 self.comparison_scroll = ComparisonScroll(name='mainScroll', parent=self.content, padding=(16, 0, 16, 0), display=view_mode_setting.is_equal(ViewMode.horizontal)) 125 self.comparison_scroll.on_drop_data.connect(self.OnDropData) 126 self.comparison_scroll.on_remove_entry.connect(self.RemoveEntry) 127 128 def GetMenuMoreOptions(self): 129 menuData = super(ComparisonWindow, self).GetMenuMoreOptions() 130 menuData.AddRadioButton(GetByLabel('UI/Compare/HorizontalAlignment'), ViewMode.horizontal, view_mode_setting) 131 menuData.AddRadioButton(GetByLabel('UI/Compare/VerticalAlignment'), ViewMode.vertical, view_mode_setting) 132 menuData.AddSeparator() 133 menuData.AddEntry(GetByLabel('UI/PI/CopyToClipboard'), self.copy_to_clipboard, texturePath=eveicon.copy) 134 return menuData 135 136 def copy_to_clipboard(self, *args): 137 attribute_ids = self.get_attribute_ids_to_compare() 138 attributes = [ self.type_comparer.get_common_attribute(a_id) for a_id in attribute_ids ] 139 text = u'\t' + u'\t'.join([ '{} [{}]'.format(a.name, a.unit_name) for a in attributes ]) + '\n' 140 for comparable_type in self.type_comparer.get_comparable_types(): 141 attributes = [ comparable_type.get_attribute(a_id_) for a_id_ in attribute_ids ] 142 text += u'{name}\t'.format(name=comparable_type.get_name()) 143 values = [ (u'{}'.format(a.value) if a else '') for a in attributes ] 144 text += u'\t'.join(values) + '\n' 145 146 clipboard.set(text) 147 148 def RemoveAllEntries(self, *args): 149 self.type_comparer.clear() 150 151 def AddTypes(self, type_and_item_ids): 152 self.type_comparer.add_types(type_and_item_ids) 153 154 def RemoveEntry(self, comparable_type): 155 if self.destroyed: 156 return 157 for comparable_type in self._get_comparable_types_to_remove(comparable_type): 158 self.type_comparer.remove_type(comparable_type) 159 160 def _get_comparable_types_to_remove(self, comparable_type): 161 if view_mode_setting.is_equal(ViewMode.horizontal): 162 nodes = self.comparison_scroll.GetSelected() 163 return [ node.comparable_type for node in nodes ] or [comparable_type] 164 else: 165 return [comparable_type] 166 167 def on_types_added(self, comparable_types): 168 self.on_types_changed() 169 170 def on_types_removed(self, comparable_types): 171 self.on_types_changed() 172 173 def on_types_changed(self, force = 1, *args): 174 self.ReconstructCompareEntries() 175 176 def on_attribute_selection_changed(self): 177 self.ReconstructCompareEntries() 178 179 def ReconstructCompareEntries(self): 180 attribute_ids = self.get_attribute_ids_to_compare() 181 if view_mode_setting.is_equal(ViewMode.horizontal): 182 self.comparison_scroll.populate_scroll(self.type_comparer.get_comparable_types(), attribute_ids) 183 else: 184 self.comparison_grid.populate_types(attribute_ids) 185 186 def get_attribute_ids_to_compare(self): 187 if not only_show_diffrentiators_setting.is_enabled() or len(self.type_comparer.get_comparable_types()) <= 1: 188 attributes_by_id = self.type_comparer.get_common_attributes_by_id() 189 else: 190 attributes_by_id = self.type_comparer.get_common_attribute_that_diffrentiate_by_id() 191 blacklist = comparisonSettings.attribute_blacklist 192 return set([ a_id for a_id in attributes_by_id.keys() if a_id not in blacklist ]) 193 194 def OnDropData(self, dragObj, nodes): 195 if self.destroyed: 196 return 197 if len(nodes) > 20: 198 nodes = nodes[:20] 199 self.type_comparer.on_drop_data(nodes) 200 201 def on_dropped_in_front_of(self, drag_data, comparable_type): 202 self.type_comparer.on_drop_data(drag_data, in_front_of=comparable_type)