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

contactsForm.py (29274B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\neocom\addressBook\contactsForm.py
      2 import math
      3 import eveicon
      4 from carbonui import AxisAlignment, uiconst
      5 from carbonui.button.const import HEIGHT_NORMAL
      6 from carbonui.control.buttonIcon import ButtonIcon
      7 from carbonui.control.dragResizeCont import DragResizeCont
      8 from carbonui.primitives.container import Container
      9 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     10 from carbonui.primitives.flowcontainer import FlowContainer
     11 from carbonui.util.various_unsorted import NiceFilter, SortListOfTuples
     12 from carbonui.control.checkbox import Checkbox
     13 from eve.client.script.parklife import states
     14 from eve.client.script.ui.control.entries.space import Space
     15 from eve.client.script.ui.control.entries.util import GetFromClass
     16 from eve.client.script.ui.control.listgroup import ListGroup
     17 from eve.client.script.ui.shared.neocom.addressBook import contactsConst
     18 from eve.client.script.ui.shared.neocom.addressBook.contactsConst import TAB_ALLIANCECONTACTS, TAB_CONTACTS, TAB_CORPCONTACTS
     19 from eve.client.script.ui.shared.neocom.addressBook.manageLabels import ManageLabels
     20 from eve.client.script.ui.control import eveLabel, eveScroll
     21 from eve.client.script.ui.shared.neocom.evemail import MailLabelEntry
     22 from eve.client.script.ui.shared.stateFlag import FlagIconWithState
     23 from eve.common.lib import appConst as const
     24 import localization
     25 from eve.client.script.ui.quickFilter import QuickFilterEdit
     26 from eve.common.script.sys import idCheckers
     27 from menu import MenuLabel
     28 from bannedwords.client import bannedwords
     29 CONTACTGROUPID_TO_STATEID = {const.contactHighStanding: states.flagStandingHigh,
     30  const.contactGoodStanding: states.flagStandingGood,
     31  const.contactNeutralStanding: states.flagStandingNeutral,
     32  const.contactBadStanding: states.flagStandingBad,
     33  const.contactHorribleStanding: states.flagStandingHorrible}
     34 
     35 class ContactListGroup(ListGroup):
     36 
     37     def _ConstructIcon(self):
     38         self.sr.icon = FlagIconWithState(parent=self, pos=(4, 0, 12, 12), state=uiconst.UI_DISABLED, align=uiconst.CENTERLEFT)
     39 
     40     def _LoadIconState(self):
     41         flagID = CONTACTGROUPID_TO_STATEID[self.sr.node.groupID]
     42         self.sr.icon.SetFlagID(flagID)
     43 
     44     def _LoadIconLeft(self):
     45         self.sr.icon.left = 6
     46 
     47     def _LoadLabelLeft(self):
     48         self.sr.label.left = 26
     49 
     50 
     51 class ContactsForm(Container):
     52     default_contactType = TAB_CONTACTS
     53     __notifyevents__ = ['OnContactChange',
     54      'OnUnblockContact',
     55      'OnNotificationsRefresh',
     56      'OnMessageChanged',
     57      'OnMyLabelsChanged',
     58      'OnEditLabel',
     59      'OnSetAllianceStanding',
     60      'OnSetCorpStanding']
     61 
     62     def ApplyAttributes(self, attributes):
     63         super(ContactsForm, self).ApplyAttributes(attributes)
     64         self.contactType = attributes.get('contactType', self.default_contactType)
     65         self.startPos = 0
     66         self.group = None
     67         self.isInitialized = False
     68 
     69     def Load(self, *args):
     70         self.LoadPanel()
     71 
     72     def LoadPanel(self):
     73         if self.isInitialized:
     74             return
     75         self.isInitialized = True
     76         self.mainCont = Container(name='mainCont', parent=self, align=uiconst.TOALL, pos=(0, 0, 0, 0))
     77         self.ConstructPaginationCont()
     78         systemStatsCont = DragResizeCont(name='systemStatsCont', settingsID='contactsListSplit1', parent=self.mainCont, align=uiconst.TOLEFT_PROP if self.contactType == TAB_CONTACTS else uiconst.TORIGHT_PROP, minSize=0.1, maxSize=0.5, defaultSize=0.33)
     79         self.leftCont = Container(name='leftCont', parent=systemStatsCont.mainCont)
     80         self.ConstructSearchAndLabelsBtn()
     81         self.ConstructNavigationScroll()
     82         self.ConstructScroll()
     83         self.LoadContactsForm()
     84         sm.RegisterNotify(self)
     85 
     86     def ConstructPaginationCont(self):
     87         self.paginationCont = ContainerAutoSize(name='paginationCont', parent=self.mainCont, idx=0, align=uiconst.TOBOTTOM, height=24)
     88         self.contactFwdBtn = ButtonIcon(parent=self.paginationCont, align=uiconst.TORIGHT, width=self.paginationCont.height, state=uiconst.UI_NORMAL, texturePath=eveicon.navigate_forward, iconSize=16, hint=localization.GetByLabel('UI/Common/Next'), func=self.OnFwdBtn)
     89         self.contactBackBtn = ButtonIcon(parent=self.paginationCont, align=uiconst.TORIGHT, width=self.paginationCont.height, state=uiconst.UI_NORMAL, texturePath=eveicon.navigate_back, iconSize=16, hint=localization.GetByLabel('UI/Common/Previous'), func=self.OnBackBtn)
     90         self.pageCount = eveLabel.EveLabelMedium(parent=ContainerAutoSize(parent=self.paginationCont, align=uiconst.TORIGHT, padRight=4), state=uiconst.UI_DISABLED, align=uiconst.CENTERLEFT)
     91 
     92     def OnFwdBtn(self):
     93         self.BrowseContacts(1)
     94 
     95     def OnBackBtn(self):
     96         self.BrowseContacts(-1)
     97 
     98     def ConstructScroll(self):
     99         self.scroll = eveScroll.Scroll(name='rightScroll', parent=self.mainCont, padding=(0, 8, 0, 0))
    100         self.scroll.sr.ignoreTabTrimming = 1
    101         self.scroll.multiSelect = 1
    102         self.scroll.sr.content.OnDropData = self.OnContactDropData
    103         self.scroll.sr.id = self.contactType
    104 
    105     def ConstructNavigationScroll(self):
    106         self.leftScroll = eveScroll.Scroll(name='leftScroll', parent=self.leftCont)
    107         self.leftScroll.multiSelect = 0
    108         self.leftScroll.sr.content.OnDropData = self.OnContactDropData
    109 
    110     def ConstructSearchAndLabelsBtn(self):
    111         topCont = FlowContainer(name='topCont', align=uiconst.TOTOP, parent=self.mainCont, height=HEIGHT_NORMAL, contentAlignment=AxisAlignment.END, contentSpacing=(16, 8))
    112         checkboxCont = ContainerAutoSize(name='checkboxCon', parent=topCont, height=HEIGHT_NORMAL)
    113         self.onlinecheck = Checkbox(text=localization.GetByLabel('UI/PeopleAndPlaces/OnlineOnly'), parent=checkboxCont, settingsKey='onlinebuddyonly', checked=settings.user.ui.Get('onlinebuddyonly', 0), callback=self.CheckBoxChange, align=uiconst.TORIGHT, padTop=4, wrapLabel=False)
    114         self.quickFilter = QuickFilterEdit(parent=topCont, isCharCorpOrAllianceField=True, callback=self.LoadContactsForm, width=120)
    115 
    116     def _OnClose(self):
    117         sm.UnregisterNotify(self)
    118 
    119     def LoadLeftSide(self):
    120         scrolllist = self.GetStaticLabelsGroups()
    121         scrolllist.insert(1, GetFromClass(Space, {'height': 16}))
    122         scrolllist.append(GetFromClass(Space, {'height': 16}))
    123         scrolllist.append(GetFromClass(LabelListGroup, {'GetSubContent': self.GetLabelsSubContent,
    124          'MenuFunction': self.LabelGroupMenu,
    125          'label': localization.GetByLabel('UI/PeopleAndPlaces/Labels'),
    126          'cleanLabel': localization.GetByLabel('UI/PeopleAndPlaces/Labels'),
    127          'id': ('contacts', 'Labels', localization.GetByLabel('UI/PeopleAndPlaces/Labels')),
    128          'state': 'locked',
    129          'BlockOpenWindow': 1,
    130          'showicon': eveicon.tag,
    131          'showlen': 0,
    132          'groupName': 'labels',
    133          'groupItems': [],
    134          'updateOnToggle': 0,
    135          'manage_labels_callback': self.ManageLabels}))
    136         self.leftScroll.Load(contentList=scrolllist)
    137         lastViewedID = self._GetLastViewedID()
    138         for entry in self.leftScroll.GetNodes():
    139             groupID = entry.groupID
    140             if groupID is None:
    141                 continue
    142             if groupID == lastViewedID:
    143                 panel = entry.panel
    144                 if panel is not None:
    145                     panel.OnClick()
    146                     return
    147 
    148         if len(self.leftScroll.GetNodes()) > 0:
    149             entry = self.leftScroll.GetNodes()[0]
    150             panel = entry.panel
    151             if panel is not None:
    152                 panel.OnClick()
    153 
    154     def GetStandingNameShort(self, standing):
    155         if standing == const.contactHighStanding:
    156             return localization.GetByLabel('UI/PeopleAndPlaces/StandingExcellent')
    157         if standing == const.contactGoodStanding:
    158             return localization.GetByLabel('UI/PeopleAndPlaces/StandingGood')
    159         if standing == const.contactNeutralStanding:
    160             return localization.GetByLabel('UI/PeopleAndPlaces/StandingNeutral')
    161         if standing == const.contactBadStanding:
    162             return localization.GetByLabel('UI/PeopleAndPlaces/StandingBad')
    163         if standing == const.contactHorribleStanding:
    164             return localization.GetByLabel('UI/PeopleAndPlaces/StandingTerrible')
    165 
    166     def GetLabelsSubContent(self, items):
    167         scrolllist = []
    168         myLabels = sm.GetService('addressbook').GetContactLabels(self.contactType)
    169         for each in myLabels.itervalues():
    170             if getattr(each, 'static', 0):
    171                 continue
    172             entryItem = self.CreateLabelEntry(each)
    173             scrolllist.append((each.name.lower(), entryItem))
    174 
    175         scrolllist = SortListOfTuples(scrolllist)
    176         scrolllist.insert(0, GetFromClass(MailLabelEntry, {'cleanLabel': localization.GetByLabel('UI/PeopleAndPlaces/NoLabel'),
    177          'label': '%s [%s]' % (localization.GetByLabel('UI/PeopleAndPlaces/NoLabel'), self.GetContactsLabelCount(-1)),
    178          'sublevel': 1,
    179          'currentView': -1,
    180          'OnClick': self.LoadGroupFromEntry,
    181          'groupID': -1}))
    182         return scrolllist
    183 
    184     def CreateLabelEntry(self, labelEntry):
    185         count = self.GetContactsLabelCount(labelEntry.labelID)
    186         return GetFromClass(MailLabelEntry, {'cleanLabel': labelEntry.name,
    187          'label': '%s [%s]' % (labelEntry.name, count),
    188          'sublevel': 1,
    189          'currentView': labelEntry.labelID,
    190          'OnClick': self.LoadGroupFromEntry,
    191          'GetMenu': self.GetLabelMenu,
    192          'OnDropData': self.OnGroupDropData,
    193          'groupID': labelEntry.labelID})
    194 
    195     def GetLabelMenu(self, entry):
    196         labelID = entry.sr.node.currentView
    197         m = []
    198         if sm.GetService('addressbook').ShowLabelMenuAndManageBtn(self.contactType):
    199             m.append((MenuLabel('UI/PeopleAndPlaces/LabelsRename'), sm.GetService('addressbook').RenameContactLabelFromUI, (labelID,)))
    200             m.append(None)
    201             m.append((MenuLabel('UI/PeopleAndPlaces/LabelsDelete'), sm.GetService('addressbook').DeleteContactLabelFromUI, (labelID, entry.sr.node.label)))
    202         return m
    203 
    204     def ManageLabels(self, *args):
    205         configName = '%s%s' % ('ManageLabels', self.contactType)
    206         ManageLabels.Open(windowID=configName, labelType=self.contactType)
    207 
    208     def GetStaticLabelsGroups(self):
    209         scrolllist = []
    210         labelList = [(localization.GetByLabel('UI/PeopleAndPlaces/AllContacts'), const.contactAll),
    211          (localization.GetByLabel('UI/PeopleAndPlaces/ExcellentStanding'), const.contactHighStanding),
    212          (localization.GetByLabel('UI/PeopleAndPlaces/GoodStanding'), const.contactGoodStanding),
    213          (localization.GetByLabel('UI/PeopleAndPlaces/NeutralStanding'), const.contactNeutralStanding),
    214          (localization.GetByLabel('UI/PeopleAndPlaces/BadStanding'), const.contactBadStanding),
    215          (localization.GetByLabel('UI/PeopleAndPlaces/TerribleStanding'), const.contactHorribleStanding)]
    216         if self.contactType == TAB_CONTACTS:
    217             labelList.append((localization.GetByLabel('UI/PeopleAndPlaces/Watchlist'), const.contactWatchlist))
    218             labelList.append((localization.GetByLabel('UI/PeopleAndPlaces/Blocked'), const.contactBlocked))
    219             labelList.insert(0, (localization.GetByLabel('UI/PeopleAndPlaces/Notifications'), const.contactNotifications))
    220         for label, groupID in labelList:
    221             entry = self.GetGroupEntry(groupID, label, selected=groupID == self._GetLastViewedID())
    222             scrolllist.append(entry)
    223 
    224         if self.contactType == TAB_CONTACTS:
    225             scrolllist.insert(-1, GetFromClass(Space, {'height': 16}))
    226         return scrolllist
    227 
    228     def _GetLastViewedID(self):
    229         if self.contactType == TAB_CONTACTS:
    230             lastViewedID = settings.char.ui.Get('contacts_lastselected', None)
    231         elif self.contactType == TAB_CORPCONTACTS:
    232             lastViewedID = settings.char.ui.Get('corpcontacts_lastselected', None)
    233         elif self.contactType == 'alliancecontact':
    234             lastViewedID = settings.char.ui.Get('alliancecontacts_lastselected', None)
    235         return lastViewedID
    236 
    237     def GetGroupEntry(self, groupID, label, selected = 0):
    238         cls = ContactListGroup if groupID in CONTACTGROUPID_TO_STATEID else ListGroup
    239         return GetFromClass(cls, {'GetSubContent': self.GetLeftGroups,
    240          'label': label,
    241          'cleanLabel': label,
    242          'id': ('contact', groupID),
    243          'state': 'locked',
    244          'BlockOpenWindow': 0,
    245          'disableToggle': 1,
    246          'expandable': 0,
    247          'showicon': 'hide',
    248          'iconID': contactsConst.iconByContactType.get(groupID, None),
    249          'showlen': 1,
    250          'groupItems': self.GetContactsCount(groupID),
    251          'hideNoItem': 1,
    252          'hideExpander': 1,
    253          'hideExpanderLine': 1,
    254          'selectGroup': 1,
    255          'isSelected': selected,
    256          'groupID': groupID,
    257          'OnClick': self.LoadGroupFromEntry})
    258 
    259     def LoadContactsForm(self, *args):
    260         if self.contactType == TAB_CONTACTS:
    261             self.onlinecheck.state = uiconst.UI_NORMAL
    262         else:
    263             self.onlinecheck.state = uiconst.UI_HIDDEN
    264         self.LoadData()
    265         self.LoadLeftSide()
    266 
    267     def UpdateTopContHeight(self):
    268         if self.contactType == TAB_CONTACTS:
    269             self.topCont.height = 45
    270         elif sm.GetService('addressbook').ShowLabelMenuAndManageBtn(self.contactType):
    271             self.topCont.height = 38
    272         else:
    273             self.topCont.height = 32
    274 
    275     def CheckInGroup(self, groupID, relationshipID):
    276         if groupID == const.contactHighStanding:
    277             if relationshipID > const.contactGoodStanding:
    278                 return True
    279         elif groupID == const.contactGoodStanding:
    280             if relationshipID > const.contactNeutralStanding and relationshipID <= const.contactGoodStanding:
    281                 return True
    282         elif groupID == const.contactNeutralStanding:
    283             if relationshipID == const.contactNeutralStanding:
    284                 return True
    285         elif groupID == const.contactBadStanding:
    286             if relationshipID < const.contactNeutralStanding and relationshipID >= const.contactBadStanding:
    287                 return True
    288         elif groupID == const.contactHorribleStanding:
    289             if relationshipID < const.contactBadStanding:
    290                 return True
    291         return False
    292 
    293     def CheckHasLabel(self, labelID, labelMask):
    294         if not labelMask and labelID == -1:
    295             return True
    296         elif labelMask & labelID == labelID:
    297             return True
    298         else:
    299             return False
    300 
    301     def LoadGroupFromEntry(self, entry, *args):
    302         group = entry.sr.node
    303         self.blockedSelected = False
    304         if self.group != group.groupID:
    305             self.startPos = 0
    306             self.group = group.groupID
    307         if group.groupID == const.contactBlocked:
    308             self.blockedSelected = True
    309         self.LoadGroupFromNode(group)
    310 
    311     def CheckIfAgent(self, contactID):
    312         if sm.GetService('agents').IsAgent(contactID):
    313             return True
    314         if idCheckers.IsNPC(contactID) and idCheckers.IsCharacter(contactID):
    315             return True
    316 
    317     def GetContactsLabelCount(self, labelID):
    318         contactList = []
    319         for contact in self.contacts:
    320             if self.CheckHasLabel(labelID, contact.labelMask):
    321                 contactList.append(contact.contactID)
    322 
    323         count = len(contactList)
    324         return count
    325 
    326     def GetContactsCount(self, groupID):
    327         contactList = []
    328         if groupID == const.contactBlocked:
    329             for blocked in self.blocked:
    330                 contactList.append(blocked.contactID)
    331 
    332         elif groupID == const.contactNotifications:
    333             for notification in self.notifications:
    334                 contactList.append(notification.notificationID)
    335 
    336         else:
    337             for contact in self.contacts:
    338                 if groupID == const.contactAll:
    339                     contactList.append(contact.contactID)
    340                 elif groupID == const.contactWatchlist:
    341                     if contact.inWatchlist:
    342                         contactList.append(contact.contactID)
    343                 elif groupID == const.contactHighStanding:
    344                     if contact.relationshipID > const.contactGoodStanding:
    345                         contactList.append(contact.contactID)
    346                 elif groupID == const.contactGoodStanding:
    347                     if contact.relationshipID > const.contactNeutralStanding and contact.relationshipID <= const.contactGoodStanding:
    348                         contactList.append(contact.contactID)
    349                 elif groupID == const.contactNeutralStanding:
    350                     if contact.relationshipID == const.contactNeutralStanding:
    351                         contactList.append(contact.contactID)
    352                 elif groupID == const.contactBadStanding:
    353                     if contact.relationshipID < const.contactNeutralStanding and contact.relationshipID >= const.contactBadStanding:
    354                         contactList.append(contact.contactID)
    355                 elif groupID == const.contactHorribleStanding:
    356                     if contact.relationshipID < const.contactBadStanding:
    357                         contactList.append(contact.contactID)
    358 
    359         return contactList
    360 
    361     def GetLabelName(self, labelID, *args):
    362         labels = sm.GetService('addressbook').GetContactLabels(self.contactType).values()
    363         if labelID == -1:
    364             return localization.GetByLabel('UI/PeopleAndPlaces/NoLabel')
    365         for label in labels:
    366             if labelID == label.labelID:
    367                 return label.name
    368 
    369     def GetScrolllist(self, data):
    370         scrolllist = []
    371         noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoContacts')
    372         onlineOnly = False
    373         headers = True
    374         reverse = False
    375         if self.contactType == TAB_CONTACTS:
    376             settings.char.ui.Set('contacts_lastselected', data.groupID)
    377             onlineOnly = settings.user.ui.Get('onlinebuddyonly', 0)
    378             noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoContacts')
    379         elif self.contactType == TAB_CORPCONTACTS:
    380             settings.char.ui.Set('corpcontacts_lastselected', data.groupID)
    381             noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoCorpContacts')
    382         elif self.contactType == 'alliancecontact':
    383             settings.char.ui.Set('alliancecontacts_lastselected', data.groupID)
    384             noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoAllianceContacts')
    385         if data.groupID == const.contactWatchlist:
    386             self.scroll.multiSelect = 1
    387             for contact in self.contacts:
    388                 if not self.CheckIfAgent(contact.contactID) and idCheckers.IsCharacter(contact.contactID) and contact.inWatchlist:
    389                     entryTuple = sm.GetService('addressbook').GetContactEntry(data, contact, onlineOnly, contactType=self.contactType, contactLevel=contact.relationshipID, labelMask=contact.labelMask)
    390                     if entryTuple is not None:
    391                         scrolllist.append(entryTuple)
    392 
    393             noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoneOnWatchlist')
    394         elif data.groupID == const.contactBlocked:
    395             self.scroll.multiSelect = 1
    396             for blocked in self.blocked:
    397                 if blocked.contactID > 0 and not self.CheckIfAgent(blocked.contactID):
    398                     entryTuple = sm.GetService('addressbook').GetContactEntry(data, blocked, onlineOnly, contactType=self.contactType)
    399                     if entryTuple is not None:
    400                         scrolllist.append(entryTuple)
    401 
    402             if sm.GetService('account').GetDefaultContactCost() == -1:
    403                 noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/UnknownBlocked')
    404             else:
    405                 noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoneBlockedYet')
    406         elif data.groupID == const.contactAll:
    407             self.scroll.multiSelect = 1
    408             for contact in self.contacts:
    409                 if not self.CheckIfAgent(contact.contactID):
    410                     entryTuple = sm.GetService('addressbook').GetContactEntry(data, contact, onlineOnly, contactType=self.contactType, contactLevel=contact.relationshipID, labelMask=contact.labelMask)
    411                     if entryTuple is not None:
    412                         scrolllist.append(entryTuple)
    413 
    414         elif data.groupID == const.contactNotifications:
    415             self.scroll.multiSelect = 0
    416             for notification in self.notifications:
    417                 scrolllist.append(sm.GetService('addressbook').GetNotifications(notification))
    418 
    419             headers = False
    420             reverse = True
    421             noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoNotifications')
    422         elif data.groupID in (const.contactGoodStanding,
    423          const.contactHighStanding,
    424          const.contactNeutralStanding,
    425          const.contactBadStanding,
    426          const.contactHorribleStanding):
    427             self.scroll.multiSelect = 1
    428             for contact in self.contacts:
    429                 if not self.CheckIfAgent(contact.contactID):
    430                     if self.CheckInGroup(data.groupID, contact.relationshipID):
    431                         entryTuple = sm.GetService('addressbook').GetContactEntry(data, contact, onlineOnly, contactType=self.contactType, contactLevel=contact.relationshipID, labelMask=contact.labelMask)
    432                         if entryTuple is not None:
    433                             scrolllist.append(entryTuple)
    434 
    435             standingText = self.GetStandingNameShort(data.groupID)
    436             if self.contactType == TAB_CONTACTS:
    437                 noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoContactsStanding', standingText=standingText)
    438             elif self.contactType == TAB_CORPCONTACTS:
    439                 noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoCorpContactsStanding', standingText=standingText)
    440             elif self.contactType == TAB_ALLIANCECONTACTS:
    441                 noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoAllianceContactsStanding', standingText=standingText)
    442         else:
    443             self.scroll.multiSelect = 1
    444             for contact in self.contacts:
    445                 if not self.CheckIfAgent(contact.contactID):
    446                     if self.CheckHasLabel(data.groupID, contact.labelMask):
    447                         entryTuple = sm.GetService('addressbook').GetContactEntry(data, contact, onlineOnly, contactType=self.contactType, contactLevel=contact.relationshipID, labelMask=contact.labelMask)
    448                         if entryTuple is not None:
    449                             scrolllist.append(entryTuple)
    450 
    451             noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoContactsLabel', standingText=self.GetLabelName(data.groupID))
    452         if onlineOnly:
    453             noContentHint = localization.GetByLabel('UI/PeopleAndPlaces/NoOnlineContact')
    454         if len(self.quickFilter.GetValue()):
    455             noContentHint = localization.GetByLabel('UI/Common/NothingFound')
    456         totalNum = len(scrolllist)
    457         for entryTuple in scrolllist:
    458             entryTuple[1]['showChatBubble'] = True
    459 
    460         scrolllist = SortListOfTuples(scrolllist, reverse)
    461         scrolllist = scrolllist[self.startPos:self.startPos + const.maxContactsPerPage]
    462         return (scrolllist,
    463          noContentHint,
    464          totalNum,
    465          headers)
    466 
    467     def LoadGroupFromNode(self, data, *args):
    468         if self.contactType == TAB_ALLIANCECONTACTS and session.allianceid is None:
    469             self.scroll.Load(fixedEntryHeight=19, contentList=[], noContentHint=localization.GetByLabel('UI/PeopleAndPlaces/OwnerNotInAnyAlliance', corpName=cfg.eveowners.Get(session.corpid).ownerName))
    470             return
    471         scrolllist, noContentHint, totalNum, displayHeaders = self.GetScrolllist(data)
    472         if displayHeaders:
    473             headers = [localization.GetByLabel('UI/Common/Name')]
    474         else:
    475             headers = []
    476         self.scroll.Load(contentList=scrolllist, headers=headers, noContentHint=noContentHint)
    477         self.UpdatePaginationCont(totalNum or 0)
    478 
    479     def CheckBoxChange(self, checkbox, *args):
    480         settings.user.ui.Set(checkbox.GetSettingsKey(), checkbox.checked)
    481         self.LoadContactsForm()
    482 
    483     def GetLeftGroups(self, data, *args):
    484         scrolllist = self.GetScrolllist(data)[0]
    485         return scrolllist
    486 
    487     def LabelGroupMenu(self, node, *args):
    488         return [(MenuLabel('UI/PeopleAndPlaces/ManageLabels'), self.ManageLabels)]
    489 
    490     def LoadData(self, *args):
    491         self.contacts = []
    492         self.blocked = []
    493         self.notifications = []
    494         allContacts = sm.GetService('addressbook').GetContacts()
    495         if self.contactType == TAB_CONTACTS:
    496             self.contacts = allContacts.contacts.values()
    497             self.blocked = allContacts.blocked.values()
    498             self.notifications = sm.GetService('notificationSvc').GetFormattedNotifications(const.groupContacts)
    499         elif self.contactType == TAB_CORPCONTACTS:
    500             self.contacts = allContacts.corpContacts.values()
    501         elif self.contactType == TAB_ALLIANCECONTACTS:
    502             self.contacts = allContacts.allianceContacts.values()
    503         filter = self.quickFilter.GetValue()
    504         if len(filter):
    505             bannedwords.check_search_words_allowed(filter)
    506             self.blocked = NiceFilter(self.quickFilter.QuickFilter, self.blocked)
    507             self.contacts = NiceFilter(self.quickFilter.QuickFilter, self.contacts)
    508 
    509     def BrowseContacts(self, backforth, *args):
    510         pos = max(0, self.startPos + const.maxContactsPerPage * backforth)
    511         self.startPos = pos
    512         self.LoadContactsForm()
    513 
    514     def UpdatePaginationCont(self, totalNum):
    515         btnDisplayed = 0
    516         if self.startPos == 0:
    517             self.contactBackBtn.Disable()
    518         else:
    519             self.contactBackBtn.Enable()
    520             btnDisplayed = 1
    521         if self.startPos + const.maxContactsPerPage >= totalNum:
    522             self.contactFwdBtn.Disable()
    523         else:
    524             self.contactFwdBtn.Enable()
    525             btnDisplayed = 1
    526         self.paginationCont.display = btnDisplayed
    527         if btnDisplayed:
    528             self.UpdatePageCountLabel(totalNum)
    529 
    530     def UpdatePageCountLabel(self, totalNum):
    531         numPages = int(math.ceil(totalNum / float(const.maxContactsPerPage)))
    532         currentPage = self.startPos / const.maxContactsPerPage + 1
    533         self.pageCount.text = '%s/%s' % (currentPage, numPages)
    534 
    535     def OnContactDropData(self, dragObj, nodes):
    536         if self.contactType == TAB_CONTACTS and settings.char.ui.Get('contacts_lastselected', None) == const.contactBlocked:
    537             sm.GetService('addressbook').DropInBlocked(nodes)
    538         else:
    539             sm.GetService('addressbook').DropInPersonal(nodes, self.contactType)
    540 
    541     def ReloadData(self):
    542         self.LoadData()
    543         self.LoadLeftSide()
    544         if len(self.scroll.GetNodes()) < 1:
    545             self.BrowseContacts(-1)
    546 
    547     def OnNotificationsRefresh(self):
    548         if self.contactType == TAB_CONTACTS and settings.char.ui.Get('contacts_lastselected', None) == const.contactNotifications:
    549             self.ReloadData()
    550 
    551     def OnMessageChanged(self, type, messageIDs, what):
    552         if type == const.mailTypeNotifications and what == 'deleted':
    553             if self.contactType == TAB_CONTACTS and settings.char.ui.Get('contacts_lastselected', None) == const.contactNotifications:
    554                 self.ReloadData()
    555 
    556     def OnContactChange(self, contactIDs, contactType = None):
    557         if contactType == self.contactType:
    558             self.ReloadData()
    559 
    560     def OnSetAllianceStanding(self, *args):
    561         if self.contactType == TAB_ALLIANCECONTACTS:
    562             self.ReloadData()
    563 
    564     def OnSetCorpStanding(self, *args):
    565         if self.contactType == TAB_CORPCONTACTS:
    566             self.ReloadData()
    567 
    568     def OnMyLabelsChanged(self, contactType, labelID):
    569         if contactType == self.contactType:
    570             self.LoadLeftSide()
    571 
    572     def OnEditLabel(self, contactIDs, contactType):
    573         if contactType == self.contactType:
    574             self.ReloadData()
    575 
    576     def OnUnblockContact(self, contactID):
    577         if self.contactType == TAB_CONTACTS:
    578             self.ReloadData()
    579 
    580     def OnGroupDropData(self, groupID, nodes, *args):
    581         what, labelID, labelName = groupID
    582         contactIDs = []
    583         for node in nodes:
    584             contactIDs.append(node.itemID)
    585 
    586         if len(contactIDs):
    587             sm.StartService('addressbook').AssignLabelFromWnd(contactIDs, labelID, labelName)
    588 
    589 
    590 class LabelListGroup(ListGroup):
    591     _manage_labels_button = None
    592 
    593     def Startup(self, *etc):
    594         super(LabelListGroup, self).Startup(*etc)
    595         self._manage_labels_button = ButtonIcon(parent=self, align=uiconst.CENTERRIGHT, width=24, height=24, iconSize=16, texturePath=eveicon.settings, func=None, hint=localization.GetByLabel('UI/PeopleAndPlaces/ManageLabels'))
    596 
    597     def Load(self, node):
    598         super(LabelListGroup, self).Load(node)
    599         manage_labels_callback = node.get('manage_labels_callback', None)
    600         if manage_labels_callback:
    601             self._manage_labels_button.func = manage_labels_callback