tabPresetsPanel.py (15465B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\overviewSettings\tabPresetsPanel.py 2 import evetypes 3 import overviewPresets.overviewSettingsConst as osConst 4 from carbonui import ButtonVariant, Density, TextColor, uiconst 5 from carbonui.button.const import HEIGHT_NORMAL 6 from carbonui.button.group import ButtonGroup 7 from carbonui.control.button import Button 8 from carbonui.control.combo import Combo 9 from carbonui.control.tabGroup import TabGroup 10 from carbonui.primitives.container import Container 11 from carbonui.util.sortUtil import SortListOfTuples 12 from collections import defaultdict 13 from eve.client.script.parklife.overview import overviewSignals 14 from eve.client.script.parklife.state import GetNPCGroups 15 from eve.client.script.parklife.tacticalConst import get_groups 16 from eve.client.script.ui import eveThemeColor 17 from eve.client.script.ui.control import eveLabel 18 from eve.client.script.ui.control.entries.util import GetFromClass 19 from eve.client.script.ui.control.eveScroll import Scroll 20 from eve.client.script.ui.control.listgroup import ListGroup 21 from eve.client.script.ui.inflight.overview.overviewUtil import GetFilterComboOptions 22 from eve.client.script.ui.inflight.overviewSettings.overviewSettingEntries import OverviewTabPresetEntry 23 from eve.client.script.ui.inflight.overviewSettings.statesPanel import StatesPanel 24 from eve.client.script.ui.quickFilter import QuickFilterEdit 25 from localization import GetByLabel 26 from overviewPresets import overviewSettingsConst 27 from player_messaging.client.ui_message import prompt_player_fsd_dialog 28 from utillib import KeyVal 29 FILTER_STATES = 'filterstates' 30 FILTER_TYPES = 'filtertypes' 31 32 class TabPresetPanel(Container): 33 default_name = 'tabPresetPanel' 34 default_state = uiconst.UI_HIDDEN 35 __notifyevents__ = ['OnOverviewPresetsChanged'] 36 37 def ApplyAttributes(self, attributes): 38 super(TabPresetPanel, self).ApplyAttributes(attributes) 39 self.specialGroups = GetNPCGroups() 40 self.bracketTexturesForGroupID = defaultdict(set) 41 self.presetSvc = sm.GetService('overviewPresetSvc') 42 eveLabel.EveLabelLarge(parent=self, text=GetByLabel('UI/Overview/FilterToEdit'), align=uiconst.TOTOP, padTop=8) 43 topCont = Container(parent=self, align=uiconst.TOTOP, padding=(0, 4, 0, 8), height=HEIGHT_NORMAL) 44 self.presetCombo = Combo(name='presetCombo', parent=topCont, align=uiconst.TOLEFT, callback=self.OnPresetCombo) 45 self.deleteButton = Button(parent=topCont, align=uiconst.TOLEFT, padLeft=4, label=GetByLabel('UI/Common/Delete'), func=self.OnDeleteButton, variant=ButtonVariant.GHOST) 46 overviewSignals.on_preset_saved.connect(self.OnOverviewPresetsChanged) 47 overviewSignals.on_preset_saved_as.connect(self.OnOveriewPresetSavedAs) 48 overviewSignals.on_preset_created.connect(self.OnOverviewPresetsChanged) 49 overviewSignals.on_preset_deleted.connect(self.OnOverviewPresetsChanged) 50 overviewSignals.on_preset_restored.connect(self.OnOverviewPresetsChanged) 51 self.tabGroup = TabGroup(name='overviewstatesTab', height=18, align=uiconst.TOTOP, parent=self, groupID='overviewfilterTab', autoselecttab=0, padTop=8, padBottom=0) 52 self.statesPanel = StatesPanel(parent=self) 53 self.tabGroup.AddTab(GetByLabel('UI/Overview/TypesShown'), None, self, FILTER_TYPES) 54 self.tabGroup.AddTab(GetByLabel('UI/Overview/Exceptions'), None, self, FILTER_STATES) 55 self.ConstructFilterCont() 56 self.scroll = Scroll(name='presetScroll', parent=self) 57 self.scroll.multiSelect = 0 58 self.scroll.SelectAll = self.SelectAll 59 self.buttonGroup = ButtonGroup(parent=self, idx=0, padTop=8) 60 self.revertButton = self.buttonGroup.AddButton(GetByLabel('UI/Common/Buttons/Revert'), self.OnRevertButton) 61 self.saveButton = self.buttonGroup.AddButton(GetByLabel('UI/Common/Buttons/Save'), self.OnSaveButton) 62 self.saveAsButton = self.buttonGroup.AddButton(GetByLabel('UI/Common/Buttons/SaveAs'), self.OnSaveAsButton) 63 self.PopulatePresetsCombo() 64 self.UpdateButtonVisibility() 65 66 def OnOveriewPresetSavedAs(self, presetName, newPresetName): 67 self.OnOverviewPresetsChanged() 68 if presetName == self.GetSelectedPresetName(): 69 self.presetCombo.SelectItemByValue(newPresetName) 70 71 def OnDeleteButton(self, *args): 72 self.presetSvc.DeletePreset(self.GetSelectedPresetName()) 73 74 def OnRevertButton(self, *args): 75 if prompt_player_fsd_dialog('RevertOverviewPresetChanges', {}, uiconst.YESNO) == uiconst.ID_YES: 76 self.presetSvc.RevertUnsaved(self.GetSelectedPresetName()) 77 78 def OnSaveButton(self, *args): 79 self.presetSvc.SavePreset(self.GetSelectedPresetName()) 80 81 def OnSaveAsButton(self, *args): 82 self.presetSvc.SavePresetAs(self.GetSelectedPresetName()) 83 84 def OnOverviewPresetsChanged(self, *args): 85 self.PopulatePresetsCombo() 86 self.UpdateButtonVisibility() 87 self.tabGroup.ReloadVisible() 88 89 def PopulatePresetsCombo(self): 90 presetID = self.presetCombo.GetValue() 91 self.presetCombo.LoadOptions(GetFilterComboOptions()) 92 self.presetCombo.SelectItemByValue(presetID or self.presetSvc.GetActiveOverviewPresetName()) 93 94 def OnPresetCombo(self, combo, presetDisplayName, presetName): 95 self._LoadPreset(presetName) 96 97 def ConstructFilterCont(self): 98 self.filterCont = Container(name='filterCont', parent=self, align=uiconst.TOTOP, height=32, padding=(0, 16, 0, 8)) 99 Button(parent=self.filterCont, label=GetByLabel('UI/Common/SelectAll'), func=self.SelectAll, align=uiconst.TOLEFT, density=Density.COMPACT, variant=ButtonVariant.GHOST) 100 Button(parent=self.filterCont, label=GetByLabel('UI/Common/DeselectAll'), func=self.DeselectAll, align=uiconst.TOLEFT, density=Density.COMPACT, variant=ButtonVariant.GHOST, padLeft=4) 101 self.groupQuickFilter = QuickFilterEdit(name='search', parent=self.filterCont, pos=(5, 0, 150, 0), align=uiconst.TOPRIGHT) 102 self.groupQuickFilter.ReloadFunction = self.LoadFilteredTypes 103 104 def Load(self, key): 105 if key == FILTER_TYPES: 106 self.scroll.display = True 107 self.statesPanel.display = False 108 self.filterCont.display = True 109 self.LoadTypes() 110 elif key == FILTER_STATES: 111 self.scroll.display = False 112 self.statesPanel.display = True 113 self.filterCont.display = False 114 self.statesPanel.Load() 115 116 def CheckBoxChange(self, checkbox, node): 117 changeList = [(checkbox.GetSettingsKey(), node.retval, checkbox.checked)] 118 self.presetSvc.ChangeSettings(changeList=changeList, presetName=self.GetSelectedPresetName()) 119 120 def LoadPanel(self): 121 self.tabGroup.AutoSelect() 122 self.PopulatePresetsCombo() 123 124 def LoadFilteredTypes(self, *args): 125 self.LoadTypes() 126 127 def LoadPreset(self, presetName): 128 self.presetCombo.SelectItemByValue(presetName, triggerCallback=True) 129 130 def _LoadPreset(self, presetName): 131 self.presetCombo.SelectItemByValue(presetName) 132 self.UpdateButtonVisibility() 133 self.statesPanel.SetPresetName(presetName) 134 if self.tabGroup.IsVisible() and self.tabGroup.GetSelectedArgs() in (FILTER_TYPES, FILTER_STATES): 135 self.tabGroup.ReloadVisible() 136 137 def UpdateButtonVisibility(self): 138 presetName = self.GetSelectedPresetName() 139 isUnsaved = self.presetSvc.IsUnsavedPreset(presetName) 140 isDefaultName = self.presetSvc.IsDefaultPresetName(presetName) 141 if isUnsaved: 142 self.revertButton.Enable() 143 else: 144 self.revertButton.Disable() 145 if isUnsaved and not isDefaultName: 146 self.saveButton.Enable() 147 else: 148 self.saveButton.Disable() 149 if not isDefaultName: 150 self.deleteButton.Show() 151 else: 152 self.deleteButton.Hide() 153 154 def LoadTypes(self): 155 filterText = self.groupQuickFilter.GetValue() 156 categoryList = self.GetListOfCategories(filterText=filterText.lower()) 157 sortCat = categoryList.keys() 158 sortCat.sort() 159 scrolllist = [] 160 userSettings = self.presetSvc.GetPresetGroupsFromKey(self.GetSelectedPresetName()) 161 for catName in sortCat: 162 checkedCounter = 0 163 groupItems = categoryList[catName] 164 for groupID, name in groupItems: 165 if isinstance(groupID, list): 166 for each in groupID: 167 if each in userSettings: 168 checkedCounter += 1 169 break 170 171 else: 172 checkedCounter += int(groupID in userSettings) 173 174 color = self._GetListGroupLabelColor(checkedCounter, groupItems) 175 posttext = '<color=%s>%s / %s</color>' % (color, checkedCounter, len(groupItems)) 176 label = '<color=%s>%s</color>' % (color, catName) 177 data = {'GetSubContent': self.GetCatSubContent, 178 'label': label, 179 'MenuFunction': self.GetSubFolderMenu, 180 'id': ('GroupSel', catName), 181 'groupItems': groupItems, 182 'showlen': 0, 183 'sublevel': 0, 184 'state': 'locked', 185 'presetName': self.GetSelectedPresetName(), 186 'showicon': 'hide', 187 'posttext': posttext} 188 scrolllist.append(GetFromClass(ListGroup, data)) 189 190 self.scroll.Load(contentList=scrolllist) 191 192 def _GetListGroupLabelColor(self, checkedCounter, groupItems): 193 if checkedCounter >= len(groupItems): 194 return eveThemeColor.THEME_ACCENT.hex_argb 195 elif checkedCounter > 0: 196 return TextColor.HIGHLIGHT.hex_argb 197 else: 198 return TextColor.SECONDARY.hex_argb 199 200 def GetSelectedPresetName(self): 201 return self.presetCombo.GetValue() 202 203 def GetSubFolderMenu(self, node): 204 m = [None, (GetByLabel('UI/Common/SelectAll'), self.SelectGroup, (node, True)), (GetByLabel('UI/Common/DeselectAll'), self.SelectGroup, (node, False))] 205 return m 206 207 def SelectGroup(self, node, isSelect): 208 groups = [] 209 for entry in node.groupItems: 210 if type(entry[0]) == list: 211 for entry1 in entry[0]: 212 groups.append(entry1) 213 214 else: 215 groups.append(entry[0]) 216 217 changeList = [(overviewSettingsConst.PRESET_SETTINGS_GROUPS, groups, isSelect)] 218 self.presetSvc.ChangeSettings(changeList=changeList, presetName=self.GetSelectedPresetName()) 219 220 def GetCatSubContent(self, nodedata, newitems = 0): 221 presetName = nodedata.presetName 222 userSettings = self.presetSvc.GetPresetGroupsFromKey(presetName) 223 scrolllist = [] 224 for groupID, name in nodedata.groupItems: 225 texturePaths = set() 226 if type(groupID) == list: 227 for each in groupID: 228 if each in userSettings: 229 checked = 1 230 break 231 else: 232 checked = 0 233 234 else: 235 texturePaths = self.GetBracketTextureForGroupID(groupID) 236 name = evetypes.GetGroupNameByGroup(groupID) 237 checked = groupID in userSettings 238 data = KeyVal() 239 data.label = name 240 data.sublevel = 1 241 data.checked = checked 242 data.cfgname = osConst.CONFIG_GROUPS 243 data.retval = groupID 244 data.OnChange = self.CheckBoxChange 245 data.texturePaths = texturePaths 246 entry = GetFromClass(OverviewTabPresetEntry, data) 247 scrolllist.append((name, entry)) 248 249 scrolllist = SortListOfTuples(scrolllist) 250 return scrolllist 251 252 def GetBracketTextureForGroupID(self, groupID): 253 if isinstance(groupID, list): 254 return set() 255 if groupID not in self.bracketTexturesForGroupID: 256 texturePaths = self.FindBracketsForTypesInGroup(groupID) 257 if texturePaths is None: 258 bracketData = sm.GetService('bracket').GetBracketDataByGroupID(groupID) 259 texturePaths = {bracketData.texturePath} if bracketData else set() 260 self.bracketTexturesForGroupID[groupID] = texturePaths 261 return self.bracketTexturesForGroupID[groupID] 262 263 def FindBracketsForTypesInGroup(self, groupID): 264 bracketSvc = sm.GetService('bracket') 265 texturePaths = set() 266 for eachTypeID in evetypes.GetTypeIDsByGroup(groupID): 267 bracketData = bracketSvc.GetBracketDataByTypeID(eachTypeID) 268 if not bracketData: 269 continue 270 texturePaths.add(bracketData.texturePath) 271 272 return texturePaths 273 274 def GetListOfCategories(self, filterText = ''): 275 categoryList = {} 276 for _, groupid_name_tuple in get_groups(): 277 groupID, name = groupid_name_tuple 278 if filterText and name.lower().find(filterText) < 0: 279 continue 280 for cat, groupdict in self.specialGroups.iteritems(): 281 for group, groupIDs in groupdict.iteritems(): 282 if groupID in groupIDs: 283 catName = cat 284 groupID = groupIDs 285 name = group 286 break 287 else: 288 continue 289 290 break 291 else: 292 catName = evetypes.GetCategoryNameByGroup(groupID) 293 294 if catName not in categoryList: 295 categoryList[catName] = [(groupID, name)] 296 elif (groupID, name) not in categoryList[catName]: 297 categoryList[catName].append((groupID, name)) 298 299 return categoryList 300 301 def SelectAll(self, *args): 302 presetName = self.GetSelectedPresetName() 303 groups = set(self.presetSvc.GetSettingForGroups(presetName)) 304 for entry in self.scroll.GetNodes(): 305 if entry.__guid__ == 'listentry.Checkbox': 306 entry.checked = 1 307 if entry.panel: 308 entry.panel.Load(entry) 309 if entry.__guid__ == 'listentry.Group': 310 for item in entry.groupItems: 311 if type(item[0]) == list: 312 groups.update(item[0]) 313 else: 314 groups.add(item[0]) 315 316 if groups: 317 self.presetSvc.SavePresetGroupFilters(list(groups), presetName=presetName) 318 319 def DeselectAll(self, *args): 320 toRemove = set() 321 for entry in self.scroll.GetNodes(): 322 if entry.__guid__ == 'listentry.Checkbox': 323 entry.checked = 0 324 if entry.panel: 325 entry.panel.Load(entry) 326 if entry.__guid__ == 'listentry.Group': 327 for item in entry.groupItems: 328 if type(item[0]) == list: 329 toRemove.update(item[0]) 330 else: 331 toRemove.add(item[0]) 332 333 presetName = self.GetSelectedPresetName() 334 currentGroups = set(self.presetSvc.GetSettingForGroups(presetName)) 335 newGroups = currentGroups - toRemove 336 self.presetSvc.SavePresetGroupFilters(list(newGroups), presetName) 337 338 def GetBtnWidth(self): 339 btnWdith = 0 340 for btn in self.buttonGroup.buttons: 341 btnWdith += btn.width 342 343 return btnWdith