class AssetSafetyCont(Container): def ApplyAttributes(self, attributes): Container.ApplyAttributes(self, attributes) self.assetSafetyController = attributes.controller self.assetSafetyScroll = Scroll(name='assetSafetyScroll', id='assetSafetyScrollGUID', parent=self, align=uiconst.TOALL) self.updateCounter = None def Load(self): scrollList = GetAssetSafetyScrollContent(self.assetSafetyController) headers = AssetSafetyEntry.GetHeaders() self.assetSafetyScroll.sr.minColumnWidth = AssetSafetyEntry.GetMinimumColWidth( ) self.assetSafetyScroll.sr.defaultColumnWidth = AssetSafetyEntry.GetDefaultColumnWidth( ) self.assetSafetyScroll.Load( contentList=scrollList, headers=headers, noContentHint=GetByLabel('UI/Corporations/Assets/NoItemsFound')) self.updateCounter = AutoTimer(1000, self.UpdateCounters_thread) def UpdateCounters_thread(self): for eachEntry in self.assetSafetyScroll.GetNodes(): panel = getattr(eachEntry, 'panel', None) if not panel or panel.destroyed: continue if isinstance(panel, AssetSafetyEntry): panel.UpdateProgress() def Close(self): Container.Close(self) self.updateCounter = None
class AttributesPanel(Container): default_name = 'AttributesPanel' __notifyevents__ = ['OnAttribute', 'OnAttributes', 'OnRespecInfoUpdated'] def ApplyAttributes(self, attributes): Container.ApplyAttributes(self, attributes) sm.RegisterNotify(self) self.scroll = Scroll(parent=self, padding=(0, 4, 0, 4)) self.scroll.sr.id = 'charsheet_myattributes' def LoadPanel(self, *args): scrollList = sm.GetService('info').GetAttributeScrollListForItem( itemID=session.charid, typeID=const.typeCharacterAmarr, attrList=[ const.attributePerception, const.attributeMemory, const.attributeWillpower, const.attributeIntelligence, const.attributeCharisma ]) respecInfo = sm.GetService('skills').GetRespecInfo() self.respecEntry = entries.Get( 'AttributeRespec', data=KeyVal(nextTimedRespec=respecInfo['nextTimedRespec'], freeRespecs=respecInfo['freeRespecs'])) scrollList.append(self.respecEntry) self.scroll.Load( fixedEntryHeight=32, contentList=scrollList, noContentHint=GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/Attributes/NoAttributesFound' )) def UpdateInline(self, attributeID, value): for entry in self.scroll.GetNodes(): if entry.attributeID == attributeID: entry.text = GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/Attributes/Points', skillPoints=int(value)) if entry.panel: entry.panel.sr.text.text = entry.text entry.panel.hint = entry.text.replace('<t>', ' ') def OnAttribute(self, attributeName, item, value): if not self.display: return if attributeName in ('memory', 'intelligence', 'willpower', 'perception', 'charisma'): self.UpdateInline( LookupConstValue('attribute%s' % attributeName.capitalize(), 0), value) def OnAttributes(self, changes): for attributeName, item, value in changes: self.OnAttribute(attributeName, item, value) def OnRespecInfoUpdated(self): if self.display: self.LoadPanel()
class RenderJobProfiler(Window): default_width = PANEL_WIDTH default_height = PANEL_HEIGHT default_minSize = (default_width, default_height) def ApplyAttributes(self, attributes): super(RenderJobProfiler, self).ApplyAttributes(attributes) self.SetCaption('Render Job Profiler') self._renderJob = None self.SetTopparentHeight(0) parent = self.GetMainArea() parent.SetAlign(uiconst.TOALL) parent.padding = 5 top = Container(parent=parent, align=uiconst.TOTOP, height=20) Label(text='Render Job', parent=top, align=uiconst.TOLEFT, padding=4) combo = Combo(parent=top, options=[(rj.name, rj) for rj in trinity.renderJobs.recurring], callback=self._OnRenderJob, align=uiconst.TOALL) bottom = Container(parent=parent, align=uiconst.TOBOTTOM, height=20, padding=2) Button(parent=bottom, align=uiconst.CENTER, label='Copy', func=self._Copy, args=()) self._scroll = Scroll(parent=parent, align=uiconst.TOALL, top=4) self._OnRenderJob(None, None, combo.selectedValue) uthread2.StartTasklet(self._UpdateTiming) def _Copy(self): if not self._renderJob: return table = '\n'.join( ('{0}\t{1:.4f}\t{2:.4f}'.format(step.name or type(step).__name__, step.cpuTime, step.gpuTime) for step in self._renderJob.steps)) print table blue.pyos.SetClipboardData(table) def _UpdateTiming(self): while self.state != uiconst.UI_HIDDEN: for each in self._scroll.GetNodes(): if each['panel']: step = each['step'] each[ 'panel'].sr.label.text = '{0}<t>{1:.4f}<t>{2:.4f}'.format( step.name or type(step).__name__, step.cpuTime, step.gpuTime) uthread2.Sleep(0.03) def _OnRenderJob(self, _, __, value): if value == self._renderJob: return if self._renderJob: for step in self._renderJob.steps: step.debugCaptureCpuTime = False step.debugCaptureGpuTime = False self._renderJob = value contentList = [] if value: for step in value.steps: step.debugCaptureCpuTime = True step.debugCaptureGpuTime = True contentList.append( listentry.Get( 'Generic', { 'label': '%s<t><t>' % (step.name or type(step).__name__), 'step': step })) self._scroll.Load(contentList=contentList, headers=['Step', 'CPU Time', 'GPU Time'], fixedEntryHeight=18)
class BrowserJobs(Container): default_name = 'BrowserJobs' __notifyevents__ = [ 'OnIndustryJob', 'OnFacilityReload', 'OnSessionChanged' ] def ApplyAttributes(self, attributes): Container.ApplyAttributes(self, attributes) sm.RegisterNotify(self) self.callback = attributes.callback self.isInitialized = False def _OnClose(self, *args): sm.UnregisterNotify(self) def OnTabSelect(self): if self.isInitialized: self.UpdateOwnerCombo() self.UpdateInstallerCombo() self.UpdateScroll() return self.isInitialized = True self.topPanel = Container(name='topPanel', parent=self, align=uiconst.TOTOP, height=20, padding=(0, 6, 0, 6)) self.bottomButtons = ButtonGroup(parent=self) self.deliverSelectedBtn = self.bottomButtons.AddButton( localization.GetByLabel('UI/Industry/DeliverSelectedJobs'), self.DeliverSelectedJobs) self.deliverAllBtn = self.bottomButtons.AddButton( localization.GetByLabel('UI/Industry/DeliverAllJobs'), self.DeliverAllJobs) self.scroll = Scroll(parent=self, id='JobBrowser') self.scroll.OnSelectionChange = self.OnScrollSelectionChange self.scroll.Confirm = self.OnScrollReturn self.viewModeButtons = ViewModeButtons( parent=self.topPanel, align=uiconst.TORIGHT, controller=self, settingsID='IndustryBlueprintBrowserViewMode') self.ownerCombo = Combo(name='ownerCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnOwnerCombo, width=120, padRight=4) self.statusCombo = Combo(name='statusCombo', parent=self.topPanel, align=uiconst.TOLEFT, prefsKey='IndustryJobStatus', callback=self.OnStatusCombo, width=120, padRight=4) self.activityCombo = Combo(name='activityCombo', parent=self.topPanel, align=uiconst.TOLEFT, prefsKey='IndustryBlueprintActivity', callback=self.OnActivityCombo, options=self.GetActivityOptions(), width=120, padRight=4) self.installerCombo = Combo(name='installerCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnInstallerCombo, options=self.GetInstallerOptions(), width=140, padRight=4) self.filterEdit = QuickFilterEdit( name='searchField', parent=self.topPanel, hinttext=localization.GetByLabel('UI/Inventory/Filter'), maxLength=64, align=uiconst.TORIGHT, OnClearFilter=self.OnFilterEditCleared, padRight=4) self.filterEdit.ReloadFunction = self.OnFilterEdit self.UpdateStatusCombo() self.UpdateOwnerCombo() self.UpdateInstallerCombo() self.UpdateScroll() uthread.new(self._UpdateJobCountersThread) def OnTabDeselect(self): if self.isInitialized: self.scroll.Clear() def OnScrollSelectionChange(self, entries): if entries: self.callback(entries[0].jobData) self.UpdateDeliverButtons() def OnScrollReturn(self, *args): self.DeliverJobs(self.scroll.GetSelected()) def OnFilterEdit(self): self.UpdateScroll() def OnFilterEditCleared(self): self.UpdateScroll() def OnViewModeChanged(self, viewMode): self.UpdateScroll() def OnIndustryJob(self, jobID, ownerID, blueprintID, installerID, status, successfulRuns): """ Server telling us that a job changed it's state """ if self.destroyed or self.IsHidden(): return if self.isInitialized and self.display: self.UpdateJobEntry(jobID, status, successfulRuns) self.UpdateDeliverButtons() def OnFacilityReload(self, facilityID): """ Server telling us a facility was modified. If this applies to any jobs currently displayed then we should reload the scroll. """ if self.destroyed or self.IsHidden(): return if self.isInitialized and self.display: for node in self.scroll.GetNodes(): if facilityID is None or node.jobData.facilityID == facilityID: self.UpdateScroll() return def OnSessionChanged(self, isRemote, session, change): """ If we change solarsystem then reload the jobs tab. """ if 'solarsystemid2' in change or 'stationid2' in change: self.UpdateScroll() if 'corpid' in change: self.UpdateOwnerCombo() self.UpdateScroll() def UpdateJobEntry(self, jobID, status, successfulRuns): """ Update the state of an individual job entry """ for node in self.scroll.GetNodes(): if node.jobData.jobID == jobID and node.panel: node.panel.OnStatusChanged(status, successfulRuns) break else: self.UpdateScroll() def IsSomeJobReady(self): for node in self.scroll.GetNodes(): if node.jobData.status == industry.STATUS_READY: return True return False def IsSomeReadyJobSelected(self): for node in self.scroll.GetSelected(): if node.jobData.status == industry.STATUS_READY: return True return False def UpdateDeliverButtons(self): self.deliverAllBtn.display = self.IsSomeJobReady() self.bottomButtons.display = self.deliverAllBtn.display self.deliverSelectedBtn.display = self.IsSomeReadyJobSelected() self.bottomButtons.ResetLayout() def UpdateScroll(self): if not self.isInitialized: return statusFilter = self.statusCombo.selectedValue jobs = self.GetJobData(statusFilter == STATUS_COMPLETED) scrollList = self.GetScrollList(jobs) self.scroll.sr.defaultColumnWidth = JobEntry.GetDefaultColumnWidth() isPersonalJob = self.ownerCombo.GetValue() == OWNER_ME self.scroll.LoadContent( contentList=scrollList, headers=JobEntry.GetHeaders(isPersonalJob=isPersonalJob), noContentHint=localization.GetByLabel('UI/Industry/NoJobsFound')) self.UpdateDeliverButtons() def GetJobData(self, includeCompleted): if self.IsCorpSelected(): jobs = sm.GetService('industrySvc').GetCorporationJobs( includeCompleted) else: jobs = sm.GetService('industrySvc').GetCharacterJobs( includeCompleted) return jobs def GetScrollList(self, jobs): scrollList = [] for jobData in jobs: if self.IsFilteredOut(jobData): continue node = Bunch(jobData=jobData, decoClass=JobEntry, sortValues=JobEntry.GetColumnSortValues( jobData, jobData.distance), viewMode=self.viewModeButtons.GetViewMode(), jumps=max(0, jobData.distance)) scrollList.append(node) return scrollList def IsFilteredOut(self, jobData): statusFilter = self.statusCombo.selectedValue if statusFilter == STATUS_INCOMPLETE and jobData.completed or statusFilter == STATUS_READY and not jobData.status == industry.STATUS_READY or statusFilter == STATUS_INSTALLED and not jobData.status == industry.STATUS_INSTALLED or statusFilter == STATUS_COMPLETED and not jobData.completed or statusFilter == STATUS_PAUSED and not jobData.status == industry.STATUS_PAUSED: return True if self.IsCorpSelected(): installerType = self.installerCombo.GetValue() if installerType == INSTALLER_ME and jobData.installerID != session.charid: return True if installerType == INSTALLER_CORPMATE and jobData.installerID == session.charid: return True filterText = self.filterEdit.GetValue().strip().lower() if filterText: text = jobData.blueprint.GetName() + jobData.GetFacilityName( ) + jobData.GetInstallerName() if text.lower().find(filterText) == -1: return True activityValue = self.activityCombo.GetValue() if activityValue and activityValue != jobData.activityID: return True return False def OnStatusCombo(self, combo, key, value): settings.user.ui.Set('IndustryJobBrowserStatus', value) self.UpdateScroll() def UpdateStatusCombo(self): options = ((localization.GetByLabel('UI/Industry/StatusAllActiveJobs'), STATUS_INCOMPLETE), (localization.GetByLabel('UI/Industry/StatusInProgress'), STATUS_INSTALLED, None, STATUS_ICONS[STATUS_INSTALLED]), (localization.GetByLabel('UI/Industry/StatusReady'), STATUS_READY, None, STATUS_ICONS[STATUS_READY]), (localization.GetByLabel('UI/Industry/StatusHalted'), STATUS_PAUSED, None, STATUS_ICONS[STATUS_PAUSED]), (localization.GetByLabel('UI/Industry/StatusHistory'), STATUS_COMPLETED, None, STATUS_ICONS[STATUS_COMPLETED])) select = settings.user.ui.Get('IndustryJobBrowserStatus', STATUS_INCOMPLETE) self.statusCombo.LoadOptions(options, select=select) def OnActivityCombo(self, *args): self.UpdateScroll() def GetActivityOptions(self): ret = [ (localization.GetByLabel(ACTIVITY_NAMES[activityID]), activityID, None, industryUIConst.ACTIVITY_ICONS_SMALL[activityID]) for activityID in industry.ACTIVITIES ] ret.insert(0, (localization.GetByLabel('UI/Industry/AllActivities'), 0)) return ret def GetInstallerOptions(self): return ((localization.GetByLabel('UI/Industry/InstalledByAnyone'), INSTALLER_ANY), (localization.GetByLabel('UI/Industry/InstalledByMe'), INSTALLER_ME, None, 'res:/UI/Texture/classes/Industry/iconPersonal.png'), (localization.GetByLabel('UI/Industry/InstalledByCorpmates'), INSTALLER_CORPMATE, None, 'res:/UI/Texture/classes/Industry/iconCorp.png')) def OnInstallerCombo(self, combo, key, value): settings.user.ui.Set('IndustryJobsBrowserInstaller', value) self.UpdateScroll() def UpdateInstallerCombo(self): self.installerCombo.display = self.IsCorpSelected() value = settings.user.ui.Get('IndustryJobsBrowserInstaller', INSTALLER_ANY) self.installerCombo.SelectItemByValue(value) def OnOwnerCombo(self, combo, key, value): settings.user.ui.Set('IndustryBlueprintBrowserOwner', value) self.UpdateInstallerCombo() self.UpdateScroll() def IsCorpSelected(self): return self.ownerCombo.GetValue() == OWNER_CORP def UpdateOwnerCombo(self): options = [(localization.GetByLabel('UI/Industry/OwnedByMe'), OWNER_ME) ] if sm.GetService('blueprintSvc').CanSeeCorpBlueprints(): options.append((localization.GetByLabel('UI/Industry/OwnedByCorp'), OWNER_CORP, None, 'res:/UI/Texture/classes/Industry/iconCorp.png')) select = settings.user.ui.Get('IndustryBlueprintBrowserOwner', OWNER_ME) self.ownerCombo.LoadOptions(options, select=select) def _UpdateJobCountersThread(self): msecs = 0 while not self.destroyed: animate = False msecs += INTERVAL_UPDATE if msecs >= INTERVAL_FLASH: msecs = 0 animate = True nodes = self.scroll.GetVisibleNodes() for i, node in enumerate(nodes): if node.panel: node.panel.UpdateValues(animate, i) blue.synchro.SleepWallclock(INTERVAL_UPDATE) def DeliverAllJobs(self, *args): self.DeliverJobs(self.scroll.GetNodes()) def DeliverSelectedJobs(self, *args): self.DeliverJobs(self.scroll.GetSelected()) def DeliverJobs(self, nodes): jobIDs = [ node.jobData.jobID for node in nodes if node.jobData.status == industry.STATUS_READY ] sm.GetService('industrySvc').CompleteJobs(jobIDs) sm.GetService('audio').SendUIEvent('ind_jobDelivered')
class BrowserBlueprints(Container): default_name = 'BrowserBlueprints' default_isCorp = False __notifyevents__ = ['OnBlueprintReload', 'OnIndustryJob'] def ApplyAttributes(self, attributes): Container.ApplyAttributes(self, attributes) sm.RegisterNotify(self) self.callback = attributes.callback self.isInitialized = False self.jobData = None self.solarsystemIDbyFacilityID = {} def SetFocus(self, *args): if self.isInitialized: uicore.registry.SetFocus(self.scroll) def UpdateSelectedEntry(self): if self.jobData: self.OnActivitySelected(self.jobData.blueprintID, self.jobData.activityID) def OnNewJobData(self, jobData): self.jobData = jobData if self.isInitialized: self.UpdateSelectedEntry() def OnTabSelect(self): if self.isInitialized: self.UpdateOwnerCombo() self.UpdateScroll() return self.isInitialized = True self.topPanel = Container(name='topPanel', parent=self, align=TOTOP, height=20, padding=(0, 6, 0, 6)) self.scroll = Scroll(parent=self, id='BlueprintBrowser') self.scroll.OnSelectionChange = self.OnScrollSelectionChange self.scroll.OnKeyDown = self.OnScrollKeyDown self.scroll.OnChar = self.OnScrollChar utilMenuCont = Container(align=uiconst.TOLEFT, parent=self.topPanel, width=20) UtilMenu(menuAlign=uiconst.BOTTOMLEFT, parent=utilMenuCont, align=uiconst.CENTERLEFT, GetUtilMenu=self.GetSettingsMenu, texturePath='res:/UI/Texture/SettingsCogwheel.png', width=16, height=16, iconSize=18) self.ownerCombo = Combo(name='ownerCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnOwnerCombo, width=120) self.facilityCombo = Combo(name='facilityCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnFacilityCombo, width=200, padLeft=5) self.invLocationCombo = Combo(name='invLocationCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnInvLocationCombo, padLeft=5, width=120, settingsID='IndustryBlueprintBrowserInvLocation') self.blueprintTypeCombo = Combo(name='blueprintTypeCombo', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnBlueprintTypeCombo, padLeft=5, width=100, settingsID='IndustryBlueprintBrowserType', options=self.GetBlueprintTypeComboOptions()) self.categoryGroupCombo = Combo(name='categoryGroupCombo ', parent=self.topPanel, align=uiconst.TOLEFT, callback=self.OnCategoryGroupCombo, padLeft=5, width=100) self.viewModeButtons = ViewModeButtons(parent=self.topPanel, align=uiconst.TORIGHT, controller=self, settingsID='IndustryBlueprintBrowserViewMode') self.filterEdit = QuickFilterEdit(name='searchField', parent=self.topPanel, hinttext=localization.GetByLabel('UI/Inventory/Filter'), maxLength=64, align=uiconst.TORIGHT, padRight=4) self.filterEdit.ReloadFunction = self.OnFilterEdit self.UpdateOwnerCombo() self.UpdateBlueprintTypeCombo() self.UpdateScroll() def GetSettingsMenu(self, menuParent): menuParent.AddCheckBox(text=localization.GetByLabel('UI/Industry/ShowBlueprintsInUse'), checked=self.IsBlueprintsInUseShown(), callback=self.ToggleShowBlueprintsInUse) def ToggleShowBlueprintsInUse(self): settings.user.ui.Set('industryShowBlueprintsInUse', not self.IsBlueprintsInUseShown()) self.UpdateScroll() @telemetry.ZONE_METHOD def OnActivitySelected(self, itemID, activityID = None): if not self.isInitialized or activityID is None: return for node in self.scroll.GetNodes(): node.selected = node.bpData.blueprintID == itemID self.scroll.UpdateSelection(node) if node.panel is None: continue node.panel.OnActivitySelected(itemID, activityID) def OnBlueprintReload(self, ownerID): if self.destroyed or not self.isInitialized: return if self.isInitialized and self.display: self.UpdateScroll() def OnIndustryJob(self, jobID, ownerID, blueprintID, installerID, status, successfulRuns): if not self.isInitialized: return for node in self.scroll.GetNodes(): if node.bpData.blueprintID == blueprintID: if status < industry.STATUS_COMPLETED: node.bpData.jobID = jobID else: node.bpData.jobID = None if node.panel: node.panel.OnJobStateChanged(status) def OnFilterEdit(self): self.UpdateScroll() def OnViewModeChanged(self, viewMode): self.UpdateScroll() def UpdateFacilityCombo(self, facilities): options = [(localization.GetByLabel('UI/Industry/AllFacilities'), FACILITY_ALL)] defaultFacilityID = self.GetDefaultFacilitySelection() facilities.setdefault(defaultFacilityID, 0) for facilityID, blueprintCount in facilities.iteritems(): try: facility = sm.GetService('facilitySvc').GetFacility(facilityID) if facility: self.solarsystemIDbyFacilityID[facilityID] = facility.solarSystemID options.append((self.GetFacilityLabel(facility, blueprintCount), facilityID)) except UserError: pass options = sorted(options, key=self._GetFacilitySortKey) self.facilityCombo.LoadOptions(options, select=defaultFacilityID) def GetDefaultFacilitySelection(self): if self.IsCorpSelected(): facilityID = settings.user.ui.Get('BrowserBlueprintsFacilitiesCorp', FACILITY_CURRENT) else: facilityID = settings.user.ui.Get('BrowserBlueprintsFacilities', FACILITY_CURRENT) if isinstance(facilityID, tuple) or facilityID is None: facilityID = FACILITY_CURRENT if facilityID == FACILITY_CURRENT: facilityID = session.stationid2 return facilityID def GetDefaultInvLocationSelection(self): if self.IsCorpSelected(): return settings.user.ui.Get('BrowserBlueprintsInvLocationCorp', None) else: return settings.user.ui.Get('BrowserBlueprintsInvLocation', None) def _GetFacilitySortKey(self, option): _, facilityID = option if facilityID == FACILITY_ALL: return FACILITY_ALL if facilityID == session.stationid2: return FACILITY_CURRENT solarsystemID = self.solarsystemIDbyFacilityID[facilityID] return self.GetJumpsTo(solarsystemID) def GetFacilityLabel(self, facility, blueprintCount): if session.stationid2 and facility.facilityID == session.stationid2: return localization.GetByLabel('UI/Industry/CurrentStation') return localization.GetByLabel('UI/ScienceAndIndustry/ScienceAndIndustryWindow/LocationNumberOfBlueprintsNumberOfJumps', locationName=facility.GetName(), blueprints=blueprintCount, jumps=facility.distance) def GetJumpsTo(self, solarsystemID): return sm.GetService('clientPathfinderService').GetJumpCountFromCurrent(solarsystemID) or 0 def OnFacilityCombo(self, combo, key, value): if value == session.stationid2: value = FACILITY_CURRENT if self.IsCorpSelected(): settings.user.ui.Set('BrowserBlueprintsFacilitiesCorp', value) else: settings.user.ui.Set('BrowserBlueprintsFacilities', value) self.UpdateScroll() def GetInvLocations(self, blueprints): locations = {} for bpData in blueprints: flagID = bpData.flagID if self.IsContainerFlag(flagID): flagID = const.flagHangar locations[bpData.locationID, flagID] = bpData locations = locations.items() locations = sorted(locations, cmp=self._CompareLocations) return locations def _CompareLocations(self, location1, location2): (locationID1, flagID1), bpData1 = location1 (locationID2, flagID2), bpData2 = location2 idx1 = CORP_DIVISIONS.index(flagID1) if flagID1 in CORP_DIVISIONS else None idx2 = CORP_DIVISIONS.index(flagID2) if flagID2 in CORP_DIVISIONS else None if idx1 is None and idx2 is None: return cmp(bpData1.GetLocationName(), bpData2.GetLocationName()) elif idx1 is None and idx2 is not None: return 1 elif idx1 is not None and idx2 is None: return -1 else: return cmp(idx1, idx2) def GetSelectedFacilityID(self): facilityID = self.facilityCombo.GetValue() if facilityID == FACILITY_CURRENT: return session.stationid2 return facilityID def UpdateInvLocationCombo(self, blueprints): facilityID = self.GetSelectedFacilityID() options = [] if facilityID and facilityID != FACILITY_ALL: locations = self.GetInvLocations(blueprints) options.extend([ (bpData.GetLocationName(), key, None, bpData.location.GetIcon()) for key, bpData in locations ]) options = sorted(options) if len(options) != 1: options.insert(0, (localization.GetByLabel('UI/Industry/AllInventoryLocations'), (None, None))) self.invLocationCombo.LoadOptions(options, select=self.GetDefaultInvLocationSelection()) def OnOwnerCombo(self, combo, key, value): settings.user.ui.Set('IndustryBlueprintBrowserOwner', value) self.UpdateBlueprintTypeCombo() self.UpdateScroll() def OnInvLocationCombo(self, combo, key, value): if self.IsCorpSelected(): settings.user.ui.Set('BrowserBlueprintsInvLocationCorp', value) else: settings.user.ui.Set('BrowserBlueprintsInvLocation', value) self.UpdateScroll() def UpdateBlueprintTypeCombo(self): value = self.GetDefaultBlueprintTypeSelection() self.blueprintTypeCombo.SelectItemByValue(value) def GetDefaultBlueprintTypeSelection(self): if self.IsCorpSelected(): return settings.user.ui.Get('BrowserBlueprintsBlueprintTypeCorp', BLUEPRINTS_ALL) else: return settings.user.ui.Get('BrowserBlueprintsBlueprintType', BLUEPRINTS_ALL) def OnBlueprintTypeCombo(self, combo, key, value): if self.IsCorpSelected(): settings.user.ui.Set('BrowserBlueprintsBlueprintTypeCorp', value) else: settings.user.ui.Set('BrowserBlueprintsBlueprintType', value) self.UpdateScroll() def GetBlueprintTypeComboOptions(self): return ((localization.GetByLabel('UI/Industry/AllBlueprints'), BLUEPRINTS_ALL), (localization.GetByLabel('UI/Industry/Originals'), BLUEPRINTS_ORIGINAL, None, 'res:/UI/Texture/icons/bpo.png'), (localization.GetByLabel('UI/Industry/Copies'), BLUEPRINTS_COPY, None, 'res:/UI/Texture/icons/bpc.png')) def OnCategoryGroupCombo(self, combo, key, value): if self.IsCorpSelected(): settings.user.ui.Set('BrowserBlueprintsCategoryGroupCorp', value) else: settings.user.ui.Set('BrowserBlueprintsCategoryGroup', value) self.UpdateScroll() def GetDefaultCategoryGroup(self): if self.IsCorpSelected(): return settings.user.ui.Get('BrowserBlueprintsCategoryGroupCorp', GROUPS_ALL) else: return settings.user.ui.Get('BrowserBlueprintsCategoryGroup', GROUPS_ALL) def UpdateCategoryGroupCombo(self, blueprints): groupsByCategories = self.GetGroupsByCategories(blueprints) options = [(localization.GetByLabel('UI/Industry/AllGroups'), GROUPS_ALL)] for (categoryName, categoryID), groups in groupsByCategories: options.append((categoryName, (categoryID, None))) for groupName, groupID in groups: options.append((groupName, (categoryID, groupID), '', None, 1)) self.categoryGroupCombo.LoadOptions(options, select=self.GetDefaultCategoryGroup()) def GetGroupsByCategories(self, blueprints): ids = defaultdict(set) for bpData in blueprints: groupAndCategory = bpData.GetProductGroupAndCategory() ids[groupAndCategory.categoryName, groupAndCategory.categoryID].add((groupAndCategory.groupName, groupAndCategory.groupID)) ret = [] for category, groups in ids.iteritems(): ret.append((category, list(groups))) ret.sort() for category, groups in ret: groups.sort() return ret def IsCorpSelected(self): return self.ownerCombo.GetValue() == OWNER_CORP def UpdateScroll(self): if self.IsHidden() or self.destroyed: return None self.scroll.ShowLoading() facilityID = self.GetDefaultFacilitySelection() blueprints, facilities = self.GetBlueprintsData(facilityID) self.UpdateFacilityCombo(facilities) self.UpdateInvLocationCombo(blueprints) self.scroll.HideLoading() if not len(blueprints): self.scroll.LoadContent(noContentHint=localization.GetByLabel('UI/Industry/NoBlueprintsFound')) return None showFacility = facilityID == FACILITY_ALL showLocation = self.invLocationCombo.GetValue() == (None, None) scrollList = self.GetScrollList(blueprints, showFacility, showLocation) self.scroll.sr.defaultColumnWidth = BlueprintEntry.GetDefaultColumnWidth() self.scroll.sr.fixedColumns = BlueprintEntry.GetFixedColumns(self.viewModeButtons.GetViewMode()) self.scroll.LoadContent(contentList=scrollList, headers=BlueprintEntry.GetHeaders(showFacility=showFacility, showLocation=showLocation), noContentHint=localization.GetByLabel('UI/Industry/NoBlueprintsFound')) self.UpdateSelectedEntry() def GetFilteredBlueprints(self, blueprints): jumpsCache = {} jumpsAndBlueprints = [] for bpData in blueprints: if self.IsFilteredOut(bpData): continue jumpsAndBlueprints.append((jumpsCache.setdefault(bpData.facilityID, bpData.GetDistance()), bpData)) blue.pyos.BeNice() self.UpdateCategoryGroupCombo([ bpData for _, bpData in jumpsAndBlueprints ]) categoryID, groupID = self.categoryGroupCombo.GetValue() if (categoryID, groupID) == GROUPS_ALL: return jumpsAndBlueprints ret = [] for jumps, bpData in jumpsAndBlueprints: typeID = bpData.GetProductOrBlueprintTypeID() if groupID: if evetypes.GetGroupID(typeID) == groupID: ret.append((jumps, bpData)) elif evetypes.GetCategoryID(typeID) == categoryID: ret.append((jumps, bpData)) return ret def GetScrollList(self, blueprints, showFacility = True, showLocation = True): scrollList = [] jumpsAndBlueprints = self.GetFilteredBlueprints(blueprints) for jumps, bpData in jumpsAndBlueprints: node = Bunch(bpData=bpData, decoClass=BlueprintEntry, sortValues=BlueprintEntry.GetColumnSortValues(bpData, jumps, showFacility, showLocation), viewMode=self.viewModeButtons.GetViewMode(), jumps=jumps, activityCallback=self.SelectActivity, showFacility=showFacility, showLocation=showLocation, item=bpData.GetItem(), charIndex=bpData.GetLabel()) scrollList.append(node) blue.pyos.BeNice() return scrollList def GetBlueprintsData(self, facilityID): facilityID = facilityID if facilityID != FACILITY_ALL else None if self.IsCorpSelected(): return sm.GetService('blueprintSvc').GetCorporationBlueprints(facilityID) else: return sm.GetService('blueprintSvc').GetCharacterBlueprints(facilityID) def IsFilteredOut(self, bpData): filterText = self.filterEdit.GetValue().strip().lower() if filterText: productTypeObj = bpData.GetProductGroupAndCategory() text = bpData.GetName() + bpData.GetFacilityName() + bpData.GetLocationName() + productTypeObj.groupName + productTypeObj.categoryName if text.lower().find(filterText) == -1: return True locationID, flagID = self.invLocationCombo.GetValue() if locationID: if bpData.locationID != locationID: return True if bpData.flagID != flagID and not self.IsContainerFlag(bpData.flagID): return True bpType = self.blueprintTypeCombo.GetValue() if bpType != BLUEPRINTS_ALL: if bpData.original != (bpType == BLUEPRINTS_ORIGINAL): return True if not self.IsBlueprintsInUseShown(): if bpData.jobID is not None: return True return False def IsBlueprintsInUseShown(self): return settings.user.ui.Get('industryShowBlueprintsInUse', True) def IsContainerFlag(self, flagID): return flagID in (const.flagLocked, const.flagUnlocked) def OnScrollSelectionChange(self, entries): self.SelectActivity(entries[0].bpData) def OnScrollKeyDown(self, key, flag): Scroll.OnKeyDown(self.scroll, key, flag) if key in (uiconst.VK_LEFT, uiconst.VK_RIGHT): sm.ScatterEvent('OnIndustryLeftOrRightKey', key) def OnScrollChar(self, key, flag): if key >= uiconst.VK_0 and key <= uiconst.VK_9 or key == uiconst.VK_BACK: sm.ScatterEvent('OnBlueprintBrowserNumericInput', key, flag) def SelectActivity(self, bpData, activityID = None): self.callback(bpData, activityID) def UpdateOwnerCombo(self): options = [(localization.GetByLabel('UI/Industry/OwnedByMe'), OWNER_ME)] if sm.GetService('blueprintSvc').CanSeeCorpBlueprints(): options.append((localization.GetByLabel('UI/Industry/OwnedByCorp'), OWNER_CORP, None, 'res:/UI/Texture/classes/Industry/iconCorp.png')) select = settings.user.ui.Get('IndustryBlueprintBrowserOwner', OWNER_ME) self.ownerCombo.LoadOptions(options, select=select)
class ResManMonitor(Window): default_caption = 'Resource Manager Monitor' default_windowID = 'resmanmonitor' default_minSize = (500, 400) refreshDelay = 0.5 def PopulateAttributes(self): resManAttrs = [ ('Pending loads', lambda: blue.resMan.pendingLoads), ('Pending prepares', lambda: blue.resMan.pendingPrepares), ('Prepares handled last tick', lambda: blue.resMan.preparesHandledLastTick), ('Maximum prepares handled per tick', lambda: blue.resMan.preparesHandledPerTickMax), ('Maximum time on main thread per tick', lambda: FormatTime(blue.resMan.mainThreadMaxTime)), ('Average time in load queue', lambda: FormatTime(blue.resMan.loadQueueTimeAverage)), ('Maximum time in load queue', lambda: FormatTime(blue.resMan.loadQueueTimeMax)), ('Average time in prepare queue', lambda: FormatTime(blue.resMan.prepareQueueTimeAverage)), ('Maximum time in prepare queue', lambda: FormatTime(blue.resMan.prepareQueueTimeMax)) ] contentList = [] for attrDesc in resManAttrs: text, getvalue = attrDesc node = ScrollEntryNode(decoClass=NumberAttribute, text=text, getvalue=getvalue) contentList.append(node) self.attributes.Load(contentList=contentList) def ApplyAttributes(self, attributes): self._ready = False Window.ApplyAttributes(self, attributes) self.SetTopparentHeight(8) top = Container(parent=self.sr.main, align=uiconst.TOTOP, height=128, padding=8) self.loadObjectCacheEnabledChk = Checkbox( parent=top, align=uiconst.TOTOP, text='Load Object Cache Enabled', width=120, checked=blue.resMan.loadObjectCacheEnabled, callback=self._OnLoadObjectCacheEnabledChk) self.attributes = Scroll(parent=top, align=uiconst.TOALL) bottom = LayoutGrid(parent=self.sr.main, align=uiconst.TOBOTTOM, height=100, columns=4, cellPadding=5) self.filterEdit = SinglelineEdit(parent=bottom, width=150, label='Filter:', OnReturn=self._OnRefresh) Button(parent=bottom, label='Refresh', func=self._OnRefresh, fixedwidth=80) Button(parent=bottom, label='Reload', func=self._OnReload, fixedwidth=80) Button(parent=bottom, label='Clear cache', func=self._OnClear, fixedwidth=80) Label(parent=self.sr.main, align=uiconst.TOTOP, text='<b>Resources', padLeft=8) self.scroll = Scroll(parent=self.sr.main, id='resmanmonitorscroll', align=uiconst.TOALL, padding=2) self.PopulateAttributes() self.PopulateScroll() uthread2.StartTasklet(self.RefreshAttributes) def RefreshAttributes(self): while not self.destroyed: uthread2.Sleep(self.refreshDelay) for each in self.attributes.GetNodes(): if each.panel: each.panel.UpdateValue() def _OnLoadObjectCacheEnabledChk(self, checkbox): blue.resMan.loadObjectCacheEnabled = checkbox.GetValue() def GetEntryForObject(self, wr, filename, isCachedStr): typename = type(wr.object).__name__ memory = 0 if hasattr(wr.object, 'GetMemoryUsage'): memory = wr.object.GetMemoryUsage() pyRC, blueRC = wr.object.GetRefCounts() label = '%s<t>%s<t>%s<t>%s<t>%s<t>%s' % (filename, typename, memory, isCachedStr, blueRC, pyRC) listEntry = ScrollEntryNode(decoClass=SE_GenericCore, id=id, label=label, object_ref=wr) return listEntry def AddKeys(self, contentList, keys, isCachedStr, filter=None): for each in keys: wr = blue.motherLode.LookupAsWeakRef(each) if wr.object is not None: filename = str(each) if not filter or filter.lower() in filename.lower(): listEntry = self.GetEntryForObject(wr, filename, isCachedStr) contentList.append(listEntry) def PopulateScroll(self): contentList = [] self.AddKeys(contentList, blue.motherLode.GetCachedKeys(), 'Y', self.filterEdit.text) self.AddKeys(contentList, blue.motherLode.GetNonCachedKeys(), 'N', self.filterEdit.text) self.scroll.LoadContent(contentList=contentList, headers=[ 'Filename', 'Type', 'Memory usage', 'Cached?', 'Blue Refs', 'Python Refs' ]) def _OnRefresh(self, *args): self.PopulateScroll() def _OnReload(self, *args): selected = self.scroll.GetSelected() for each in selected: if each.object_ref.object: each.object_ref.object.Reload() def _OnClear(self, *args): blue.motherLode.ClearCached() self.PopulateScroll()
class MapViewColorModeSettingButton(MapViewSettingButton): def ReloadSettingValue(self): self.SetTexturePath(ICON_ROOT + 'spectrumIcon.png') def LoadTooltipPanel(self, tooltipPanel, *args): if uicore.uilib.leftbtn: return tooltipPanel.columns = 1 tooltipPanel.cellPadding = 2 tooltipPanel.state = uiconst.UI_NORMAL scrollPosition = settings.user.ui.Get('mapViewColorModeScrollPosition', 0.0) self.scroll = Scroll(parent=tooltipPanel, align=uiconst.TOPLEFT, width=COLORMODE_MENU_WIDTH, height=COLORMODE_MENU_HEIGHT) self.scroll.OnUpdatePosition = self.OnScrollPositionChanged scrollEntries = self.GetColorModeOptions() self.scroll.Load(contentList=scrollEntries, scrollTo=scrollPosition) def Close(self, *args): MapViewSettingButton.Close(self, *args) def OnScrollPositionChanged(self, *args, **kwargs): settings.user.ui.Set('mapViewColorModeScrollPosition', self.scroll.GetScrollProportion()) def GetScrollEntries(self, options, settingsKey=None, sublevel=0): currentActive = GetMapViewSetting(self.settingGroupKey) scrollList = [] for label, settingValue in options: config = [ self.settingGroupKey, settingValue, label, currentActive == settingValue ] entry = self.AddCheckBox(config, None, self.settingGroupKey, sublevel=sublevel) scrollList.append(entry) return scrollList def GetGroupScrollEntry(self, groupID, groupLabel, groupData): id = ('mapviewsettings', groupID) data = { 'GetSubContent': self.GetSubContent, 'label': groupLabel, 'id': id, 'groupItems': groupData, 'iconMargin': 32, 'showlen': 0, 'state': 'locked', 'BlockOpenWindow': 1, 'key': groupID, 'showicon': 'hide' } return [listentry.Get('Group', data)] def GetSubContent(self, data, newitems=0): for entry in self.scroll.GetNodes(): if entry.__guid__ != 'listentry.Group' or entry.id == data.id: continue if entry.open: if entry.panel: entry.panel.Toggle() else: uicore.registry.SetListGroupOpenState(entry.id, 0) entry.scroll.PrepareSubContent(entry) return self.GetScrollEntries(data.groupItems) def AddCheckBox(self, config, scrolllist, group=None, usecharsettings=0, sublevel=0): cfgname, retval, desc, default = config data = {} data['label'] = desc data['checked'] = default data['cfgname'] = cfgname data['retval'] = retval data['group'] = group data['OnChange'] = self.OnCheckBoxChange data['usecharsettings'] = usecharsettings data['entryWidth'] = COLORMODE_MENU_WIDTH data['decoClass'] = MapViewCheckbox scrollNode = ScrollEntryNode(**data) if scrolllist is not None: scrolllist.append(scrollNode) else: return scrollNode def OnCheckBoxChange(self, checkbox): key = checkbox.data['key'] val = checkbox.data['retval'] if val is None: val = checkbox.checked if checkbox.data.get('usecharsettings', 0): settings.char.ui.Set(key, val) else: settings.user.ui.Set(key, val) if self.callback: self.callback(self.settingGroupKey, val) def GetColorModeOptions(self): ret = [ [ localization.GetByLabel('UI/Map/MapPallet/cbStarsActual'), STARMODE_REAL ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsSecurity'), STARMODE_SECURITY ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsRegion'), STARMODE_REGION ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsDedDeadspace'), STARMODE_DUNGEONS ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsDedAgents'), STARMODE_DUNGEONSAGENTS ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsIncursion'), STARMODE_INCURSION ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsAdvoidance'), STARMODE_AVOIDANCE ] ] if eve.session.role & ROLE_GML: ret.append([ localization.GetByLabel('UI/Map/MapPallet/cbStarsIncursionGM'), STARMODE_INCURSIONGM ]) ret.sort() scrollEntries = self.GetScrollEntries(ret) for groupLabel, groupID, loadFunction in self.GetColorModeGroups(): scrollEntries += self.GetGroupScrollEntry(groupID, groupLabel, loadFunction()) return scrollEntries def GetPersonalColorModeOptions(self): ret = [ [ localization.GetByLabel('UI/Map/MapPallet/cbStarsMyAssets'), STARMODE_ASSETS ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsIVisited'), STARMODE_VISITED ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsCargoLeagal'), STARMODE_CARGOILLEGALITY ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsPIScanRange'), STARMODE_PISCANRANGE ] ] if (const.corpRoleAccountant | const.corpRoleJuniorAccountant) & eve.session.corprole != 0: ret += [[ localization.GetByLabel('UI/Map/MapPallet/cbStarsCorpOffices'), STARMODE_CORPOFFICES ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsCorpImpounded'), STARMODE_CORPIMPOUNDED ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsCorpProperty'), STARMODE_CORPPROPERTY ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsCorpDeliveries'), STARMODE_CORPDELIVERIES ]] ret += [ [ localization.GetByLabel('UI/Map/MapPallet/cbStarsCorpMembers'), STARMODE_FRIENDS_CORP ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsFleetMembers'), STARMODE_FRIENDS_FLEET ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsMyAgents'), STARMODE_FRIENDS_AGENT ] ] ret.append([ localization.GetByLabel('UI/Map/MapPallet/cbStarsMyColonies'), STARMODE_MYCOLONIES ]) ret.sort() return ret def GetPlanetsOptions(self): ret = [] for planetTypeID in maputils.PLANET_TYPES: ret.append((cfg.invtypes.Get(planetTypeID).typeName, (STARMODE_PLANETTYPE, planetTypeID))) ret.sort() return ret def GetIndustryOptions(self): ret = [ [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByJobsStartedLast24Hours'), STARMODE_JOBS24HOUR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByManufacturingJobsStartedLast24Hours' ), STARMODE_MANUFACTURING_JOBS24HOUR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByResearchTimeJobsStartedLast24Hours' ), STARMODE_RESEARCHTIME_JOBS24HOUR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByResearchMaterialJobsStartedLast24Hours' ), STARMODE_RESEARCHMATERIAL_JOBS24HOUR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByCopyJobsStartedLast24Hours'), STARMODE_COPY_JOBS24HOUR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByInventionJobsStartedLast24Hours' ), STARMODE_INVENTION_JOBS24HOUR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByManufacturingIndustryCostModifier' ), STARMODE_INDUSTRY_MANUFACTURING_COST_INDEX ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByResearchTimeIndustryCostModifier' ), STARMODE_INDUSTRY_RESEARCHTIME_COST_INDEX ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByResearchMaterialIndustryCostModifier' ), STARMODE_INDUSTRY_RESEARCHMATERIAL_COST_INDEX ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByCopyIndustryCostModifier'), STARMODE_INDUSTRY_COPY_COST_INDEX ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsByInventionIndustryCostModifier'), STARMODE_INDUSTRY_INVENTION_COST_INDEX ] ] ret.sort() return ret def GetServicesOptions(self): ret = [ [ localization.GetByLabel('UI/Map/MapPallet/cbStarsClone'), STARMODE_SERVICE_Cloning ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsFactory'), STARMODE_SERVICE_Factory ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsFitting'), STARMODE_SERVICE_Fitting ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsInsurance'), STARMODE_SERVICE_Insurance ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsLaboratory'), STARMODE_SERVICE_Laboratory ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsRepair'), STARMODE_SERVICE_RepairFacilities ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsMilitia'), STARMODE_SERVICE_NavyOffices ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsRefinery'), STARMODE_SERVICE_ReprocessingPlant ], [ localization.GetByLabel( 'UI/Map/MapPallet/StarmodeSecurityOffices'), STARMODE_SERVICE_SecurityOffice ] ] ret.sort() return ret def GetStatisticsOptions(self): ret = [ [ localization.GetByLabel('UI/Map/MapPallet/cbStarsPilots30Min'), STARMODE_PLAYERCOUNT ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsPilotsDocked'), STARMODE_PLAYERDOCKED ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsJumps'), STARMODE_JUMPS1HR ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsDestroyed'), STARMODE_SHIPKILLS1HR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsDestroyed24H'), STARMODE_SHIPKILLS24HR ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsPoded1H'), STARMODE_PODKILLS1HR ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsPoded24H'), STARMODE_PODKILLS24HR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsNPCDestroyed'), STARMODE_FACTIONKILLS1HR ], [ localization.GetByLabel( 'UI/Map/MapPallet/cbStarsStationCount'), STARMODE_STATIONCOUNT ], [ localization.GetByLabel('UI/Map/MapPallet/cbStarsCynosuarl'), STARMODE_CYNOSURALFIELDS ] ] ret.sort() return ret def GetColorModeGroups(self): colorModeGroups = [ (localization.GetByLabel('UI/Map/MapPallet/hdrStarsMyInformation'), 'Personal', self.GetPersonalColorModeOptions), (localization.GetByLabel('UI/Map/MapPallet/hdrStarsServices'), 'Services', self.GetServicesOptions), (localization.GetByLabel('UI/Map/MapPallet/hdrStarsStatistics'), 'Statistics', self.GetStatisticsOptions), (localization.GetByLabel('UI/Map/MapPallet/hdrStarsPlanets'), 'Planets', self.GetPlanetsOptions), (localization.GetByLabel('UI/Map/MapPallet/hdrStarsIndustry'), 'Industry', self.GetIndustryOptions) ] colorModeGroups.sort() return colorModeGroups
class LiveCountMonitor(Window): default_caption = 'Live counts' default_windowID = 'livecountmonitor' default_minSize = (500, 400) refreshDelay = 0.5 def ApplyAttributes(self, attributes): self._ready = False Window.ApplyAttributes(self, attributes) self.SetTopparentHeight(8) self.settingsContainer = Container(parent=self.sr.main, align=uiconst.TOTOP, height=16, padding=8) self.filterEdit = SinglelineEdit(parent=self.settingsContainer, align=uiconst.TOLEFT, width=150, label='Filter:') Button(parent=self.settingsContainer, label='Reset', align=uiconst.TORIGHT, func=self.Reset, padRight=8) self.scroll = Scroll(parent=self.sr.main, id='livecountscroll', align=uiconst.TOALL) self.Reset() self._ready = True uthread2.StartTasklet(self.Refresh) def Reset(self, *args): self.peakCount = {} self.baseCount = {} self.lastFilter = None self.filterEdit.SetText('') self.PopulateScroll() def Refresh(self): while not self.destroyed: uthread2.Sleep(self.refreshDelay) self.PopulateScroll() def GetLabelForEntry(self, key, value): peak = self.peakCount.get(key, 0) delta = value - self.baseCount.get(key, 0) if delta < 0: color = '0xffff0000' else: color = '0xff00ff00' label = '%s<t><color=%s>%d</color><t>%d<t>%d' % (key, color, delta, value, peak) return label def RebuildScrollContents(self, objects, filter): contentList = [] for key, value in objects.iteritems(): if filter and filter not in key.lower(): continue label = self.GetLabelForEntry(key, value) listEntry = ScrollEntryNode(decoClass=SE_GenericCore, id=id, name=key, label=label) contentList.append(listEntry) self.scroll.Load(contentList=contentList, headers=['Name', 'Delta', 'Count', 'Peak']) def PopulateScroll(self, *args): objects = blue.classes.LiveCount() for key, value in objects.iteritems(): peak = self.peakCount.get(key, 0) if value > peak: self.peakCount[key] = value if key not in self.baseCount: self.baseCount[key] = value filter = self.filterEdit.text.lower() if filter == self.lastFilter: for entry in self.scroll.GetNodes(): key = entry.name count = objects[key] oldLabel = entry.label newLabel = self.GetLabelForEntry(key, count) if newLabel != oldLabel: entry.label = newLabel if entry.panel: entry.panel.Load(entry) else: self.lastFilter = filter self.RebuildScrollContents(objects, filter)
class MapViewColorModeSettingButton(MapViewSettingButton): def ReloadSettingValue(self): self.SetTexturePath(ICON_ROOT + 'spectrumIcon.png') def LoadTooltipPanel(self, tooltipPanel, *args): if uicore.uilib.leftbtn: return tooltipPanel.columns = 1 tooltipPanel.cellPadding = 2 tooltipPanel.state = uiconst.UI_NORMAL tooltipPanel.AddLabelSmall( text=localization.GetByLabel('UI/Map/ColorMapBy'), bold=True, cellPadding=(8, 4, 4, 2)) divider = LineThemeColored(align=uiconst.TOTOP, state=uiconst.UI_DISABLED, height=1, padding=(1, 1, 1, 0), opacity=0.3) tooltipPanel.AddCell(divider, cellPadding=(0, 0, 0, 0)) if eve.session.role & service.ROLE_GML: Button(parent=tooltipPanel, label='Debug Run All', func=self.DebugRunAll, align=uiconst.CENTER) tooltipPanel.AddLabelSmall( text=localization.GetByLabel('UI/Map/RecentColorBy'), cellPadding=(8, 4, 4, 2)) self.recentLayoutGrid = LayoutGrid(columns=1, parent=tooltipPanel) self.LoadRecentColorModes() divider = LineThemeColored(align=uiconst.TOTOP, state=uiconst.UI_DISABLED, height=1, padding=(1, 1, 1, 0), opacity=0.3) tooltipPanel.AddCell(divider, cellPadding=(0, 0, 0, 0)) self.scroll = Scroll(parent=tooltipPanel, align=uiconst.TOPLEFT, width=COLORMODE_MENU_WIDTH, height=COLORMODE_MENU_HEIGHT) self.scroll.OnUpdatePosition = self.OnScrollPositionChanged self.LoadColorModes() def DebugRunAll(self, *args): print 'DebugRunAll' for groupLabel, groupID, loadFunction in self.GetColorModeGroups(): colorModes = loadFunction() for colorMode in colorModes: print ' -', colorMode, GetFormatFunctionLabel(colorMode) SetMapViewSetting(VIEWMODE_COLOR_SETTINGS, colorMode, self.mapViewID) if self.callback: self.callback(self.settingGroupKey, colorMode) blue.synchro.Sleep(500) def Close(self, *args): MapViewSettingButton.Close(self, *args) def OnScrollPositionChanged(self, *args, **kwargs): settings.char.ui.Set( 'mapViewColorModeScrollPosition_%s' % self.mapViewID, self.scroll.GetScrollProportion()) def GetScrollEntries(self, options, settingsKey=None, sublevel=0): currentActive = GetMapViewSetting(self.settingGroupKey, self.mapViewID) scrollList = [] for colorMode in options: label = GetFormatFunctionLabel(colorMode) if not label: continue config = [ self.settingGroupKey, colorMode, label, currentActive == colorMode ] entry = self.AddCheckBox(config, None, self.settingGroupKey, sublevel=sublevel) scrollList.append(entry) return scrollList def GetGroupScrollEntry(self, groupID, groupLabel, groupData): import listentry id = ('mapviewsettings', groupID) data = { 'GetSubContent': self.GetSubContent, 'label': groupLabel, 'id': id, 'groupItems': groupData, 'iconMargin': 32, 'showlen': 0, 'state': 'locked', 'BlockOpenWindow': 1, 'key': groupID, 'showicon': 'hide' } return listentry.Get('Group', data) def GetSubContent(self, data, newitems=0): for entry in self.scroll.GetNodes(): if entry.__guid__ != 'listentry.Group' or entry.id == data.id: continue if entry.open: if entry.panel: entry.panel.Toggle() else: uicore.registry.SetListGroupOpenState(entry.id, 0) entry.scroll.PrepareSubContent(entry) return self.GetScrollEntries(data.groupItems) def AddCheckBox(self, config, scrolllist, group=None, sublevel=0): cfgname, retval, desc, default = config data = {} data['label'] = desc data['checked'] = default data['cfgname'] = cfgname data['retval'] = retval data['group'] = group data['OnChange'] = self.OnColorModeScrollCheckBoxChange data['entryWidth'] = COLORMODE_MENU_WIDTH data['decoClass'] = MapViewCheckbox scrollNode = ScrollEntryNode(**data) if scrolllist is not None: scrolllist.append(scrollNode) else: return scrollNode def OnColorModeScrollCheckBoxChange(self, checkbox): key = checkbox.data['key'] val = checkbox.data['retval'] if val is None: val = checkbox.checked self._SetColorMode(key, val) self.RegisterRecentColorMode(val) self.LoadRecentColorModes() def OnColorModeCheckBoxChange(self, checkbox): key = checkbox.data['config'] val = checkbox.data['value'] if val is None: val = checkbox.checked self._SetColorMode(key, val) self.LoadColorModes() def _SetColorMode(self, key, val): SetMapViewSetting(key, val, self.mapViewID) if self.callback: self.callback(self.settingGroupKey, val) def GetColorModeOptions(self): scrollEntries = [] for groupLabel, groupID, loadFunction in self.GetColorModeGroups(): groupEntry = self.GetGroupScrollEntry(groupID, groupLabel, loadFunction()) scrollEntries.append((groupLabel.lower(), groupEntry)) return [entry for sortLabel, entry in sorted(scrollEntries)] def RegisterRecentColorMode(self, colorMode): current = GetMapViewSetting(VIEWMODE_COLOR_RECENT, self.mapViewID) if colorMode in current: return current.insert(0, colorMode) current = current[:VIEWMODE_COLOR_RECENT_MAX] SetMapViewSetting(VIEWMODE_COLOR_RECENT, current, self.mapViewID) def GetRecentColorModes(self): return GetMapViewSetting(VIEWMODE_COLOR_RECENT, self.mapViewID) def LoadColorModes(self): scrollPosition = settings.char.ui.Get( 'mapViewColorModeScrollPosition_%s' % self.mapViewID, 0.0) scrollEntries = self.GetColorModeOptions() self.scroll.Load(contentList=scrollEntries, scrollTo=scrollPosition) def LoadRecentColorModes(self): if self.destroyed: return self.recentLayoutGrid.Flush() ret = self.GetRecentColorModes() currentActive = GetMapViewSetting(VIEWMODE_COLOR_SETTINGS, self.mapViewID) for colorMode in ret: label = GetFormatFunctionLabel(colorMode) if not label: continue checkBox = Checkbox(align=uiconst.TOPLEFT, text=label, checked=colorMode == currentActive, wrapLabel=True, callback=self.OnColorModeCheckBoxChange, configName=VIEWMODE_COLOR_SETTINGS, groupname=VIEWMODE_COLOR_SETTINGS, retval=colorMode, prefstype=None, width=COLORMODE_MENU_WIDTH - 10) self.recentLayoutGrid.AddCell(cellObject=checkBox, cellPadding=(5, 0, 5, 0)) def GetNPCOptions(self): ret = [STARMODE_DUNGEONS, STARMODE_DUNGEONSAGENTS, STARMODE_INCURSION] if eve.session.role & ROLE_GML: ret.append(STARMODE_INCURSIONGM) return ret def GetCorporationOptions(self): ret = [STARMODE_FRIENDS_CORP] if (const.corpRoleAccountant | const.corpRoleJuniorAccountant) & eve.session.corprole != 0: ret += [ STARMODE_CORPOFFICES, STARMODE_CORPIMPOUNDED, STARMODE_CORPPROPERTY, STARMODE_CORPDELIVERIES ] return ret def GetPersonalColorModeOptions(self): ret = [ STARMODE_ASSETS, STARMODE_VISITED, STARMODE_CARGOILLEGALITY, STARMODE_PISCANRANGE, STARMODE_FRIENDS_FLEET, STARMODE_FRIENDS_AGENT, STARMODE_MYCOLONIES, STARMODE_AVOIDANCE ] return ret def GetPlanetsOptions(self): ret = [] for planetTypeID in maputils.PLANET_TYPES: ret.append((STARMODE_PLANETTYPE, planetTypeID)) return ret def GetIndustryOptions(self): ret = [ STARMODE_JOBS24HOUR, STARMODE_MANUFACTURING_JOBS24HOUR, STARMODE_RESEARCHTIME_JOBS24HOUR, STARMODE_RESEARCHMATERIAL_JOBS24HOUR, STARMODE_COPY_JOBS24HOUR, STARMODE_INVENTION_JOBS24HOUR, STARMODE_INDUSTRY_MANUFACTURING_COST_INDEX, STARMODE_INDUSTRY_RESEARCHTIME_COST_INDEX, STARMODE_INDUSTRY_RESEARCHMATERIAL_COST_INDEX, STARMODE_INDUSTRY_COPY_COST_INDEX, STARMODE_INDUSTRY_INVENTION_COST_INDEX ] return ret def GetServicesOptions(self): ret = [ STARMODE_STATION_SERVICE_CLONING, STARMODE_STATION_SERVICE_FACTORY, STARMODE_STATION_SERVICE_FITTING, STARMODE_STATION_SERVICE_INSURANCE, STARMODE_STATION_SERVICE_LABORATORY, STARMODE_STATION_SERVICE_REPAIRFACILITIES, STARMODE_STATION_SERVICE_NAVYOFFICES, STARMODE_STATION_SERVICE_REPROCESSINGPLANT, STARMODE_STATION_SERVICE_SECURITYOFFICE ] return ret def GetStatisticsOptions(self): ret = [ STARMODE_REAL, STARMODE_SECURITY, STARMODE_REGION, STARMODE_PLAYERCOUNT, STARMODE_PLAYERDOCKED, STARMODE_JUMPS1HR, STARMODE_SHIPKILLS1HR, STARMODE_SHIPKILLS24HR, STARMODE_PODKILLS1HR, STARMODE_PODKILLS24HR, STARMODE_FACTIONKILLS1HR, STARMODE_STATIONCOUNT, STARMODE_CYNOSURALFIELDS ] return ret def GetFactionalWarfareOptions(self): ret = [(STARMODE_MILITIA, STARMODE_FILTER_FACWAR_ENEMY)] for factionID in sm.StartService('facwar').GetWarFactions(): ret.append((STARMODE_MILITIA, factionID)) ret.append(STARMODE_MILITIAKILLS1HR) ret.append(STARMODE_MILITIAKILLS24HR) return ret def GetSovereigntyDevelopmentIndicesOptions(self): ret = [ STARMODE_INDEX_STRATEGIC, STARMODE_INDEX_MILITARY, STARMODE_INDEX_INDUSTRY ] return ret def GetSovereigntyOptions(self): ret = [ STARMODE_FACTION, STARMODE_SOV_STANDINGS, (STARMODE_FACTIONEMPIRE, STARMODE_FILTER_EMPIRE), STARMODE_INDEX_STRATEGIC, STARMODE_INDEX_MILITARY, STARMODE_INDEX_INDUSTRY, STARMODE_SOV_CHANGE, STARMODE_SOV_GAIN, STARMODE_SOV_LOSS, STARMODE_OUTPOST_GAIN, STARMODE_OUTPOST_LOSS, STARMODE_STATION_FREEPORT ] return ret def GetColorModeGroups(self): colorModeGroups = [ (localization.GetByLabel('UI/Map/MapColorPersonal'), 'Personal', self.GetPersonalColorModeOptions), (localization.GetByLabel('UI/Map/MapPallet/hdrStarsServices'), 'Services', self.GetServicesOptions), (localization.GetByLabel('UI/Map/MapColorGeography'), 'Statistics', self.GetStatisticsOptions), (localization.GetByLabel('UI/Map/MapColorNPC'), 'NPCActivity', self.GetNPCOptions), (localization.GetByLabel('UI/Map/MapColorCorporation'), 'Corporation', self.GetCorporationOptions), (localization.GetByLabel('UI/Map/MapPallet/hdrStarsPlanets'), 'Planets', self.GetPlanetsOptions), (localization.GetByLabel('UI/Map/MapPallet/hdrStarsIndustry'), 'Industry', self.GetIndustryOptions), (localization.GetByLabel( 'UI/Map/MapPallet/hdrStarsSovereigntyFacWar'), 'FactionalWarfare', self.GetFactionalWarfareOptions), (localization.GetByLabel('UI/Map/MapPallet/hdrStarsSovereignty'), 'Sovereignty', self.GetSovereigntyOptions) ] return colorModeGroups
class CorpRolesNew(Container): __guid__ = 'form.CorpRolesNew' __nonpersistvars__ = [] def ApplyAttributes(self, attributes): Container.ApplyAttributes(self, attributes) self.corpSvc = sm.GetService('corp') self.membersToShow = [] self.corp = attributes.corp self.viewFrom = 0 self.isSearched = False self.isCleared = False self.isBrowsed = False self.memberIDs = None self.roleGroupings = self.corpSvc.GetRoleGroupings() self.divisions = self.corpSvc.GetDivisionNames() self.titles = self.corpSvc.GetTitles() self.myBaseID = self.corpSvc.GetMember(session.charid).baseID self.myGrantableRoles = self.corpSvc.GetMyGrantableRoles() self.bases = self.GetBaseOptions() self.lastClickedBtn = None buttons = [[GetByLabel('UI/Common/Buttons/SaveChanges'), self.SaveChanges, (), 81]] btns = ButtonGroup(btns=buttons) self.children.insert(0, btns) self.mainCont = Container(parent=self, padding=4) self.topCont = Container(parent=self.mainCont, height=40, align=uiconst.TOTOP) self.browseCont = Container(name='browseCont', parent=self.mainCont, align=uiconst.TOBOTTOM, height=22, padding=(const.defaultPadding, 0, const.defaultPadding, 0), state=uiconst.UI_NORMAL) def Load(self, populateView = 1, *args): sm.GetService('corpui').LoadTop('res:/ui/Texture/WindowIcons/corporationmembers.png', GetByLabel('UI/Corporations/Common/Members')) if not self.sr.Get('inited', 0): self.sr.inited = 1 self.roleScroll = Scroll(parent=self.mainCont, id='rolesScroll') self.roleScroll.adjustableColumns = False self.roleScroll.sr.id = 'CorpRolesMembers' self.rolesSortHeaders = VerticalScrollHeader(parent=self.roleScroll.sr.maincontainer, settingsID='memberRoles', idx=0, scroll=self.roleScroll) self.rolesSortHeaders.OnSortingChange = self.ChangeRolesSort self.accessScroll = Scroll(parent=self.mainCont, id='accessScroll') self.accessScroll.sr.id = 'CorpAccessRolesMembers' self.accessSortHeaders = VerticalScrollHeader(parent=self.accessScroll.sr.maincontainer, settingsID='memberAccess', idx=0, scroll=self.accessScroll) self.accessSortHeaders.OnSortingChange = self.ChangeAccessSort self.titlesScroll = Scroll(parent=self.mainCont, id='accessScroll') self.titlesScroll.sr.id = 'CorpTitlesRolesMembers' self.titlesSortHeaders = VerticalScrollHeader(parent=self.titlesScroll.sr.maincontainer, settingsID='membertitles', idx=0, scroll=self.titlesScroll) self.titlesSortHeaders.OnSortingChange = self.ChangeTitlesSort self.members = self.corpSvc.GetMembers() self.serverMembers = self.members.PopulatePage(1) self.GetMembersToShow(updateState=False) self.roleGroupsBtns = ToggleButtonGroup(name='roleGroupsBtns', parent=self.topCont, align=uiconst.TOPLEFT, top=4, width=400, callback=self.ChangeState) self.AddRoleGroupButtons(self.roleGroupsBtns) selectedState = self.GetSelectedState() self.roleGroupsBtns.SelectByID(selectedState) self.searchInput = SearchInput(name='search', parent=self.topCont, maxLength=100, width=120, top=8, align=uiconst.TOPRIGHT, GetSearchEntries=self.Search, OnSearchEntrySelected=self.OnSearchEntrySelected, hinttext=GetByLabel('UI/EVEMail/MailingLists/SearchByName')) self.searchInput.displayHistory = False self.prevBtn = BrowseButton(parent=self.browseCont, prev=True, state=uiconst.UI_NORMAL, func=self.BrowseRoles) self.nextBtn = BrowseButton(parent=self.browseCont, prev=False, state=uiconst.UI_NORMAL, align=uiconst.TOPRIGHT, func=self.BrowseRoles) self.prevBtn.Disable() self.pageNrLabel = EveLabelMedium(parent=self.browseCont, align=uiconst.CENTER) self.UpdatePageNrText() if self.members.totalCount < MEMBERS_PER_PAGE: self.browseCont.display = False else: self.UpdateScroll(self.GetSelectedState()) def OnSearchEntrySelected(self, result, *args, **kwargs): owner = result[0].info self.isSearched = True self.isCleared = False self.GetMembersToShow(owner.ownerID) def ClearSearch(self): self.isSearched = False self.isCleared = True self.GetMembersToShow() def Search(self, searchString): if searchString == '': self.ClearSearch() return else: if self.memberIDs is None: self.memberIDs = self.corpSvc.GetMemberIDs() if len(searchString) < 3: return [] return searchUtil.SearchCharactersInCorp(searchString, self.memberIDs) def ChangeSort(self, scroll, activeColumn, activeDirection): scroll.Sort(activeColumn, activeDirection) def ChangeRolesSort(self, *args): activeColumn, activeDirection = self.rolesSortHeaders.GetCurrentActive() self.ChangeSort(self.roleScroll, activeColumn, activeDirection) def ChangeAccessSort(self, *args): activeColumn, activeDirection = self.accessSortHeaders.GetCurrentActive() self.ChangeSort(self.accessScroll, activeColumn, activeDirection) def ChangeTitlesSort(self, *args): activeColumn, activeDirection = self.titlesSortHeaders.GetCurrentActive() self.ChangeSort(self.titlesScroll, activeColumn, activeDirection) def AddRoleGroupButtons(self, roleGroupsBtns): roleGroupsBtns.AddButton(PERMISSIONS, GetByLabel('UI/Corporations/RoleManagement/Permissions')) roleGroupsBtns.AddButton(STATION_SERVICE, GetByLabel('UI/Corporations/RoleManagement/StationService')) roleGroupsBtns.AddButton(ACCOUNTING, GetByLabel('UI/Corporations/RoleManagement/Accounting')) roleGroupsBtns.AddButton(ACCESS, GetByLabel('UI/Corporations/RoleManagement/Access')) roleGroupsBtns.AddButton(GROUPS, GetByLabel('UI/Corporations/Common/Titles')) def GetMembersToShow(self, searchedCharID = None, updateState = True): self.membersToShow = [] if self.isSearched and searchedCharID: self.membersToShow.append(self.corpSvc.GetMember(searchedCharID)) else: count = min(MEMBERS_PER_PAGE, self.members.totalCount - self.viewFrom) serverPage = self.viewFrom / self.members.perPage + 1 self.serverMembers = self.members.PopulatePage(serverPage) for number in xrange(count): index = (number + self.viewFrom) % self.members.perPage currentServerPage = (number + self.viewFrom) / self.members.perPage + 1 if serverPage != currentServerPage: self.serverMembers = self.members.PopulatePage(currentServerPage) serverPage = currentServerPage self.membersToShow.append(self.serverMembers[index]) if updateState: self.ChangeState(self.GetSelectedState()) def UpdatePageNrText(self): viewPage, viewPagesTotal = self.GetViewPageAndTotalPages() self.pageNrLabel.text = '%s/%s' % (viewPage, viewPagesTotal) def GetViewPageAndTotalPages(self): viewPage = self.viewFrom / MEMBERS_PER_PAGE + 1 viewPagesTotal = self.members.totalCount / MEMBERS_PER_PAGE + 1 return (viewPage, viewPagesTotal) def BrowseRoles(self, btn, *args): self.isBrowsed = True browse = btn.backforth self.viewFrom = self.viewFrom + browse * MEMBERS_PER_PAGE if self.viewFrom < 0: self.viewFrom = 0 self.ShowHideBrowseButtons() self.UpdatePageNrText() self.GetMembersToShow() def ShowHideBrowseButtons(self): viewPage, viewPagesTotal = self.GetViewPageAndTotalPages() if viewPage < viewPagesTotal: self.nextBtn.Enable() else: self.nextBtn.Disable() if viewPage == 1: self.prevBtn.Disable() else: self.prevBtn.Enable() def GetSelectedState(self): return settings.user.ui.Get('selectedRoleGroupState', PERMISSIONS) def LoadScroll(self, scroll, sortHeaders, headers, fixedHeaders, scrollList): sortHeaders.CreateColumns(headers, fixedHeaders) currentActive, currentDirection = sortHeaders.GetCurrentActive() scroll.sr.headers = sortHeaders.GetCurrentColumns() scroll.Load(contentList=scrollList, sortby=currentActive, reversesort=currentDirection) scroll.HideLoading() def LoadRolesScroll(self): headers = self.GetRoleHeaders() self.LoadScroll(self.roleScroll, self.rolesSortHeaders, headers, self.GetFixedColumns(headers), self.GetRolesScrollList()) def LoadAccessScroll(self): self.accessScroll.ShowLoading() blue.synchro.Yield() headers = self.GetAccessRoleHeaders() self.LoadScroll(self.accessScroll, self.accessSortHeaders, headers, self.GetFixedAccessHeaders(headers), self.GetAccessScrollList()) def LoadTitlesScroll(self): headers = self.GetTitleHeaders() self.LoadScroll(self.titlesScroll, self.titlesSortHeaders, headers, self.GetFixedColumns(headers), self.GetTitlesScrollList()) def GetFixedColumns(self, headers): fixedHeaders = {GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberName'): NAME_COL_WIDTH, GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberBase'): BASE_COL_WIDTH} for header in headers[2:]: fixedHeaders[header] = CHECKBOX_COL_WIDTH return fixedHeaders def GetTitleHeaders(self): header = [GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberName'), GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberBase')] for title in sorted(self.titles.itervalues(), key=lambda x: x.titleID): header.append(title.titleName) return header def GetAccessRoleHeaders(self): header = [GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberName'), GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberBase'), GetByLabel('UI/Corporations/RoleManagement/Type')] for divisionID in xrange(1, 8): header.append(self.divisions[divisionID]) return header def GetFixedAccessHeaders(self, headers): fixedHeaders = {GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberName'): NAME_COL_WIDTH, GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberBase'): BASE_COL_WIDTH, GetByLabel('UI/Corporations/RoleManagement/Type'): 50} for header in headers[3:]: fixedHeaders[header] = ACCESS_COL_WIDTH return fixedHeaders def GetRoleHeaders(self): header = [GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberName'), GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberBase')] for column in self.roleGroupings[self.GetSelectedState()].columns: columnName, subColumns = column colName = ReplaceStringWithTags(columnName) header.append(colName) return header def ChangeState(self, selectedState): selectedBtn = self.roleGroupsBtns.GetSelected() isSearchedOrClearedOrBrowsed = self.isSearched or self.isCleared or self.isBrowsed if self.lastClickedBtn == selectedBtn and not isSearchedOrClearedOrBrowsed: return self.lastClickedBtn = selectedBtn if len(self.GetNodesToUpdate()): if eve.Message('CrpMembersSaveChanges', {}, uiconst.YESNO) == uiconst.ID_YES: self.SaveChanges() else: for node in self.GetNodesToUpdate(): self.ClearRoleChanges(node) settings.user.ui.Set('selectedRoleGroupState', selectedState) self.isCleared = False self.isSearched = False self.isBrowsed = False uthread.new(self.UpdateScroll, selectedState) def GetBaseOptions(self): offices = self.corpSvc.GetMyCorporationsOffices() offices.Fetch(0, len(offices)) bases = [('-', None)] if offices: for office in offices: if util.IsStation(office.locationID): bases.append((cfg.evelocations.Get(office.locationID).locationName, office.locationID)) return bases def UpdateScroll(self, selectedState): if selectedState == ACCESS: self.roleScroll.display = False self.titlesScroll.display = False self.accessScroll.display = True self.LoadAccessScroll() elif selectedState == GROUPS: self.roleScroll.display = False self.accessScroll.display = False self.titlesScroll.display = True self.LoadTitlesScroll() else: self.accessScroll.display = False self.titlesScroll.display = False self.roleScroll.display = True self.LoadRolesScroll() def GetScrollList(self, decoClass, sortFunction, roleGroup = None, titles = None, divisionNames = None): scrollList = [] for member in self.membersToShow: scrollList.append(Bunch(decoClass=decoClass, member=member, charID=member.characterID, corp=self.corp, label=cfg.eveowners.Get(member.characterID).ownerName, roleGroup=roleGroup, GetSortValue=sortFunction, roleGroupings=self.roleGroupings, myBaseID=self.myBaseID, myGrantableRoles=self.myGrantableRoles, titles=titles, divisionNames=divisionNames, bases=self.bases)) blue.pyos.BeNice() if self.destroyed: return scrollList return scrollList def GetHeaderSortValue(self, node, columnID, sortDirection, idx = None): sortValue = (0, None) if sortDirection: sortValue = (1000, None) node.Set('sort_%s' % columnID, sortValue) return self.GetSortValue(node, columnID, sortDirection, idx=None) def GetAccessSortValue(self, node, columnID, sortDirection, idx = None): self.SetNameAndBaseSorting(node) if node.Get('sort_%s' % columnID, None) is None: roleGrouping = self.roleGroupings totalValue = 0 for divisionID in xrange(4, 10): roleGroup = roleGrouping[divisionID] rolesAppliesTo = getattr(node.member, roleGroup.appliesTo) grantableRolesAppliesTo = getattr(node.member, roleGroup.appliesToGrantable) if self.CheckIfDirectorOrCEO(node, node.member.roles): rolesAppliesTo |= roleGroup.roleMask grantableRolesAppliesTo |= roleGroup.roleMask for columnName, subColumns in roleGroup.columns: if columnName.replace(' ', '') != StripTags(columnID).replace(' ', ''): continue for _, role in subColumns: checkValue = GetCheckStateForRole(rolesAppliesTo, grantableRolesAppliesTo, role) totalValue += checkValue node.Set('sort_%s' % columnID, (0, totalValue)) return self.GetSortValue(node, columnID, sortDirection, idx=None) def GetTitlesSortValue(self, node, columnID, sortDirection, idx = None): self.SetNameAndBaseSorting(node) if node.Get('sort_%s' % columnID, None) is None: for title in sorted(self.titles.itervalues(), key=lambda x: x.titleID): isChecked = node.member.titleMask & title.titleID == title.titleID node.Set('sort_%s' % title.titleName, (0, isChecked)) return self.GetSortValue(node, columnID, sortDirection, idx=None) def GetRolesSortValue(self, node, columnID, sortDirection, idx = None): self.SetNameAndBaseSorting(node) if node.Get('sort_%s' % columnID, None) is None: roles = getattr(node.member, node.roleGroup.appliesTo) grantableRoles = getattr(node.member, node.roleGroup.appliesToGrantable) if self.CheckIfDirectorOrCEO(node, roles): roles |= node.roleGroup.roleMask grantableRoles |= node.roleGroup.roleMask for columnName, subColumns in node.roleGroup.columns: for subColumnName, role in subColumns: if columnName.replace(' ', '') == StripTags(columnID).replace(' ', ''): checkValue = GetCheckStateForRole(roles, grantableRoles, role) node.Set('sort_%s' % columnID, (0, checkValue)) return self.GetSortValue(node, columnID, sortDirection, idx=None) def CheckIfDirectorOrCEO(self, node, roles): isCEO = node.member.characterID == node.corp.ceoID isDirector = roles & const.corpRoleDirector == const.corpRoleDirector return isDirector or isCEO def GetSortValue(self, node, columnID, sortDirection, idx = None): return node.Get('sort_%s' % columnID, (0, 0)) def SetNameAndBaseSorting(self, node): node.Set('sort_%s' % GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberName'), (0, node.charLabel)) if node.member and node.member.baseID: locationName = cfg.evelocations.Get(node.member.baseID).locationName else: locationName = '' node.Set('sort_%s' % GetByLabel('UI/Corporations/CorporationWindow/Members/CorpMemberBase'), (0, locationName)) def GetTitlesScrollList(self): titles = self.corpSvc.GetTitles() return self.GetScrollList(TitleEntry, self.GetTitlesSortValue, titles=titles) def GetRolesScrollList(self): roleGroup = self.roleGroupings[self.GetSelectedState()] return self.GetScrollList(RoleEntry, self.GetRolesSortValue, roleGroup) def GetAccessScrollList(self): divisionNames = self.corpSvc.GetDivisionNames() scrollList = [Bunch(decoClass=RoleHeaderEntry, member=None, GetSortValue=self.GetHeaderSortValue)] scrollList.extend(self.GetScrollList(RoleAccessEntry, self.GetAccessSortValue, divisionNames=divisionNames)) return scrollList def HaveRolesChanged(self, node): if node.rec.roles != node.rec.oldRoles: return True if node.rec.grantableRoles != node.rec.oldGrantableRoles: return True if node.rec.rolesAtHQ != node.rec.oldRolesAtHQ: return True if node.rec.grantableRolesAtHQ != node.rec.oldGrantableRolesAtHQ: return True if node.rec.rolesAtBase != node.rec.oldRolesAtBase: return True if node.rec.grantableRolesAtBase != node.rec.oldGrantableRolesAtBase: return True if node.rec.rolesAtOther != node.rec.oldRolesAtOther: return True if node.rec.grantableRolesAtOther != node.rec.oldGrantableRolesAtOther: return True if node.rec.baseID != node.rec.oldBaseID: return True if node.rec.titleMask != node.rec.oldTitleMask: return True return False def GetNodesToUpdate(self): nodesToUpdate = [] try: sm.GetService('loading').Cycle(GetByLabel('UI/Common/PreparingToUpdate')) nodesToUpdate.extend(self.GetNodesList(self.accessScroll.GetNodes())) nodesToUpdate.extend(self.GetNodesList(self.roleScroll.GetNodes())) nodesToUpdate.extend(self.GetNodesList(self.titlesScroll.GetNodes())) finally: sm.GetService('loading').StopCycle() return nodesToUpdate def GetNodesList(self, nodesList): nodesToUpdate = [] for node in nodesList: if not node or not node.rec: continue if self.HaveRolesChanged(node): nodesToUpdate.append(node) return nodesToUpdate def _CreateRowsToUpdate(self, node): entry = node.rec characterID = entry.characterID roles = entry.roles grantableRoles = entry.grantableRoles rolesAtHQ = entry.rolesAtHQ grantableRolesAtHQ = entry.grantableRolesAtHQ rolesAtBase = entry.rolesAtBase grantableRolesAtBase = entry.grantableRolesAtBase rolesAtOther = entry.rolesAtOther grantableRolesAtOther = entry.grantableRolesAtOther baseID = entry.baseID titleMask = entry.titleMask if entry.titleMask == entry.oldTitleMask: titleMask = None if roles & const.corpRoleDirector == const.corpRoleDirector: roles = const.corpRoleDirector grantableRoles = 0 rolesAtHQ = 0 grantableRolesAtHQ = 0 rolesAtBase = 0 grantableRolesAtBase = 0 rolesAtOther = 0 grantableRolesAtOther = 0 row = [characterID, None, None, None, roles, grantableRoles, rolesAtHQ, grantableRolesAtHQ, rolesAtBase, grantableRolesAtBase, rolesAtOther, grantableRolesAtOther, baseID, titleMask] return row def ClearRoleChanges(self, node): node.rec.roles = node.rec.oldRoles node.rec.grantableRoles = node.rec.oldGrantableRoles node.rec.rolesAtHQ = node.rec.oldRolesAtHQ node.rec.grantableRolesAtHQ = node.rec.oldGrantableRolesAtHQ node.rec.rolesAtBase = node.rec.oldRolesAtBase node.rec.grantableRolesAtBase = node.rec.oldGrantableRolesAtBase node.rec.rolesAtOther = node.rec.oldRolesAtOther node.rec.grantableRolesAtOther = node.rec.oldGrantableRolesAtOther node.rec.baseID = node.rec.oldBaseID node.rec.titleMask = node.rec.oldTitleMask def UpdateOldRolesForNode(self, node): node.rec.oldRoles = node.rec.roles node.rec.oldGrantableRoles = node.rec.grantableRoles node.rec.oldRolesAtHQ = node.rec.rolesAtHQ node.rec.oldGrantableRolesAtHQ = node.rec.grantableRolesAtHQ node.rec.oldRolesAtBase = node.rec.rolesAtBase node.rec.oldGrantableRolesAtBase = node.rec.grantableRolesAtBase node.rec.oldRolesAtOther = node.rec.rolesAtOther node.rec.oldGrantableRolesAtOther = node.rec.grantableRolesAtOther node.rec.oldBaseID = node.rec.baseID node.rec.oldTitleMask = node.rec.titleMask def SaveChanges(self, *args): nodesToUpdate = self.GetNodesToUpdate() nCount = len(nodesToUpdate) if nCount == 0: return try: sm.GetService('loading').ProgressWnd(GetByLabel('UI/Common/Updating'), '', 0, nCount) blue.pyos.synchro.Yield() rows = None myRow = None for node in nodesToUpdate: row = self._CreateRowsToUpdate(node) if node.rec.characterID == eve.session.charid: if myRow is None: myRow = Rowset(self.GetRowHeader()) myRow.append(row) else: if rows is None: rows = Rowset(self.GetRowHeader()) rows.append(row) if rows is not None: self.corpSvc.UpdateMembers(rows) sm.ScatterEvent('OnRoleEdit', rows) if myRow is not None: sm.GetService('sessionMgr').PerformSessionChange('corp.UpdateMembers', self.corpSvc.UpdateMembers, myRow) finally: if nCount: for node in nodesToUpdate: self.UpdateOldRolesForNode(node) sm.GetService('loading').ProgressWnd(GetByLabel('UI/Common/Updated'), '', nCount - 1, nCount) blue.pyos.synchro.SleepWallclock(500) sm.GetService('loading').ProgressWnd(GetByLabel('UI/Common/Updated'), '', nCount, nCount) blue.pyos.synchro.Yield() def GetRowHeader(self): return ['characterID', 'title', 'divisionID', 'squadronID', 'roles', 'grantableRoles', 'rolesAtHQ', 'grantableRolesAtHQ', 'rolesAtBase', 'grantableRolesAtBase', 'rolesAtOther', 'grantableRolesAtOther', 'baseID', 'titleMask'] def OnTabDeselect(self): if not self.sr.Get('inited', 0): return if len(self.GetNodesToUpdate()): if eve.Message('CrpMembersSaveChanges', {}, uiconst.YESNO) == uiconst.ID_YES: self.SaveChanges()
class SkillsPanel(Container): default_name = 'SkillsPanel' __notifyevents__ = [ 'OnAttribute', 'OnGodmaItemChange', 'OnSkillQueueRefreshed', 'OnFreeSkillPointsChanged_Local', 'OnSkillsChanged', 'OnSkillQueueChanged' ] def ApplyAttributes(self, attributes): Container.ApplyAttributes(self, attributes) sm.RegisterNotify(self) self.ConstructTopCont() if not IsSkillInjectorBannerDismissed(): SkillInjectorBanner(parent=self, align=uiconst.TOTOP, padding=(4, 4, 4, 4)) self.scroll = Scroll(parent=self, padding=(0, 4, 0, 4)) self.scroll.sr.id = 'charsheet_skills' self.skilltabs = TabGroup( name='tabparent', parent=self, idx=0, tabs= [[ GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/Skills'), self.scroll, self, PANEL_SKILLS_SKILLS ], [ GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/CertTabs/Certificates' ), self.scroll, self, PANEL_SKILLS_CERTIFICATES ], [ GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/History' ), self.scroll, self, PANEL_SKILLS_HISTORY ]], groupID='cs_skills', UIIDPrefix='characterSheetTab') def ConstructTopCont(self): self.topCont = Container(name='topCont', parent=self, align=uiconst.TOTOP, height=24) UtilMenu(parent=self.topCont, align=uiconst.CENTERLEFT, menuAlign=uiconst.BOTTOMLEFT, GetUtilMenu=self.GetSkillSettingsMenu, texturePath='res:/UI/Texture/SettingsCogwheel.png', width=16, height=16, iconSize=18) self.quickFilter = QuickFilterEdit(parent=self.topCont, align=uiconst.CENTERLEFT, width=80, left=18) self.quickFilter.ReloadFunction = self.QuickFilterReload btn = Button( parent=self.topCont, align=uiconst.CENTERRIGHT, label=GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/OpenTrainingQueue' ), func=self.OpenSkillQueueWindow, name='characterSheetOpenTrainingQueue') def OpenSkillQueueWindow(self, *args): uicore.cmd.OpenSkillQueueWindow() def SelectTab(self, panelID): self.skilltabs.SelectByID(panelID) def LoadPanel(self): self.ResetQuickFilter(triggerCallback=False) self.skilltabs.AutoSelect() def ResetQuickFilter(self, triggerCallback=True): self.quickFilter.SetValue('', docallback=triggerCallback) def ShowMySkillHistory(self): def GetPts(lvl): return charskills.GetSPForLevelRaw(stc, lvl) self.topCont.Hide() self.scroll.sr.id = 'charsheet_skillhistory' rs = sm.GetService('skills').GetSkillHistory() scrolllist = [] actions = { const.skillEventClonePenalty: GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillClonePenalty' ), const.skillEventTrainingStarted: GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillTrainingStarted' ), const.skillEventTrainingComplete: GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillTrainingComplete' ), const.skillEventTrainingCancelled: GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillTrainingCanceled' ), const.skillEventGMGive: GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/GMGiveSkill' ), const.skillEventQueueTrainingCompleted: GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillTrainingComplete' ), const.skillEventFreeSkillPointsUsed: GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillPointsApplied' ), const.skillEventSkillExtracted: GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillLevelExtracted' ) } for r in rs: skill = sm.GetService('skills').GetSkill(r.skillTypeID) if skill: stc = skill.skillRank levels = [ 0, GetPts(1), GetPts(2), GetPts(3), GetPts(4), GetPts(5) ] level = 5 for i in range(len(levels)): if levels[i] > r.absolutePoints: level = i - 1 break data = KeyVal() data.label = FmtDate(r.logDate, 'ls') + '<t>' data.label += evetypes.GetName(r.skillTypeID) + '<t>' data.label += actions.get( r.eventTypeID, GetByLabel('UI/Generic/Unknown')) + '<t>' data.label += FormatNumeric(level) data.Set('sort_%s' % GetByLabel('UI/Common/Date'), r.logDate) data.id = r.skillTypeID data.level = level data.GetMenu = self.GetItemMenu data.MenuFunction = self.GetItemMenu data.OnDblClick = (self.DblClickShowInfo, data) addItem = entries.Get('Generic', data=data) scrolllist.append(addItem) self.scroll.Load( contentList=scrolllist, headers=[ GetByLabel('UI/Common/Date'), GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/Skill'), GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/Action'), GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/Level') ], noContentHint=GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/NoRecordsFound' ), reversesort=True) def GetItemMenu(self, entry, *args): return [(GetByLabel('UI/Common/ShowInfo'), self.ShowInfo, (entry.sr.node.id, 1))] def ShowInfo(self, *args): skillID = args[0] sm.StartService('info').ShowInfo(skillID, None) def DblClickShowInfo(self, otherSelf, nodeData): skillTypeID = getattr(nodeData, 'id', None) if skillTypeID is not None: self.ShowInfo(skillTypeID) @telemetry.ZONE_METHOD def Load(self, key): if key == PANEL_SKILLS_SKILLS: self.ShowMySkills(force=True) LogOpenCharacterSkills() elif key == PANEL_SKILLS_CERTIFICATES: self.ShowCertificates() elif key == PANEL_SKILLS_HISTORY: self.ShowMySkillHistory() def ShowCertificates(self): self.topCont.Show() showOnlyMine = settings.user.ui.Get('charsheet_showOnlyMyCerts', False) scrolllist = [] myCategories = sm.GetService( 'certificates').GetMyCertificatesByCategoryID() allCategories = sm.GetService( 'certificates').GetAllCertificatesByCategoryID() if showOnlyMine: visibleCategories = myCategories else: visibleCategories = allCategories myFilter = self.quickFilter.GetValue() for groupID, certificates in visibleCategories.iteritems(): if len(myFilter): certificates = NiceFilter(self.FilterCertificates, certificates[:]) if len(certificates) == 0: continue label = GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/CertTabs/CertificateGroupWithCount', groupName=evetypes.GetGroupNameByGroup(groupID), certificatesCompleted=len(myCategories[groupID]), certificatesTotal=len(allCategories[groupID])) data = { 'GetSubContent': self.GetCertSubContent, 'label': label, 'groupItems': certificates, 'id': ('charsheetGroups_cat', groupID), 'sublevel': 0, 'showlen': 0, 'showicon': 'hide', 'state': 'locked', 'forceOpen': bool(myFilter) } scrolllist.append(entries.Get('Group', data)) scrolllist = localization.util.Sort(scrolllist, key=lambda x: x.label) self.scroll.sr.id = 'charsheet_mycerts' contentHint = GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/CertTabs/NoCertificatesFound' ) self.scroll.Load(contentList=scrolllist, noContentHint=contentHint) def FilterCertificates(self, certificate): filterVal = self.quickFilter.GetValue().lower() return certificate.GetName().lower().find(filterVal) + 1 def GetCertSubContent(self, dataX, *args): toggleGroups = settings.user.ui.Get( 'charsheet_toggleOneCertGroupAtATime', 1) if toggleGroups and not dataX.forceOpen: dataWnd = Window.GetIfOpen(windowID=unicode(dataX.id)) if not dataWnd: for entry in self.scroll.GetNodes(): if entry.__guid__ != 'listentry.Group' or entry.id == dataX.id: continue if entry.open: if entry.panel: entry.panel.Toggle() else: uicore.registry.SetListGroupOpenState(entry.id, 0) entry.scroll.PrepareSubContent(entry) entries = self.GetCertificateEntries(dataX) return entries def GetCertificateEntries(self, data, *args): scrolllist = [self.CreateCertificateEntry(d) for d in data.groupItems] return localization.util.Sort(scrolllist, key=lambda x: x.label) def CreateCertificateEntry(self, certificate, *args): level = certificate.GetLevel() certificate = KeyVal( label=certificate.GetName(), certID=certificate.certificateID, level=level, iconID='res:/UI/Texture/Classes/Certificates/level%sSmall.png' % level) return entries.Get(data=certificate, decoClass=CertEntryBasic) @telemetry.ZONE_METHOD def ShowMySkills(self, force=False): if not force and self.skilltabs.GetSelectedID() != PANEL_SKILLS_SKILLS: return self.topCont.Show() advancedView = settings.user.ui.Get('charsheet_showSkills', 'trained') in ('mytrainable', 'alltrainable') groups = sm.GetService('skills').GetSkillGroups(advancedView) scrolllist = [] skillCount = sm.GetService('skills').GetSkillCount() skillPoints = sm.StartService('skills').GetFreeSkillPoints() if skillPoints > 0: text = '<color=0xFF00FF00>' + GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/UnAllocatedSkillPoints', skillPoints=skillPoints) + '</color>' hint = GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/ApplySkillHint' ) scrolllist.append(entries.Get('Text', { 'text': text, 'hint': hint })) currentSkillPoints = 0 for group, skills, untrained, intraining, inqueue, points in groups: currentSkillPoints += points skillText = GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/YouCurrentlyHaveSkills', numSkills=skillCount, currentSkillPoints=currentSkillPoints) scrolllist.append(entries.Get('Text', {'text': skillText})) @telemetry.ZONE_METHOD def Published(skill): return evetypes.IsPublished(skill.typeID) for group, skills, untrained, intraining, inqueue, points in groups: untrained = filter(Published, untrained) if not len(skills) and not advancedView: continue tempList = [] if advancedView and settings.user.ui.Get( 'charsheet_showSkills', 'trained') == 'mytrainable': for utrained in untrained[:]: isSkillReqMet = sm.GetService( 'skills').IsSkillRequirementMet(utrained.typeID) isTrialRestricted = sm.GetService( 'skills').IsTrialRestricted(utrained.typeID) if isSkillReqMet and not isTrialRestricted: tempList.append(utrained) combinedSkills = skills[:] + tempList[:] if not len(skills) and tempList == []: continue if settings.user.ui.Get('charsheet_showSkills', 'trained') == 'alltrainable': combinedSkills = skills[:] + untrained[:] numInQueueLabel = '' label = None if len(inqueue): if len(intraining): labelPath = 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillsInQueueTraining' else: labelPath = 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillsInQueue' numInQueueLabel = GetByLabel(labelPath, skillsInQueue=len(inqueue)) if advancedView: label = GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillGroupOverviewAdvanced', groupName=group.groupName, skills=len(skills), totalSkills=len(combinedSkills), points=points, skillsInQueue=numInQueueLabel) else: label = GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/SkillGroupOverviewSimple', groupName=group.groupName, skills=len(skills), points=points, skillsInQueue=numInQueueLabel) combinedSkills = skills[:] if settings.user.ui.Get('charsheet_hideLevel5Skills', False) == True: for skill in skills: if skill.skillLevel == 5: combinedSkills.remove(skill) if settings.user.ui.Get('charsheet_hideUntrainedSkills', False) == True: combinedSkills = filter(lambda s: s.skillPoints > 0, combinedSkills) myFilter = self.quickFilter.GetValue() if len(myFilter): combinedSkills = NiceFilter(self.quickFilter.QuickFilter, combinedSkills) if len(combinedSkills) == 0: continue data = { 'GetSubContent': self.GetSubContent, 'DragEnterCallback': self.OnGroupDragEnter, 'DeleteCallback': self.OnGroupDeleted, 'MenuFunction': self.GetMenu, 'label': label, 'groupItems': combinedSkills, 'inqueue': inqueue, 'id': ('myskills', group.groupID), 'tabs': [], 'state': 'locked', 'showicon': 'hide', 'showlen': 0, 'forceOpen': bool(myFilter) } scrolllist.append(entries.Get('Group', data)) scrolllist.append(entries.Get('Space', {'height': 64})) pos = self.scroll.GetScrollProportion() self.scroll.sr.id = 'charsheet_myskills' self.scroll.Load(contentList=scrolllist, headers=[], scrollTo=pos) @telemetry.ZONE_METHOD def GetSubContent(self, data, *args): scrolllist = [] skillQueueSvc = sm.GetService('skillqueue') skillqueue = skillQueueSvc.GetServerQueue() skillqueue = {(x.trainingTypeID, x.trainingToLevel): idx for idx, x in enumerate(skillqueue)} mySkills = sm.GetService('skills').GetSkills() skillsInQueue = data.inqueue skillInTraining = skillQueueSvc.SkillInTraining() toggleGroups = settings.user.ui.Get( 'charsheet_toggleOneSkillGroupAtATime', 1) if toggleGroups and not data.forceOpen: dataWnd = Window.GetIfOpen(unicode(data.id)) if not dataWnd: for entry in self.scroll.GetNodes(): if entry.__guid__ != 'listentry.Group' or entry.id == data.id: continue if entry.open: if entry.panel: entry.panel.Toggle() else: uicore.registry.SetListGroupOpenState(entry.id, 0) entry.scroll.PrepareSubContent(entry) skillsInGroup = localization.util.Sort( data.groupItems, key=lambda x: evetypes.GetName(x.typeID)) for skill in skillsInGroup: inQueue = None if skill.typeID in skillsInQueue: for i in xrange(5, skill.skillLevel, -1): if (skill.typeID, i) in skillqueue: inQueue = i break inTraining = 0 if skillInTraining and skill.typeID == skillInTraining.typeID: inTraining = 1 data = { 'invtype': skill.typeID, 'skill': skill, 'trained': skill.typeID in mySkills, 'plannedInQueue': inQueue, 'skillID': skill.typeID, 'inTraining': inTraining } scrolllist.append(entries.Get('SkillEntry', data)) return scrolllist def OnGroupDeleted(self, ids): pass def OnGroupDragEnter(self, group, drag): pass def GetMenu(self, *args): return [] def QuickFilterReload(self): self._ReloadSkillTabs() def _ReloadSkillTabs(self): tabID = self.skilltabs.GetSelectedID() if tabID == PANEL_SKILLS_SKILLS: self.ShowMySkills() elif tabID == PANEL_SKILLS_CERTIFICATES: self.ShowCertificates() elif tabID == PANEL_SKILLS_HISTORY: uthread.new(self.ShowMySkillHistory) def OnAttribute(self, attributeName, item, value): if attributeName == 'skillPoints': self._ReloadSkillTabs() def OnGodmaItemChange(self, item, change): if const.ixFlag in change and item.categoryID == const.categorySkill: self._ReloadSkillTabs() def OnSkillQueueRefreshed(self): self._ReloadSkillTabs() def OnFreeSkillPointsChanged_Local(self): self._ReloadSkillTabs() def OnSkillsChanged(self, *args): self._ReloadSkillTabs() def OnSkillQueueChanged(self): self._ReloadSkillTabs() def GetSkillSettingsMenu(self, menuParent): if self.skilltabs.GetSelectedID() == PANEL_SKILLS_SKILLS: return self.GetSkillSkillSettingsMenu(menuParent) else: return self.GetSkillCertSettingsMenu(menuParent) def GetSkillSkillSettingsMenu(self, menuParent): menuParent.AddRadioButton(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/ShowOnlyCurrentSkills' ), checked=settings.user.ui.Get( 'charsheet_showSkills', 'trained') == 'trained', callback=self.SetShowSkillsTrained) menuParent.AddRadioButton(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/ShowOnlyTrainableSkills' ), checked=settings.user.ui.Get( 'charsheet_showSkills', 'trained') == 'mytrainable', callback=self.SetShowSkillsMyTrainable) menuParent.AddRadioButton(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/ShowAllSkills'), checked=settings.user.ui.Get( 'charsheet_showSkills', 'trained') == 'alltrainable', callback=self.SetShowSkillsAll) menuParent.AddDivider() menuParent.AddCheckBox(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/HighlightPartiallyTrainedSkills' ), checked=settings.user.ui.Get( 'charsheet_hilitePartiallyTrainedSkills', False), callback=self. ToggleHighlightPartiallyTrainedSkills) menuParent.AddCheckBox(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/ToggleOneSkillGroupAtATime' ), checked=settings.user.ui.Get( 'charsheet_toggleOneSkillGroupAtATime', False), callback=self.ToggleOneSkillGroup) menuParent.AddCheckBox(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/HideLvl5'), checked=settings.user.ui.Get( 'charsheet_hideLevel5Skills', False), callback=self.ToggleHideLevel5Skills) menuParent.AddCheckBox(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/HideUntrained'), checked=settings.user.ui.Get( 'charsheet_hideUntrainedSkills', False), callback=self.ToggleHideUntrainedSkills) def SetShowSkillsTrained(self): settings.user.ui.Set('charsheet_showSkills', 'trained') self.ShowMySkills() def SetShowSkillsMyTrainable(self): settings.user.ui.Set('charsheet_showSkills', 'mytrainable') self.ShowMySkills() def SetShowSkillsAll(self): settings.user.ui.Set('charsheet_showSkills', 'alltrainable') self.ShowMySkills() def ToggleHighlightPartiallyTrainedSkills(self): current = settings.user.ui.Get( 'charsheet_hilitePartiallyTrainedSkills', False) settings.user.ui.Set('charsheet_hilitePartiallyTrainedSkills', not current) self.ShowMySkills() def ToggleOneSkillGroup(self): current = settings.user.ui.Get('charsheet_toggleOneSkillGroupAtATime', False) settings.user.ui.Set('charsheet_toggleOneSkillGroupAtATime', not current) self.ShowMySkills() def ToggleHideLevel5Skills(self): current = settings.user.ui.Get('charsheet_hideLevel5Skills', False) settings.user.ui.Set('charsheet_hideLevel5Skills', not current) self.ShowMySkills() def ToggleHideUntrainedSkills(self): current = settings.user.ui.Get('charsheet_hideUntrainedSkills', False) settings.user.ui.Set('charsheet_hideUntrainedSkills', not current) self.ShowMySkills() def GetSkillCertSettingsMenu(self, menuParent): menuParent.AddCheckBox(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/SkillTabs/ToggleShowOnlyMyCertificates' ), checked=settings.user.ui.Get( 'charsheet_showOnlyMyCerts', False), callback=self.ToggleShowOnlyMyCerts) menuParent.AddCheckBox(text=localization.GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/CertTabs/ToggleOneCertificationGroupAtATime' ), checked=settings.user.ui.Get( 'charsheet_toggleOneCertGroupAtATime', True), callback=self.ToggleOneCertGroup) def ToggleShowOnlyMyCerts(self): current = settings.user.ui.Get('charsheet_showOnlyMyCerts', False) settings.user.ui.Set('charsheet_showOnlyMyCerts', not current) self.ShowCertificates() def ToggleOneCertGroup(self): current = settings.user.ui.Get('charsheet_toggleOneCertGroupAtATime', True) settings.user.ui.Set('charsheet_toggleOneCertGroupAtATime', not current) self.ShowCertificates() def HighlightSkillHistorySkills(self, skillTypeIds): self.DeselectAllNodes() blue.pyos.synchro.SleepWallclock(500) skillTypeIds = skillTypeIds[:] for node in self.scroll.GetNodes(): recordKey = (node.id, node.level) if recordKey in skillTypeIds: self.scroll._SelectNode(node) skillTypeIds.remove(recordKey) def DeselectAllNodes(self): for node in self.scroll.GetNodes(): self.scroll._DeselectNode(node)
class DecorationsPanel(Container): default_name = 'DecorationsPanel' __notifyevents__ = [ 'OnRankChange', 'OnUpdatedMedalsAvailable', 'OnUpdatedMedalStatusAvailable' ] def ApplyAttributes(self, attributes): Container.ApplyAttributes(self, attributes) btns = [(GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/SaveDecorationPermissionChanges' ), self.SaveDecorationPermissionsChanges, (), 64), (GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/SetAllDecorationPermissions' ), self.SetAllDecorationPermissions, (), 64)] self.mainAreaButtons = ContainerAutoSize(align=uiconst.TOBOTTOM, parent=self) ButtonGroup(btns=btns, parent=self.mainAreaButtons, line=False) self.decoMedalList = None self.decoRankList = None self.scroll = Scroll(parent=self, padding=(0, 4, 0, 4)) self.mydecorationstabs = TabGroup( name='tabparent', parent=self, idx=0, tabs= [[ GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Ranks'), self.scroll, self, PANEL_RANKS ], [ GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Medals'), self.scroll, self, PANEL_MEDALS ], [ GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Permissions' ), self.scroll, self, PANEL_PERMISSIONS ]], groupID='cs_decorations') def LoadPanel(self, *args): self.mydecorationstabs.AutoSelect() def SaveDecorationPermissionsChanges(self): promptForDelete = False changes = {} for entry in self.scroll.GetNodes(): if entry.panel and hasattr(entry.panel, 'flag'): if entry.panel.HasChanged(): if entry.panel.flag == 1: promptForDelete = True changes[entry.panel.sr.node.itemID] = entry.panel.flag if promptForDelete == False or uicore.Message( 'DeleteMedalConfirmation', {}, uiconst.YESNO) == uiconst.ID_YES: if len(changes) > 0: sm.StartService('medals').SetMedalStatus(changes) self.decoMedalList = None def SetAllDecorationPermissions(self): permissionList = [ (GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Private'), 2), (GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Public'), 3) ] pickedPermission = ListWnd( permissionList, 'generic', GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/SetAllDecorationPermissions' ), GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/PilotLicense/SaveAllChangesImmediately' ), windowName='permissionPickerWnd') if not pickedPermission: return permissionID = pickedPermission[1] m, _ = sm.StartService('medals').GetMedalsReceived(session.charid) myDecos = [] for each in m: if each.status != 1: myDecos.append(each.medalID) myDecos = list(set(myDecos)) updateDict = {} for decoID in myDecos: updateDict[decoID] = permissionID if len(updateDict) > 0: sm.StartService('medals').SetMedalStatus(updateDict) self.decoMedalList = None self.ShowMyDecorations('mydecorations_permissions') def Load(self, key): self.ShowMyDecorations(key) def ShowMyDecorations(self, key=None): if key == PANEL_RANKS: self.ShowMyRanks() elif key == PANEL_MEDALS: self.ShowMyMedals() elif key == PANEL_PERMISSIONS: self.ShowMyDecorationPermissions() def ShowMyMedals(self, charID=None): self.mainAreaButtons.Hide() if charID is None: charID = session.charid if self.decoMedalList is None: self.decoMedalList = GetMedalScrollEntries(charID) self.scroll.sr.id = 'charsheet_mymedals' self.scroll.Load( contentList=self.decoMedalList, noContentHint=GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/NoMedals')) def ShowMyRanks(self): self.mainAreaButtons.Hide() if self.decoRankList is None: scrolllist = [] characterRanks = sm.StartService( 'facwar').GetCharacterRankOverview(session.charid) for characterRank in characterRanks: entry = sm.StartService('info').GetRankEntry(characterRank) if entry: scrolllist.append(entry) self.decoRankList = scrolllist[:] self.scroll.sr.id = 'charsheet_myranks' self.scroll.Load( contentList=self.decoRankList, noContentHint=GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/NoRanks')) def ShowMyDecorationPermissions(self): self.mainAreaButtons.Show() scrollHeaders = [ GetByLabel('UI/CharacterCreation/FirstName'), GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Private'), GetByLabel( 'UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Public'), GetByLabel('UI/PI/Common/Remove') ] self.scroll.sr.fixedColumns = { GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Private'): 60, GetByLabel('UI/CharacterSheet/CharacterSheetWindow/DecoTabs/Public'): 60 } self.scroll.sr.id = 'charsheet_decopermissions' self.scroll.Load(contentList=[], headers=scrollHeaders) self.scroll.OnColumnChanged = self.OnDecorationPermissionsColumnChanged publicDeco = sm.StartService('medals').GetMedalsReceivedWithFlag( session.charid, [3]) privateDeco = sm.StartService('medals').GetMedalsReceivedWithFlag( session.charid, [2]) ppKeys = [each for each in publicDeco.keys() + privateDeco.keys()] scrolllist = [] inMedalList = [] characterMedals, characterMedalInfo = sm.StartService( 'medals').GetMedalsReceived(session.charid) for characterMedal in characterMedals: medalID = characterMedal.medalID if medalID not in ppKeys: continue if medalID in inMedalList: continue inMedalList.append(medalID) details = characterMedalInfo.Filter('medalID') if details and details.has_key(medalID): details = details.get(medalID) entry = self.CreateDecorationPermissionsEntry(characterMedal) if entry: scrolllist.append(entry) self.scroll.Load(contentList=scrolllist, headers=scrollHeaders, noContentHint=GetByLabel('UI/Common/NothingFound')) self.OnDecorationPermissionsColumnChanged() def CreateDecorationPermissionsEntry(self, data): entry = { 'line': 1, 'label': data.title + '<t><t><t>', 'itemID': data.medalID, 'visibilityFlags': data.status, 'indent': 3, 'selectable': 0 } return entries.Get('DecorationPermissions', entry) def OnDecorationPermissionsColumnChanged(self, *args, **kwargs): for entry in self.scroll.GetNodes(): if entry.panel and getattr(entry.panel, 'OnColumnChanged', None): entry.panel.OnColumnChanged() def OnRankChange(self, oldrank, newrank): if not session.warfactionid: return self.decoRankList = None if self.display: self.LoadPanel() def OnUpdatedMedalsAvailable(self): self.ReloadMedals() def OnUpdatedMedalStatusAvailable(self): self.ReloadMedals() def ReloadMedals(self): self.decoMedalList = None if self.display: self.LoadPanel()