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

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)