def _createInvitationPage(self):
     self.__handleHolidays()
     page = DirectFrame(self.frame)
     page.setName('PartyPlannerInvitationPage')
     self.invitationTitleLabel = DirectLabel(parent=page, relief=None, text=TTLocalizer.PartyPlannerConfirmTitle, textMayChange=True, pos=self.gui.find('**/title_locator').getPos(), scale=self.titleScale)
     self.invitationBackground = DirectFrame(parent=page, relief=None, geom=self.gui.find('**/invitationBackground'))
     self.inviteVisual = InviteVisual(page)
     self.selectedInviteThemeLabel = DirectLabel(parent=page, relief=None, pos=self.gui.find('**/step_06_theme_locator').getPos(), text='', text_scale=0.06, textMayChange=True)
     self.nextThemeButton = DirectButton(parent=page, relief=None, geom=(self.gui.find('**/topNext_button/nextButton_up'), self.gui.find('**/topNext_button/nextButton_down'), self.gui.find('**/topNext_button/nextButton_rollover')), command=self.__nextTheme)
     self.prevThemeButton = DirectButton(parent=page, relief=None, geom=(self.gui.find('**/topPrevious_button/previousButton_up'), self.gui.find('**/topPrevious_button/previousButton_down'), self.gui.find('**/topPrevious_button/previousButton_rollover')), command=self.__prevTheme)
     pos = self.gui.find('**/step_06_sendInvitation_locator').getPos()
     self.inviteButton = DirectButton(parent=page, relief=None, geom=(self.gui.find('**/send_up'), self.gui.find('**/send_down'), self.gui.find('**/send_rollover')), text=TTLocalizer.PartyPlannerInviteButton, textMayChange=True, text_scale=0.05, text_pos=(pos[0], pos[2]), command=self.__handleComplete)
     return page
 def load(self):
     self.accept('setMailboxContents-%s' % base.localAvatar.doId, self.__refreshItems)
     self.accept('setAwardMailboxContents-%s' % base.localAvatar.doId, self.__refreshItems)
     model = loader.loadModel('phase_5.5/models/gui/package_delivery_panel')
     background = model.find('**/bg')
     itemBoard = model.find('**/item_board')
     self.frame = DirectFrame(scale=1.1, relief=DGG.FLAT, frameSize=(-0.5,
      0.5,
      -0.45,
      -0.05), frameColor=(0.737, 0.573, 0.345, 1.0))
     self.background = DirectFrame(self.frame, image=background, image_scale=0.05, relief=None, pos=(0, 1, 0))
     self.itemBoard = DirectFrame(parent=self.frame, image=itemBoard, image_scale=0.05, image_color=(0.922, 0.922, 0.753, 1), relief=None, pos=(0, 1, 0))
     self.itemCountLabel = DirectLabel(parent=self.frame, relief=None, text=self.__getNumberOfItemsText(), text_wordwrap=16, pos=(0.0, 0.0, 0.7), scale=0.09)
     exitUp = model.find('**/bu_return_rollover')
     exitDown = model.find('**/bu_return_rollover')
     exitRollover = model.find('**/bu_return_rollover')
     exitUp.setP(-90)
     exitDown.setP(-90)
     exitRollover.setP(-90)
     self.DiscardButton = DirectButton(parent=self.frame, relief=None, image=(exitUp,
      exitDown,
      exitRollover,
      exitUp), pos=(-0.01, 1.0, -0.36), scale=0.048, text=('',
      TTLocalizer.MailBoxDiscard,
      TTLocalizer.MailBoxDiscard,
      ''), text_scale=1.0, text_pos=(0, -0.08), textMayChange=1, command=self.__makeDiscardInterface)
     gui2 = loader.loadModel('phase_3/models/gui/quit_button')
     self.quitButton = DirectButton(parent=self.frame, relief=None, image=(gui2.find('**/QuitBtn_UP'), gui2.find('**/QuitBtn_DN'), gui2.find('**/QuitBtn_RLVR')), pos=(0.5, 1.0, -0.42), scale=0.9, text=TTLocalizer.MailboxExitButton, text_font=ToontownGlobals.getSignFont(), text0_fg=(0.152, 0.75, 0.258, 1), text1_fg=(0.152, 0.75, 0.258, 1), text2_fg=(0.977, 0.816, 0.133, 1), text_scale=0.045, text_pos=(0, -0.01), command=self.__handleExit)
     self.gettingText = DirectLabel(parent=self.frame, relief=None, text='', text_wordwrap=10, pos=(0.0, 0.0, 0.32), scale=0.09)
     self.gettingText.hide()
     self.giftTagPanel = DirectLabel(parent=self.frame, relief=None, text=TTLocalizer.MailboxGiftTag % TTLocalizer.MailboxGiftTagAnonymous, text_wordwrap=16, pos=(0.0, 0.0, 0.01), scale=0.06)
     self.giftTagPanel.hide()
     self.itemText = DirectLabel(parent=self.frame, relief=None, text='', text_wordwrap=16, pos=(0.0, 0.0, -0.022), scale=0.07)
     self.itemText.hide()
     acceptUp = model.find('**/bu_check_up')
     acceptDown = model.find('**/bu_check_down')
     acceptRollover = model.find('**/bu_check_rollover')
     acceptUp.setP(-90)
     acceptDown.setP(-90)
     acceptRollover.setP(-90)
     self.acceptButton = DirectButton(parent=self.frame, relief=None, image=(acceptUp,
      acceptDown,
      acceptRollover,
      acceptUp), image3_color=(0.8, 0.8, 0.8, 0.6), pos=(-0.01, 1.0, -0.16), scale=0.048, text=('',
      TTLocalizer.MailboxAcceptButton,
      TTLocalizer.MailboxAcceptButton,
      ''), text_scale=1.0, text_pos=(0, -0.09), textMayChange=1, command=self.__handleAccept, state=DGG.DISABLED)
     nextUp = model.find('**/bu_next_up')
     nextUp.setP(-90)
     nextDown = model.find('**/bu_next_down')
     nextDown.setP(-90)
     nextRollover = model.find('**/bu_next_rollover')
     nextRollover.setP(-90)
     self.nextButton = DirectButton(parent=self.frame, relief=None, image=(nextUp,
      nextDown,
      nextRollover,
      nextUp), image3_color=(0.8, 0.8, 0.8, 0.6), pos=(0.31, 1.0, -0.26), scale=0.05, text=('',
      TTLocalizer.MailboxItemNext,
      TTLocalizer.MailboxItemNext,
      ''), text_scale=1, text_pos=(-0.2, 0.3), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), textMayChange=0, command=self.__nextItem, state=DGG.DISABLED)
     prevUp = model.find('**/bu_previous_up')
     prevUp.setP(-90)
     prevDown = model.find('**/bu_previous_down')
     prevDown.setP(-90)
     prevRollover = model.find('**/bu_previous_rollover')
     prevRollover.setP(-90)
     self.prevButton = DirectButton(parent=self.frame, relief=None, image=(prevUp,
      prevDown,
      prevRollover,
      prevUp), pos=(-0.35, 1, -0.26), scale=0.05, image3_color=(0.8, 0.8, 0.8, 0.6), text=('',
      TTLocalizer.MailboxItemPrev,
      TTLocalizer.MailboxItemPrev,
      ''), text_scale=1, text_pos=(0, 0.3), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), textMayChange=0, command=self.__prevItem, state=DGG.DISABLED)
     self.currentItem = None
     self.partyInviteVisual = InviteVisual(self.frame)
     self.partyInviteVisual.setScale(0.73)
     self.partyInviteVisual.setPos(0.0, 0.0, 0.48)
     self.partyInviteVisual.stash()
     if self.avatar:
         self.avatar.applyCheesyEffect(ToontownGlobals.CENormal)
     return
