Example #1
0
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
Example #2
0
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()
Example #3
0
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)
Example #4
0
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')
Example #5
0
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)
Example #6
0
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()
Example #7
0
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
Example #8
0
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)
Example #9
0
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()
Example #11
0
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)
Example #12
0
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()