class MailboxScreen(DirectObject.DirectObject):
    notify = directNotify.newCategory('MailboxScreen')

    def __init__(self, mailbox, avatar, doneEvent = None):
        self.mailbox = mailbox
        self.avatar = avatar
        self.items = self.getItems()
        self.doneEvent = doneEvent
        self.itemIndex = 0
        self.itemPanel = None
        self.itemPicture = None
        self.ival = None
        self.itemText = None
        self.giftTag = None
        self.acceptingIndex = None
        self.numAtticAccepted = 0
        self.dialogBox = None
        self.load()
        self.hide()

    def show(self):
        self.frame.show()
        self.__showCurrentItem()

    def hide(self):
        self.ignore('friendsListChanged')
        if hasattr(self, 'frame'):
            self.frame.hide()
        else:
            self.notify.warning('hide called, but frame is deleted, self.frame deleted in:')
            if hasattr(self, 'frameDelStackTrace'):
                print self.frameDelStackTrace
            self.notify.warning('current stackTrace =')
            print StackTrace()
            self.notify.warning('crash averted, but root cause unknown')

    def load(self):
        self.accept('setMailboxContents-%s' % base.localAvatar.doId, self.__refreshItems)
        self.accept('setAwardMailboxContents-%s' % base.localAvatar.doId, self.__refreshItems)
        model = loader.loadModel('phase_5.5/models/gui/package_delivery_panel')
        background = model.find('**/bg')
        itemBoard = model.find('**/item_board')
        self.frame = DirectFrame(scale=1.1, relief=DGG.FLAT, frameSize=(-0.5,
         0.5,
         -0.45,
         -0.05), frameColor=(0.737, 0.573, 0.345, 1.0))
        self.background = DirectFrame(self.frame, image=background, image_scale=0.05, relief=None, pos=(0, 1, 0))
        self.itemBoard = DirectFrame(parent=self.frame, image=itemBoard, image_scale=0.05, image_color=(0.922, 0.922, 0.753, 1), relief=None, pos=(0, 1, 0))
        self.itemCountLabel = DirectLabel(parent=self.frame, relief=None, text=self.__getNumberOfItemsText(), text_wordwrap=16, pos=(0.0, 0.0, 0.7), scale=0.09)
        exitUp = model.find('**/bu_return_rollover')
        exitDown = model.find('**/bu_return_rollover')
        exitRollover = model.find('**/bu_return_rollover')
        exitUp.setP(-90)
        exitDown.setP(-90)
        exitRollover.setP(-90)
        self.DiscardButton = DirectButton(parent=self.frame, relief=None, image=(exitUp,
         exitDown,
         exitRollover,
         exitUp), pos=(-0.01, 1.0, -0.36), scale=0.048, text=('',
         TTLocalizer.MailBoxDiscard,
         TTLocalizer.MailBoxDiscard,
         ''), text_scale=1.0, text_pos=(0, -0.08), textMayChange=1, command=self.__makeDiscardInterface)
        gui2 = loader.loadModel('phase_3/models/gui/quit_button')
        self.quitButton = DirectButton(parent=self.frame, relief=None, image=(gui2.find('**/QuitBtn_UP'), gui2.find('**/QuitBtn_DN'), gui2.find('**/QuitBtn_RLVR')), pos=(0.5, 1.0, -0.42), scale=0.9, text=TTLocalizer.MailboxExitButton, text_font=ToontownGlobals.getSignFont(), text0_fg=(0.152, 0.75, 0.258, 1), text1_fg=(0.152, 0.75, 0.258, 1), text2_fg=(0.977, 0.816, 0.133, 1), text_scale=0.045, text_pos=(0, -0.01), command=self.__handleExit)
        self.gettingText = DirectLabel(parent=self.frame, relief=None, text='', text_wordwrap=10, pos=(0.0, 0.0, 0.32), scale=0.09)
        self.gettingText.hide()
        self.giftTagPanel = DirectLabel(parent=self.frame, relief=None, text=TTLocalizer.MailboxGiftTag % TTLocalizer.MailboxGiftTagAnonymous, text_wordwrap=16, pos=(0.0, 0.0, 0.01), scale=0.06)
        self.giftTagPanel.hide()
        self.itemText = DirectLabel(parent=self.frame, relief=None, text='', text_wordwrap=16, pos=(0.0, 0.0, -0.022), scale=0.07)
        self.itemText.hide()
        acceptUp = model.find('**/bu_check_up')
        acceptDown = model.find('**/bu_check_down')
        acceptRollover = model.find('**/bu_check_rollover')
        acceptUp.setP(-90)
        acceptDown.setP(-90)
        acceptRollover.setP(-90)
        self.acceptButton = DirectButton(parent=self.frame, relief=None, image=(acceptUp,
         acceptDown,
         acceptRollover,
         acceptUp), image3_color=(0.8, 0.8, 0.8, 0.6), pos=(-0.01, 1.0, -0.16), scale=0.048, text=('',
         TTLocalizer.MailboxAcceptButton,
         TTLocalizer.MailboxAcceptButton,
         ''), text_scale=1.0, text_pos=(0, -0.09), textMayChange=1, command=self.__handleAccept, state=DGG.DISABLED)
        nextUp = model.find('**/bu_next_up')
        nextUp.setP(-90)
        nextDown = model.find('**/bu_next_down')
        nextDown.setP(-90)
        nextRollover = model.find('**/bu_next_rollover')
        nextRollover.setP(-90)
        self.nextButton = DirectButton(parent=self.frame, relief=None, image=(nextUp,
         nextDown,
         nextRollover,
         nextUp), image3_color=(0.8, 0.8, 0.8, 0.6), pos=(0.31, 1.0, -0.26), scale=0.05, text=('',
         TTLocalizer.MailboxItemNext,
         TTLocalizer.MailboxItemNext,
         ''), text_scale=1, text_pos=(-0.2, 0.3), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), textMayChange=0, command=self.__nextItem, state=DGG.DISABLED)
        prevUp = model.find('**/bu_previous_up')
        prevUp.setP(-90)
        prevDown = model.find('**/bu_previous_down')
        prevDown.setP(-90)
        prevRollover = model.find('**/bu_previous_rollover')
        prevRollover.setP(-90)
        self.prevButton = DirectButton(parent=self.frame, relief=None, image=(prevUp,
         prevDown,
         prevRollover,
         prevUp), pos=(-0.35, 1, -0.26), scale=0.05, image3_color=(0.8, 0.8, 0.8, 0.6), text=('',
         TTLocalizer.MailboxItemPrev,
         TTLocalizer.MailboxItemPrev,
         ''), text_scale=1, text_pos=(0, 0.3), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), textMayChange=0, command=self.__prevItem, state=DGG.DISABLED)
        self.currentItem = None
        self.partyInviteVisual = InviteVisual(self.frame)
        self.partyInviteVisual.setScale(0.73)
        self.partyInviteVisual.setPos(0.0, 0.0, 0.48)
        self.partyInviteVisual.stash()
        if self.avatar:
            self.avatar.applyCheesyEffect(ToontownGlobals.CENormal)
        return

    def unload(self):
        if self.avatar:
            self.avatar.reconsiderCheesyEffect()
        self.__clearCurrentItem()
        if hasattr(self, 'frame'):
            self.frame.destroy()
            del self.frame
            self.frameDelStackTrace = StackTrace()
        else:
            self.notify.warning('unload, no self.frame')
        if hasattr(self, 'mailbox'):
            del self.mailbox
        else:
            self.notify.warning('unload, no self.mailbox')
        if self.dialogBox:
            self.dialogBox.cleanup()
            self.dialogBox = None
        for item in self.items:
            if isinstance(item, CatalogItem.CatalogItem):
                item.acceptItemCleanup()

        self.ignoreAll()
        return

    def justExit(self):
        self.__acceptExit()

    def __handleExit(self):
        if self.numAtticAccepted == 0:
            self.__acceptExit()
        elif self.numAtticAccepted == 1:
            self.dialogBox = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.CatalogAcceptInAttic, text_wordwrap=15, command=self.__acceptExit)
            self.dialogBox.show()
        else:
            self.dialogBox = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.CatalogAcceptInAtticP, text_wordwrap=15, command=self.__acceptExit)
            self.dialogBox.show()

    def __acceptExit(self, buttonValue = None):
        if hasattr(self, 'frame'):
            self.hide()
            self.unload()
            messenger.send(self.doneEvent)

    def __handleAccept(self):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: MAILBOX: Accept item')
        if self.acceptingIndex != None:
            return
        item = self.items[self.itemIndex]
        isAward = False
        if isinstance(item, CatalogItem.CatalogItem):
            isAward = item.isAward()
        self.acceptingIndex = self.itemIndex
        self.acceptButton['state'] = DGG.DISABLED
        self.__showCurrentItem()
        item = self.items[self.itemIndex]
        item.acceptItem(self.mailbox, self.acceptingIndex, self.__acceptItemCallback)
        return

    def __handleDiscard(self, buttonValue = None):
        if self.acceptingIndex != None:
            return
        elif buttonValue == -1:
            if self.dialogBox:
                self.dialogBox.cleanup()
            self.dialogBox = None
            self.__showCurrentItem()
        else:
            self.acceptingIndex = self.itemIndex
            self.acceptButton['state'] = DGG.DISABLED
            self.__showCurrentItem()
            item = self.items[self.itemIndex]
            item.discardItem(self.mailbox, self.acceptingIndex, self.__discardItemCallback)
        return

    def __discardItemCallback(self, retcode, item, index):
        if not hasattr(self, 'frame'):
            return
        if self.dialogBox:
            self.dialogBox.cleanup()
        self.dialogBox = None
        self.acceptingIndex = None
        self.__updateItems()
        if isinstance(item, InviteInfoBase):
            callback = self.__incIndexRemoveDialog
            self.dialogBox = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=item.getDiscardItemErrorText(retcode), text_wordwrap=15, command=callback)
            self.dialogBox.show()
        return

    def __makeDiscardInterface(self):
        if self.itemIndex >= 0 and self.itemIndex < len(self.items):
            item = self.items[self.itemIndex]
            if isinstance(item, InviteInfoBase):
                itemText = TTLocalizer.MailBoxRejectVerify % self.getItemName(item)
                yesText = TTLocalizer.MailboxReject
            else:
                itemText = TTLocalizer.MailBoxDiscardVerify % self.getItemName(item)
                yesText = TTLocalizer.MailboxDiscard
            self.dialogBox = TTDialog.TTDialog(style=TTDialog.TwoChoiceCustom, text=itemText, text_wordwrap=15, command=self.__handleDiscard, buttonText=[yesText, TTLocalizer.MailboxLeave])
            self.dialogBox.show()

    def __acceptItemCallback(self, retcode, item, index):
        needtoUpdate = 0
        if self.acceptingIndex == None:
            needtoUpdate = 1
        if not hasattr(self, 'frame'):
            return
        if retcode == ToontownGlobals.P_UserCancelled:
            print 'mailbox screen user canceled'
            self.acceptingIndex = None
            self.__updateItems()
            return
        if self.acceptingIndex != index:
            self.notify.warning('Got unexpected callback for index %s, expected %s.' % (index, self.acceptingIndex))
            return
        self.acceptingIndex = None
        if retcode < 0:
            self.notify.info('Could not take item %s: retcode %s' % (item, retcode))
            self.dialogBox = TTDialog.TTDialog(style=TTDialog.TwoChoiceCustom, text=item.getAcceptItemErrorText(retcode), text_wordwrap=15, command=self.__handleDiscard, buttonText=[TTLocalizer.MailboxDiscard, TTLocalizer.MailboxLeave])
            self.dialogBox.show()
        elif hasattr(item, 'storedInAttic') and item.storedInAttic():
            self.numAtticAccepted += 1
            self.itemIndex += 1
            if needtoUpdate == 1:
                self.__updateItems()
        else:
            if isinstance(item, InviteInfoBase):
                self.__updateItems()
            callback = self.__incIndexRemoveDialog
            self.dialogBox = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=item.getAcceptItemErrorText(retcode), text_wordwrap=15, command=callback)
            self.dialogBox.show()
        return

    def __acceptError(self, buttonValue = None):
        self.dialogBox.cleanup()
        self.dialogBox = None
        self.__showCurrentItem()
        return

    def __incIndexRemoveDialog(self, junk = 0):
        self.__incIndex()
        self.dialogBox.cleanup()
        self.dialogBox = None
        self.__showCurrentItem()
        return

    def __incIndex(self, junk = 0):
        self.itemIndex += 1

    def __acceptOk(self, index, buttonValue = None):
        self.acceptingIndex = None
        if self.dialogBox:
            self.dialogBox.cleanup()
            self.dialogBox = None
        self.items = self.getItems()
        if self.itemIndex > index or self.itemIndex >= len(self.items):
            print 'adjusting item index -1'
            self.itemIndex -= 1
        if len(self.items) < 1:
            self.__handleExit()
            return
        self.itemCountLabel['text'] = (self.__getNumberOfItemsText(),)
        self.__showCurrentItem()
        return

    def __refreshItems(self):
        self.acceptingIndex = None
        self.__updateItems()
        return

    def __updateItems(self):
        if self.dialogBox:
            self.dialogBox.cleanup()
            self.dialogBox = None
        self.items = self.getItems()
        if self.itemIndex >= len(self.items):
            print 'adjusting item index -1'
            self.itemIndex = len(self.items) - 1
        if len(self.items) == 0:
            print 'exiting due to lack of items'
            self.__handleExit()
            return
        self.itemCountLabel['text'] = (self.__getNumberOfItemsText(),)
        self.__showCurrentItem()
        return

    def __getNumberOfItemsText(self):
        if len(self.items) == 1:
            return TTLocalizer.MailboxOneItem
        else:
            return TTLocalizer.MailboxNumberOfItems % len(self.items)

    def __clearCurrentItem(self):
        if self.itemPanel:
            self.itemPanel.destroy()
            self.itemPanel = None
        if self.ival:
            self.ival.finish()
            self.ival = None
        if not self.gettingText.isEmpty():
            self.gettingText.hide()
        if not self.itemText.isEmpty():
            self.itemText.hide()
        if not self.giftTagPanel.isEmpty():
            self.giftTagPanel.hide()
        if not self.acceptButton.isEmpty():
            self.acceptButton['state'] = DGG.DISABLED
        if self.currentItem:
            if isinstance(self.currentItem, CatalogItem.CatalogItem):
                self.currentItem.cleanupPicture()
            self.currentItem = None
        return

    def __showCurrentItem(self):
        self.__clearCurrentItem()
        if len(self.items) < 1:
            self.__handleExit()
            return
        self.partyInviteVisual.stash()
        if self.itemIndex + 1 > len(self.items):
            self.itemIndex = len(self.items) - 1
        item = self.items[self.itemIndex]
        if self.itemIndex == self.acceptingIndex:
            self.gettingText['text'] = TTLocalizer.MailboxGettingItem % self.getItemName(item)
            self.gettingText.show()
            return
        self.itemText['text'] = self.getItemName(item)
        self.currentItem = item
        if isinstance(item, CatalogItem.CatalogItem):
            self.acceptButton['text'] = ('',
             TTLocalizer.MailboxAcceptButton,
             TTLocalizer.MailboxAcceptButton,
             '')
            self.DiscardButton['text'] = ('',
             TTLocalizer.MailBoxDiscard,
             TTLocalizer.MailBoxDiscard,
             '')
            if item.isAward():
                self.giftTagPanel['text'] = TTLocalizer.SpecialEventMailboxStrings[item.specialEventId]
            elif item.giftTag != None:
                nameOfSender = self.getSenderName(item.giftTag)
                if item.giftCode == ToontownGlobals.GIFT_RAT:
                    self.giftTagPanel['text'] = TTLocalizer.CatalogAcceptRATBeans
                elif item.giftCode == ToontownGlobals.GIFT_partyrefund:
                    self.giftTagPanel['text'] = TTLocalizer.CatalogAcceptPartyRefund
                else:
                    self.giftTagPanel['text'] = TTLocalizer.MailboxGiftTag % nameOfSender
            else:
                self.giftTagPanel['text'] = ''
            self.itemPanel, self.ival = item.getPicture(base.localAvatar)
        elif isinstance(item, SimpleMailBase):
            self.acceptButton['text'] = ('',
             TTLocalizer.MailboxAcceptButton,
             TTLocalizer.MailboxAcceptButton,
             '')
            self.DiscardButton['text'] = ('',
             TTLocalizer.MailBoxDiscard,
             TTLocalizer.MailBoxDiscard,
             '')
            senderId = item.senderId
            nameOfSender = self.getSenderName(senderId)
            self.giftTagPanel['text'] = TTLocalizer.MailFromTag % nameOfSender
            self.itemText['text'] = item.body
        elif isinstance(item, InviteInfoBase):
            self.acceptButton['text'] = ('',
             TTLocalizer.MailboxAcceptInvite,
             TTLocalizer.MailboxAcceptInvite,
             '')
            self.DiscardButton['text'] = ('',
             TTLocalizer.MailBoxRejectInvite,
             TTLocalizer.MailBoxRejectInvite,
             '')
            partyInfo = None
            for party in self.avatar.partiesInvitedTo:
                if party.partyId == item.partyId:
                    partyInfo = party
                    break
            else:
                MailboxScreen.notify.error('Unable to find party with id %d to match invitation %s' % (item.partyId, item))

            if self.mailbox:
                if item.status == PartyGlobals.InviteStatus.NotRead:
                    self.mailbox.sendInviteReadButNotReplied(item.inviteKey)
            senderId = partyInfo.hostId
            nameOfSender = self.getSenderName(senderId)
            self.giftTagPanel['text'] = ''
            self.itemText['text'] = ''
            self.partyInviteVisual.updateInvitation(nameOfSender, partyInfo)
            self.partyInviteVisual.unstash()
            self.itemPanel = None
            self.ival = None
        else:
            self.acceptButton['text'] = ('',
             TTLocalizer.MailboxAcceptButton,
             TTLocalizer.MailboxAcceptButton,
             '')
            self.DiscardButton['text'] = ('',
             TTLocalizer.MailBoxDiscard,
             TTLocalizer.MailBoxDiscard,
             '')
            self.giftTagPanel['text'] = ' '
            self.itemPanel = None
            self.ival = None
        self.itemText.show()
        self.giftTagPanel.show()
        if self.itemPanel and item.getTypeName() != TTLocalizer.ChatTypeName:
            self.itemPanel.reparentTo(self.itemBoard, -1)
            self.itemPanel.setPos(0, 0, 0.4)
            self.itemPanel.setScale(0.21)
            self.itemText['text_wordwrap'] = 16
            self.itemText.setPos(0.0, 0.0, 0.075)
        elif isinstance(item, CatalogItem.CatalogItem) and item.getTypeName() == TTLocalizer.ChatTypeName:
            self.itemPanel.reparentTo(self.itemBoard, -1)
            self.itemPanel.setPos(0, 0, 0.35)
            self.itemPanel.setScale(0.21)
            self.itemText['text_wordwrap'] = 10
            self.itemText.setPos(0, 0, 0.3)
        else:
            self.itemText.setPos(0, 0, 0.3)
        if self.ival:
            self.ival.loop()
        if self.acceptingIndex == None:
            self.acceptButton['state'] = DGG.NORMAL
        if self.itemIndex > 0:
            self.prevButton['state'] = DGG.NORMAL
        else:
            self.prevButton['state'] = DGG.DISABLED
        if self.itemIndex + 1 < len(self.items):
            self.nextButton['state'] = DGG.NORMAL
        else:
            self.nextButton['state'] = DGG.DISABLED
        return

    def __nextItem(self):
        messenger.send('wakeup')
        if self.itemIndex + 1 < len(self.items):
            self.itemIndex += 1
            self.__showCurrentItem()

    def __prevItem(self):
        messenger.send('wakeup')
        if self.itemIndex > 0:
            self.itemIndex -= 1
            self.__showCurrentItem()

    def getItemName(self, item):
        if isinstance(item, CatalogItem.CatalogItem):
            return item.getName()
        elif isinstance(item, str):
            return TTLocalizer.MailSimpleMail
        elif isinstance(item, InviteInfoBase):
            return TTLocalizer.InviteInvitation
        else:
            return ''

    def getItems(self):
        result = []
        result = self.avatar.awardMailboxContents[:]
        result += self.avatar.mailboxContents[:]
        if self.avatar.mail:
            result += self.avatar.mail
        mailboxInvites = self.avatar.getInvitesToShowInMailbox()
        if mailboxInvites:
            result += mailboxInvites
        return result

    def getNumberOfAwardItems(self):
        result = 0
        for item in self.items:
            if isinstance(item, CatalogItem.CatalogItem) and item.specialEventId > 0:
                result += 1
            else:
                break

        return result

    def getSenderName(self, avId):
        sender = base.cr.identifyFriend(avId)

        if sender:
            return sender.getName()
        
        for av in base.cr.avList:
            if av.id == avId:
                return av.name
            
        return TTLocalizer.MailboxGiftTagAnonymous
Esempio n. 4
0
 def load(self):
     self.accept('setMailboxContents-%s' % base.localAvatar.doId,
                 self.__refreshItems)
     self.accept('setAwardMailboxContents-%s' % base.localAvatar.doId,
                 self.__refreshItems)
     model = loader.loadModel('phase_5.5/models/gui/package_delivery_panel')
     background = model.find('**/bg')
     itemBoard = model.find('**/item_board')
     self.frame = DirectFrame(scale=1.1,
                              relief=DGG.FLAT,
                              frameSize=(-0.5, 0.5, -0.45, -0.05),
                              frameColor=(0.737, 0.573, 0.345, 1.0))
     self.background = DirectFrame(self.frame,
                                   image=background,
                                   image_scale=0.05,
                                   relief=None,
                                   pos=(0, 1, 0))
     self.itemBoard = DirectFrame(parent=self.frame,
                                  image=itemBoard,
                                  image_scale=0.05,
                                  image_color=(0.922, 0.922, 0.753, 1),
                                  relief=None,
                                  pos=(0, 1, 0))
     self.itemCountLabel = DirectLabel(parent=self.frame,
                                       relief=None,
                                       text=self.__getNumberOfItemsText(),
                                       text_wordwrap=16,
                                       pos=(0.0, 0.0, 0.7),
                                       scale=0.09)
     exitUp = model.find('**/bu_return_rollover')
     exitDown = model.find('**/bu_return_rollover')
     exitRollover = model.find('**/bu_return_rollover')
     exitUp.setP(-90)
     exitDown.setP(-90)
     exitRollover.setP(-90)
     self.DiscardButton = DirectButton(parent=self.frame,
                                       relief=None,
                                       image=(exitUp, exitDown,
                                              exitRollover, exitUp),
                                       pos=(-0.01, 1.0, -0.36),
                                       scale=0.048,
                                       text=('', TTLocalizer.MailBoxDiscard,
                                             TTLocalizer.MailBoxDiscard,
                                             ''),
                                       text_scale=1.0,
                                       text_pos=(0, -0.08),
                                       textMayChange=1,
                                       command=self.__makeDiscardInterface)
     gui2 = loader.loadModel('phase_3/models/gui/quit_button')
     self.quitButton = DirectButton(parent=self.frame,
                                    relief=None,
                                    image=(gui2.find('**/QuitBtn_UP'),
                                           gui2.find('**/QuitBtn_DN'),
                                           gui2.find('**/QuitBtn_RLVR')),
                                    pos=(0.5, 1.0, -0.42),
                                    scale=0.9,
                                    text=TTLocalizer.MailboxExitButton,
                                    text_font=ToontownGlobals.getSignFont(),
                                    text0_fg=(0.152, 0.75, 0.258, 1),
                                    text1_fg=(0.152, 0.75, 0.258, 1),
                                    text2_fg=(0.977, 0.816, 0.133, 1),
                                    text_scale=0.045,
                                    text_pos=(0, -0.01),
                                    command=self.__handleExit)
     self.gettingText = DirectLabel(parent=self.frame,
                                    relief=None,
                                    text='',
                                    text_wordwrap=10,
                                    pos=(0.0, 0.0, 0.32),
                                    scale=0.09)
     self.gettingText.hide()
     self.giftTagPanel = DirectLabel(parent=self.frame,
                                     relief=None,
                                     text=TTLocalizer.MailboxGiftTag %
                                     TTLocalizer.MailboxGiftTagAnonymous,
                                     text_wordwrap=16,
                                     pos=(0.0, 0.0, 0.01),
                                     scale=0.06)
     self.giftTagPanel.hide()
     self.itemText = DirectLabel(parent=self.frame,
                                 relief=None,
                                 text='',
                                 text_wordwrap=16,
                                 pos=(0.0, 0.0, -0.022),
                                 scale=0.07)
     self.itemText.hide()
     acceptUp = model.find('**/bu_check_up')
     acceptDown = model.find('**/bu_check_down')
     acceptRollover = model.find('**/bu_check_rollover')
     acceptUp.setP(-90)
     acceptDown.setP(-90)
     acceptRollover.setP(-90)
     self.acceptButton = DirectButton(
         parent=self.frame,
         relief=None,
         image=(acceptUp, acceptDown, acceptRollover, acceptUp),
         image3_color=(0.8, 0.8, 0.8, 0.6),
         pos=(-0.01, 1.0, -0.16),
         scale=0.048,
         text=('', TTLocalizer.MailboxAcceptButton,
               TTLocalizer.MailboxAcceptButton, ''),
         text_scale=1.0,
         text_pos=(0, -0.09),
         textMayChange=1,
         command=self.__handleAccept,
         state=DGG.DISABLED)
     nextUp = model.find('**/bu_next_up')
     nextUp.setP(-90)
     nextDown = model.find('**/bu_next_down')
     nextDown.setP(-90)
     nextRollover = model.find('**/bu_next_rollover')
     nextRollover.setP(-90)
     self.nextButton = DirectButton(parent=self.frame,
                                    relief=None,
                                    image=(nextUp, nextDown, nextRollover,
                                           nextUp),
                                    image3_color=(0.8, 0.8, 0.8, 0.6),
                                    pos=(0.31, 1.0, -0.26),
                                    scale=0.05,
                                    text=('', TTLocalizer.MailboxItemNext,
                                          TTLocalizer.MailboxItemNext, ''),
                                    text_scale=1,
                                    text_pos=(-0.2, 0.3),
                                    text_fg=(1, 1, 1, 1),
                                    text_shadow=(0, 0, 0, 1),
                                    textMayChange=0,
                                    command=self.__nextItem,
                                    state=DGG.DISABLED)
     prevUp = model.find('**/bu_previous_up')
     prevUp.setP(-90)
     prevDown = model.find('**/bu_previous_down')
     prevDown.setP(-90)
     prevRollover = model.find('**/bu_previous_rollover')
     prevRollover.setP(-90)
     self.prevButton = DirectButton(parent=self.frame,
                                    relief=None,
                                    image=(prevUp, prevDown, prevRollover,
                                           prevUp),
                                    pos=(-0.35, 1, -0.26),
                                    scale=0.05,
                                    image3_color=(0.8, 0.8, 0.8, 0.6),
                                    text=('', TTLocalizer.MailboxItemPrev,
                                          TTLocalizer.MailboxItemPrev, ''),
                                    text_scale=1,
                                    text_pos=(0, 0.3),
                                    text_fg=(1, 1, 1, 1),
                                    text_shadow=(0, 0, 0, 1),
                                    textMayChange=0,
                                    command=self.__prevItem,
                                    state=DGG.DISABLED)
     self.currentItem = None
     self.partyInviteVisual = InviteVisual(self.frame)
     self.partyInviteVisual.setScale(0.73)
     self.partyInviteVisual.setPos(0.0, 0.0, 0.48)
     self.partyInviteVisual.stash()
     if self.avatar:
         self.avatar.applyCheesyEffect(ToontownGlobals.CENormal)
     return
Esempio n. 5
0
class MailboxScreen(DirectObject.DirectObject):
    notify = directNotify.newCategory('MailboxScreen')

    def __init__(self, mailbox, avatar, doneEvent=None):
        self.mailbox = mailbox
        self.avatar = avatar
        self.items = self.getItems()
        self.doneEvent = doneEvent
        self.itemIndex = 0
        self.itemPanel = None
        self.itemPicture = None
        self.ival = None
        self.itemText = None
        self.giftTag = None
        self.acceptingIndex = None
        self.numAtticAccepted = 0
        self.dialogBox = None
        self.load()
        self.hide()

    def show(self):
        self.frame.show()
        self.__showCurrentItem()

    def hide(self):
        self.ignore('friendsListChanged')
        if hasattr(self, 'frame'):
            self.frame.hide()
        else:
            self.notify.warning(
                'hide called, but frame is deleted, self.frame deleted in:')
            if hasattr(self, 'frameDelStackTrace'):
                print self.frameDelStackTrace
            self.notify.warning('current stackTrace =')
            print StackTrace()
            self.notify.warning('crash averted, but root cause unknown')

    def load(self):
        self.accept('setMailboxContents-%s' % base.localAvatar.doId,
                    self.__refreshItems)
        self.accept('setAwardMailboxContents-%s' % base.localAvatar.doId,
                    self.__refreshItems)
        model = loader.loadModel('phase_5.5/models/gui/package_delivery_panel')
        background = model.find('**/bg')
        itemBoard = model.find('**/item_board')
        self.frame = DirectFrame(scale=1.1,
                                 relief=DGG.FLAT,
                                 frameSize=(-0.5, 0.5, -0.45, -0.05),
                                 frameColor=(0.737, 0.573, 0.345, 1.0))
        self.background = DirectFrame(self.frame,
                                      image=background,
                                      image_scale=0.05,
                                      relief=None,
                                      pos=(0, 1, 0))
        self.itemBoard = DirectFrame(parent=self.frame,
                                     image=itemBoard,
                                     image_scale=0.05,
                                     image_color=(0.922, 0.922, 0.753, 1),
                                     relief=None,
                                     pos=(0, 1, 0))
        self.itemCountLabel = DirectLabel(parent=self.frame,
                                          relief=None,
                                          text=self.__getNumberOfItemsText(),
                                          text_wordwrap=16,
                                          pos=(0.0, 0.0, 0.7),
                                          scale=0.09)
        exitUp = model.find('**/bu_return_rollover')
        exitDown = model.find('**/bu_return_rollover')
        exitRollover = model.find('**/bu_return_rollover')
        exitUp.setP(-90)
        exitDown.setP(-90)
        exitRollover.setP(-90)
        self.DiscardButton = DirectButton(parent=self.frame,
                                          relief=None,
                                          image=(exitUp, exitDown,
                                                 exitRollover, exitUp),
                                          pos=(-0.01, 1.0, -0.36),
                                          scale=0.048,
                                          text=('', TTLocalizer.MailBoxDiscard,
                                                TTLocalizer.MailBoxDiscard,
                                                ''),
                                          text_scale=1.0,
                                          text_pos=(0, -0.08),
                                          textMayChange=1,
                                          command=self.__makeDiscardInterface)
        gui2 = loader.loadModel('phase_3/models/gui/quit_button')
        self.quitButton = DirectButton(parent=self.frame,
                                       relief=None,
                                       image=(gui2.find('**/QuitBtn_UP'),
                                              gui2.find('**/QuitBtn_DN'),
                                              gui2.find('**/QuitBtn_RLVR')),
                                       pos=(0.5, 1.0, -0.42),
                                       scale=0.9,
                                       text=TTLocalizer.MailboxExitButton,
                                       text_font=ToontownGlobals.getSignFont(),
                                       text0_fg=(0.152, 0.75, 0.258, 1),
                                       text1_fg=(0.152, 0.75, 0.258, 1),
                                       text2_fg=(0.977, 0.816, 0.133, 1),
                                       text_scale=0.045,
                                       text_pos=(0, -0.01),
                                       command=self.__handleExit)
        self.gettingText = DirectLabel(parent=self.frame,
                                       relief=None,
                                       text='',
                                       text_wordwrap=10,
                                       pos=(0.0, 0.0, 0.32),
                                       scale=0.09)
        self.gettingText.hide()
        self.giftTagPanel = DirectLabel(parent=self.frame,
                                        relief=None,
                                        text=TTLocalizer.MailboxGiftTag %
                                        TTLocalizer.MailboxGiftTagAnonymous,
                                        text_wordwrap=16,
                                        pos=(0.0, 0.0, 0.01),
                                        scale=0.06)
        self.giftTagPanel.hide()
        self.itemText = DirectLabel(parent=self.frame,
                                    relief=None,
                                    text='',
                                    text_wordwrap=16,
                                    pos=(0.0, 0.0, -0.022),
                                    scale=0.07)
        self.itemText.hide()
        acceptUp = model.find('**/bu_check_up')
        acceptDown = model.find('**/bu_check_down')
        acceptRollover = model.find('**/bu_check_rollover')
        acceptUp.setP(-90)
        acceptDown.setP(-90)
        acceptRollover.setP(-90)
        self.acceptButton = DirectButton(
            parent=self.frame,
            relief=None,
            image=(acceptUp, acceptDown, acceptRollover, acceptUp),
            image3_color=(0.8, 0.8, 0.8, 0.6),
            pos=(-0.01, 1.0, -0.16),
            scale=0.048,
            text=('', TTLocalizer.MailboxAcceptButton,
                  TTLocalizer.MailboxAcceptButton, ''),
            text_scale=1.0,
            text_pos=(0, -0.09),
            textMayChange=1,
            command=self.__handleAccept,
            state=DGG.DISABLED)
        nextUp = model.find('**/bu_next_up')
        nextUp.setP(-90)
        nextDown = model.find('**/bu_next_down')
        nextDown.setP(-90)
        nextRollover = model.find('**/bu_next_rollover')
        nextRollover.setP(-90)
        self.nextButton = DirectButton(parent=self.frame,
                                       relief=None,
                                       image=(nextUp, nextDown, nextRollover,
                                              nextUp),
                                       image3_color=(0.8, 0.8, 0.8, 0.6),
                                       pos=(0.31, 1.0, -0.26),
                                       scale=0.05,
                                       text=('', TTLocalizer.MailboxItemNext,
                                             TTLocalizer.MailboxItemNext, ''),
                                       text_scale=1,
                                       text_pos=(-0.2, 0.3),
                                       text_fg=(1, 1, 1, 1),
                                       text_shadow=(0, 0, 0, 1),
                                       textMayChange=0,
                                       command=self.__nextItem,
                                       state=DGG.DISABLED)
        prevUp = model.find('**/bu_previous_up')
        prevUp.setP(-90)
        prevDown = model.find('**/bu_previous_down')
        prevDown.setP(-90)
        prevRollover = model.find('**/bu_previous_rollover')
        prevRollover.setP(-90)
        self.prevButton = DirectButton(parent=self.frame,
                                       relief=None,
                                       image=(prevUp, prevDown, prevRollover,
                                              prevUp),
                                       pos=(-0.35, 1, -0.26),
                                       scale=0.05,
                                       image3_color=(0.8, 0.8, 0.8, 0.6),
                                       text=('', TTLocalizer.MailboxItemPrev,
                                             TTLocalizer.MailboxItemPrev, ''),
                                       text_scale=1,
                                       text_pos=(0, 0.3),
                                       text_fg=(1, 1, 1, 1),
                                       text_shadow=(0, 0, 0, 1),
                                       textMayChange=0,
                                       command=self.__prevItem,
                                       state=DGG.DISABLED)
        self.currentItem = None
        self.partyInviteVisual = InviteVisual(self.frame)
        self.partyInviteVisual.setScale(0.73)
        self.partyInviteVisual.setPos(0.0, 0.0, 0.48)
        self.partyInviteVisual.stash()
        if self.avatar:
            self.avatar.applyCheesyEffect(ToontownGlobals.CENormal)
        return

    def unload(self):
        if self.avatar:
            self.avatar.reconsiderCheesyEffect()
        self.__clearCurrentItem()
        if hasattr(self, 'frame'):
            self.frame.destroy()
            del self.frame
            self.frameDelStackTrace = StackTrace()
        else:
            self.notify.warning('unload, no self.frame')
        if hasattr(self, 'mailbox'):
            del self.mailbox
        else:
            self.notify.warning('unload, no self.mailbox')
        if self.dialogBox:
            self.dialogBox.cleanup()
            self.dialogBox = None
        for item in self.items:
            if isinstance(item, CatalogItem.CatalogItem):
                item.acceptItemCleanup()

        self.ignoreAll()
        return

    def justExit(self):
        self.__acceptExit()

    def __handleExit(self):
        if self.numAtticAccepted == 0:
            self.__acceptExit()
        elif self.numAtticAccepted == 1:
            self.dialogBox = TTDialog.TTDialog(
                style=TTDialog.Acknowledge,
                text=TTLocalizer.CatalogAcceptInAttic,
                text_wordwrap=15,
                command=self.__acceptExit)
            self.dialogBox.show()
        else:
            self.dialogBox = TTDialog.TTDialog(
                style=TTDialog.Acknowledge,
                text=TTLocalizer.CatalogAcceptInAtticP,
                text_wordwrap=15,
                command=self.__acceptExit)
            self.dialogBox.show()

    def __acceptExit(self, buttonValue=None):
        if hasattr(self, 'frame'):
            self.hide()
            self.unload()
            messenger.send(self.doneEvent)

    def __handleAccept(self):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: MAILBOX: Accept item')
        if self.acceptingIndex != None:
            return
        item = self.items[self.itemIndex]
        isAward = False
        if isinstance(item, CatalogItem.CatalogItem):
            isAward = item.isAward()
        self.acceptingIndex = self.itemIndex
        self.acceptButton['state'] = DGG.DISABLED
        self.__showCurrentItem()
        item = self.items[self.itemIndex]
        item.acceptItem(self.mailbox, self.acceptingIndex,
                        self.__acceptItemCallback)
        return

    def __handleDiscard(self, buttonValue=None):
        if self.acceptingIndex != None:
            return
        elif buttonValue == -1:
            if self.dialogBox:
                self.dialogBox.cleanup()
            self.dialogBox = None
            self.__showCurrentItem()
        else:
            self.acceptingIndex = self.itemIndex
            self.acceptButton['state'] = DGG.DISABLED
            self.__showCurrentItem()
            item = self.items[self.itemIndex]
            item.discardItem(self.mailbox, self.acceptingIndex,
                             self.__discardItemCallback)
        return

    def __discardItemCallback(self, retcode, item, index):
        if not hasattr(self, 'frame'):
            return
        if self.dialogBox:
            self.dialogBox.cleanup()
        self.dialogBox = None
        self.acceptingIndex = None
        self.__updateItems()
        if isinstance(item, InviteInfoBase):
            callback = self.__incIndexRemoveDialog
            self.dialogBox = TTDialog.TTDialog(
                style=TTDialog.Acknowledge,
                text=item.getDiscardItemErrorText(retcode),
                text_wordwrap=15,
                command=callback)
            self.dialogBox.show()
        return

    def __makeDiscardInterface(self):
        if self.itemIndex >= 0 and self.itemIndex < len(self.items):
            item = self.items[self.itemIndex]
            if isinstance(item, InviteInfoBase):
                itemText = TTLocalizer.MailBoxRejectVerify % self.getItemName(
                    item)
                yesText = TTLocalizer.MailboxReject
            else:
                itemText = TTLocalizer.MailBoxDiscardVerify % self.getItemName(
                    item)
                yesText = TTLocalizer.MailboxDiscard
            self.dialogBox = TTDialog.TTDialog(
                style=TTDialog.TwoChoiceCustom,
                text=itemText,
                text_wordwrap=15,
                command=self.__handleDiscard,
                buttonText=[yesText, TTLocalizer.MailboxLeave])
            self.dialogBox.show()

    def __acceptItemCallback(self, retcode, item, index):
        needtoUpdate = 0
        if self.acceptingIndex == None:
            needtoUpdate = 1
        if not hasattr(self, 'frame'):
            return
        if retcode == ToontownGlobals.P_UserCancelled:
            print 'mailbox screen user canceled'
            self.acceptingIndex = None
            self.__updateItems()
            return
        if self.acceptingIndex != index:
            self.notify.warning(
                'Got unexpected callback for index %s, expected %s.' %
                (index, self.acceptingIndex))
            return
        self.acceptingIndex = None
        if retcode < 0:
            self.notify.info('Could not take item %s: retcode %s' %
                             (item, retcode))
            self.dialogBox = TTDialog.TTDialog(
                style=TTDialog.TwoChoiceCustom,
                text=item.getAcceptItemErrorText(retcode),
                text_wordwrap=15,
                command=self.__handleDiscard,
                buttonText=[
                    TTLocalizer.MailboxDiscard, TTLocalizer.MailboxLeave
                ])
            self.dialogBox.show()
        elif hasattr(item, 'storedInAttic') and item.storedInAttic():
            self.numAtticAccepted += 1
            self.itemIndex += 1
            if needtoUpdate == 1:
                self.__updateItems()
        else:
            if isinstance(item, InviteInfoBase):
                self.__updateItems()
            callback = self.__incIndexRemoveDialog
            self.dialogBox = TTDialog.TTDialog(
                style=TTDialog.Acknowledge,
                text=item.getAcceptItemErrorText(retcode),
                text_wordwrap=15,
                command=callback)
            self.dialogBox.show()
        return

    def __acceptError(self, buttonValue=None):
        self.dialogBox.cleanup()
        self.dialogBox = None
        self.__showCurrentItem()
        return

    def __incIndexRemoveDialog(self, junk=0):
        self.__incIndex()
        self.dialogBox.cleanup()
        self.dialogBox = None
        self.__showCurrentItem()
        return

    def __incIndex(self, junk=0):
        self.itemIndex += 1

    def __acceptOk(self, index, buttonValue=None):
        self.acceptingIndex = None
        if self.dialogBox:
            self.dialogBox.cleanup()
            self.dialogBox = None
        self.items = self.getItems()
        if self.itemIndex > index or self.itemIndex >= len(self.items):
            print 'adjusting item index -1'
            self.itemIndex -= 1
        if len(self.items) < 1:
            self.__handleExit()
            return
        self.itemCountLabel['text'] = (self.__getNumberOfItemsText(), )
        self.__showCurrentItem()
        return

    def __refreshItems(self):
        self.acceptingIndex = None
        self.__updateItems()
        return

    def __updateItems(self):
        if self.dialogBox:
            self.dialogBox.cleanup()
            self.dialogBox = None
        self.items = self.getItems()
        if self.itemIndex >= len(self.items):
            print 'adjusting item index -1'
            self.itemIndex = len(self.items) - 1
        if len(self.items) == 0:
            print 'exiting due to lack of items'
            self.__handleExit()
            return
        self.itemCountLabel['text'] = (self.__getNumberOfItemsText(), )
        self.__showCurrentItem()
        return

    def __getNumberOfItemsText(self):
        if len(self.items) == 1:
            return TTLocalizer.MailboxOneItem
        else:
            return TTLocalizer.MailboxNumberOfItems % len(self.items)

    def __clearCurrentItem(self):
        if self.itemPanel:
            self.itemPanel.destroy()
            self.itemPanel = None
        if self.ival:
            self.ival.finish()
            self.ival = None
        if not self.gettingText.isEmpty():
            self.gettingText.hide()
        if not self.itemText.isEmpty():
            self.itemText.hide()
        if not self.giftTagPanel.isEmpty():
            self.giftTagPanel.hide()
        if not self.acceptButton.isEmpty():
            self.acceptButton['state'] = DGG.DISABLED
        if self.currentItem:
            if isinstance(self.currentItem, CatalogItem.CatalogItem):
                self.currentItem.cleanupPicture()
            self.currentItem = None
        return

    def __showCurrentItem(self):
        self.__clearCurrentItem()
        if len(self.items) < 1:
            self.__handleExit()
            return
        self.partyInviteVisual.stash()
        if self.itemIndex + 1 > len(self.items):
            self.itemIndex = len(self.items) - 1
        item = self.items[self.itemIndex]
        if self.itemIndex == self.acceptingIndex:
            self.gettingText[
                'text'] = TTLocalizer.MailboxGettingItem % self.getItemName(
                    item)
            self.gettingText.show()
            return
        self.itemText['text'] = self.getItemName(item)
        self.currentItem = item
        if isinstance(item, CatalogItem.CatalogItem):
            self.acceptButton['text'] = ('', TTLocalizer.MailboxAcceptButton,
                                         TTLocalizer.MailboxAcceptButton, '')
            self.DiscardButton['text'] = ('', TTLocalizer.MailBoxDiscard,
                                          TTLocalizer.MailBoxDiscard, '')
            if item.isAward():
                self.giftTagPanel[
                    'text'] = TTLocalizer.SpecialEventMailboxStrings[
                        item.specialEventId]
            elif item.giftTag != None:
                nameOfSender = self.getSenderName(item.giftTag)
                if item.giftCode == ToontownGlobals.GIFT_RAT:
                    self.giftTagPanel[
                        'text'] = TTLocalizer.CatalogAcceptRATBeans
                elif item.giftCode == ToontownGlobals.GIFT_partyrefund:
                    self.giftTagPanel[
                        'text'] = TTLocalizer.CatalogAcceptPartyRefund
                else:
                    self.giftTagPanel[
                        'text'] = TTLocalizer.MailboxGiftTag % nameOfSender
            else:
                self.giftTagPanel['text'] = ''
            self.itemPanel, self.ival = item.getPicture(base.localAvatar)
        elif isinstance(item, SimpleMailBase):
            self.acceptButton['text'] = ('', TTLocalizer.MailboxAcceptButton,
                                         TTLocalizer.MailboxAcceptButton, '')
            self.DiscardButton['text'] = ('', TTLocalizer.MailBoxDiscard,
                                          TTLocalizer.MailBoxDiscard, '')
            senderId = item.senderId
            nameOfSender = self.getSenderName(senderId)
            self.giftTagPanel['text'] = TTLocalizer.MailFromTag % nameOfSender
            self.itemText['text'] = item.body
        elif isinstance(item, InviteInfoBase):
            self.acceptButton['text'] = ('', TTLocalizer.MailboxAcceptInvite,
                                         TTLocalizer.MailboxAcceptInvite, '')
            self.DiscardButton['text'] = ('', TTLocalizer.MailBoxRejectInvite,
                                          TTLocalizer.MailBoxRejectInvite, '')
            partyInfo = None
            for party in self.avatar.partiesInvitedTo:
                if party.partyId == item.partyId:
                    partyInfo = party
                    break
            else:
                MailboxScreen.notify.error(
                    'Unable to find party with id %d to match invitation %s' %
                    (item.partyId, item))

            if self.mailbox:
                if item.status == PartyGlobals.InviteStatus.NotRead:
                    self.mailbox.sendInviteReadButNotReplied(item.inviteKey)
            senderId = partyInfo.hostId
            nameOfSender = self.getSenderName(senderId)
            self.giftTagPanel['text'] = ''
            self.itemText['text'] = ''
            self.partyInviteVisual.updateInvitation(nameOfSender, partyInfo)
            self.partyInviteVisual.unstash()
            self.itemPanel = None
            self.ival = None
        else:
            self.acceptButton['text'] = ('', TTLocalizer.MailboxAcceptButton,
                                         TTLocalizer.MailboxAcceptButton, '')
            self.DiscardButton['text'] = ('', TTLocalizer.MailBoxDiscard,
                                          TTLocalizer.MailBoxDiscard, '')
            self.giftTagPanel['text'] = ' '
            self.itemPanel = None
            self.ival = None
        self.itemText.show()
        self.giftTagPanel.show()
        if self.itemPanel and item.getTypeName() != TTLocalizer.ChatTypeName:
            self.itemPanel.reparentTo(self.itemBoard, -1)
            self.itemPanel.setPos(0, 0, 0.4)
            self.itemPanel.setScale(0.21)
            self.itemText['text_wordwrap'] = 16
            self.itemText.setPos(0.0, 0.0, 0.075)
        elif isinstance(item, CatalogItem.CatalogItem) and item.getTypeName(
        ) == TTLocalizer.ChatTypeName:
            self.itemPanel.reparentTo(self.itemBoard, -1)
            self.itemPanel.setPos(0, 0, 0.35)
            self.itemPanel.setScale(0.21)
            self.itemText['text_wordwrap'] = 10
            self.itemText.setPos(0, 0, 0.3)
        else:
            self.itemText.setPos(0, 0, 0.3)
        if self.ival:
            self.ival.loop()
        if self.acceptingIndex == None:
            self.acceptButton['state'] = DGG.NORMAL
        if self.itemIndex > 0:
            self.prevButton['state'] = DGG.NORMAL
        else:
            self.prevButton['state'] = DGG.DISABLED
        if self.itemIndex + 1 < len(self.items):
            self.nextButton['state'] = DGG.NORMAL
        else:
            self.nextButton['state'] = DGG.DISABLED
        return

    def __nextItem(self):
        messenger.send('wakeup')
        if self.itemIndex + 1 < len(self.items):
            self.itemIndex += 1
            self.__showCurrentItem()

    def __prevItem(self):
        messenger.send('wakeup')
        if self.itemIndex > 0:
            self.itemIndex -= 1
            self.__showCurrentItem()

    def getItemName(self, item):
        if isinstance(item, CatalogItem.CatalogItem):
            return item.getName()
        elif isinstance(item, str):
            return TTLocalizer.MailSimpleMail
        elif isinstance(item, InviteInfoBase):
            return TTLocalizer.InviteInvitation
        else:
            return ''

    def getItems(self):
        result = []
        result = self.avatar.awardMailboxContents[:]
        result += self.avatar.mailboxContents[:]
        if self.avatar.mail:
            result += self.avatar.mail
        mailboxInvites = self.avatar.getInvitesToShowInMailbox()
        if mailboxInvites:
            result += mailboxInvites
        return result

    def getNumberOfAwardItems(self):
        result = 0
        for item in self.items:
            if isinstance(item,
                          CatalogItem.CatalogItem) and item.specialEventId > 0:
                result += 1
            else:
                break

        return result

    def getSenderName(self, avId):
        sender = base.cr.identifyFriend(avId)

        if sender:
            return sender.getName()

        for av in base.cr.avList:
            if av.id == avId:
                return av.name

        return TTLocalizer.MailboxGiftTagAnonymous