Example #1
0
    def __init__(self):
        wx.Frame.__init__(self, None, title='Simple Menu Test')
        self.panel = wx.Panel(self)

        self.panel.Sizer = wx.BoxSizer(wx.VERTICAL)

        menu = SimpleMenu(self, skinkey='simplemenu', maxheight=10, width=100)

        items = [
            SimpleMenuItem('Test1'),  #,self.DifferentMethodTest),
            SimpleMenuItem('Test2'),
            SimpleMenuItem('Test3'),
            SimpleMenuItem(id=-1),
            SimpleMenuItem('Test4')
        ]

        menu.SetItems(items)

        skin = 'button'
        size = None  #(100,100)#
        type = 'menu'  #None#'toggle'#
        #menu=None#self.menu#
        icon = None  #wx.Bitmap('../../../res/skins/default/statusicons/mobile.png',wx.BITMAP_TYPE_PNG)#wx.Bitmap('../../res/skins/default/tinydigsby.png',wx.BITMAP_TYPE_PNG)

        self.smb1 = UberButton(self.panel,
                               wx.NewId(),
                               "SMB",
                               skin,
                               icon=icon,
                               style=wx.HORIZONTAL,
                               size=size,
                               type=type,
                               menu=menu)

        self.panel.Sizer.Add(self.smb1)
Example #2
0
    def __init__(self, parent, textctrl, skinkey, formatOptions):

        ToolBar.__init__(self, parent, skinkey = None, alignment = wx.ALIGN_LEFT)

        self.SetSkinKey(skinkey, FormattingBarSkinDefaults)

        self.textctrl = textctrl
        if sys.platform.startswith("win"):
            textctrl.Bind(EVT_SELECTION_CHANGED, self.OnCursorMove)
        textctrl.Bind(EVT_TEXT_FORMAT_CHANGED, self.OnCursorMove)

        self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)

        self.fontdd = FontDropDown(self, skinkey = self.skinTB['buttonskin'])
        self.fontdd.SetMenuSkinKey(self.skinTB["menuskin"])
        self.fontdd.Bind(wx.EVT_COMMAND_CHOICE_SELECTED, self.OnFontSelected)

        icons = self.icons

        self.msize = SimpleMenu(self, self.skinTB['menuskin'], maxheight = 10)
        self.msize.SetItems(self.GenSizeItems(DEFAULT_SIZES)) #TODO: None default sizes
#        self.msize.Bind(wx.EVT_COMMAND_CHOICE_SELECTED, self.OnSizeSelected)

        self.bsize = UberButton(self, -1, '10', menu = self.msize, type = 'menu')
        self.bsize.SetStaticWidth(self.skinFB['sizedropdownwidth'])
        self.msize.SetWidth(self.skinFB['sizedropdownwidth'])

        self.bbold = UberButton(self, -1, icon = icons['bold'], type = 'toggle')
        self.bbold.Bind(wx.EVT_TOGGLEBUTTON, self.OnBoldButton)

        self.bitalic = UberButton(self, -1, icon = icons['italic'], type="toggle")
        self.bitalic.Bind(wx.EVT_TOGGLEBUTTON, self.OnItalicButton)

        self.bunderline = UberButton(self, -1, icon = icons['underline'],  type="toggle")
        self.bunderline.Bind(wx.EVT_TOGGLEBUTTON, self.OnUnderlineButton)

        self.bcolor = UberButton(self, -1, icon = icons['foregroundcolor'] )
        self.bcolor.Bind(wx.EVT_BUTTON, self.OnColorButton)

        self.bbgcolor = UberButton(self,-1, icon = icons['backgroundcolor'])
        self.bbgcolor.Bind(wx.EVT_BUTTON, self.OnBGColorButton)

        self.bemote = UberButton(self, -1, icon = icons['emote'])
        self.bemote.Bind(wx.EVT_BUTTON, self.OnEmoteButton)

#        import pdb
#        pdb.set_trace()
        self.AddMany([self.fontdd,
                      self.bsize,
                      self.bbold,
                      self.bitalic,
                      self.bunderline,
                      self.bcolor,
                      self.bbgcolor,
                      self.bemote])


        self.initover = True
        self.EnableFormattingButtons(formatOptions)
        self.UpdateDisplay()
Example #3
0
    def FileMenu(self):

        self._filemenu = SimpleMenu(self, self.menuskin)
        self.send_file_item = SimpleMenuItem(_('Send File'),
                                             lambda *a: self.OnSendFiles())
        #            if b and b.online:
        self._filemenu.AppendItem(self.send_file_item)
        self._filemenu.AppendItem(
            SimpleMenuItem(_('Transfer History'),
                           lambda *a: FileTransferDialog.Display()))

        return self._filemenu
Example #4
0
    def __init__(self):
        wx.Frame.__init__(self,None,title='Extended Simple Menu Test')
        self.panel=wx.Panel(self)

        self.panel.Sizer=wx.BoxSizer(wx.VERTICAL)


        menu=SimpleMenu(self, 'simplemenu',width=100)
        submenu=SimpleMenu(menu, 'simplemenu',width=100)
        submenu2=SimpleMenu(submenu, 'simplemenu',width=100)

        subitems=[
            SimpleMenuItem('Test5'),
            SimpleMenuItem(id=-1),
            SimpleMenuItem('Test6'),
            SimpleMenuItem('Test7',menu=submenu2),
            SimpleMenuItem('Test8')
        ]

        submenu.SetItems(subitems)

        items=[
            SimpleMenuItem('Test1'),
            SimpleMenuItem('Test2'),
            SimpleMenuItem("Test3 is a submenu m'kay",menu=submenu),
            SimpleMenuItem(id=-1),
            SimpleMenuItem('Test4'),
        ]

        items3=[
            SimpleMenuItem('Test9'),
            SimpleMenuItem('Test10'),
            SimpleMenuItem('Test11'),
            SimpleMenuItem('Test12'),
            SimpleMenuItem('Test13'),
            SimpleMenuItem('Test14'),
            SimpleMenuItem('Test15'),
            SimpleMenuItem('Test16'),
            SimpleMenuItem('Test17')
        ]

        submenu2.SetItems(items3)


        menu.SetItems(items)

        skin='button'
        size=None#(100,100)#
        type='menu'#None#'toggle'#
        #menu=None#self.menu#
        icon=wx.Bitmap('../../../res/skins/default/statusicons/mobile.png',wx.BITMAP_TYPE_PNG)#wx.Bitmap('../../res/skins/default/tinydigsby.png',wx.BITMAP_TYPE_PNG)

        self.smb1=UberButton(self.panel,wx.NewId(),"SMB",skin,icon=icon,style=wx.HORIZONTAL,size=size,type=type,menu=menu)

        self.panel.Sizer.Add(self.smb1)

        self.Bind(wx.EVT_MENU,self.OnMenu)
Example #5
0
    def __init__(self, combo, OnLoseFocus):
        self.combo = combo

        # the "remove" menu contains every item
        menu = combo.menu
        self.remove_menu = SimpleMenu(menu,
                                      combo.menuskin,
                                      callback=self.OnRemove)

        self.remove_item = SimpleMenuItem(_('Remove'), menu=self.remove_menu)
        self.add_item = SimpleMenuItem(_('Add...'), method=self.OnAdd)

        self.OnLoseFocus = OnLoseFocus
Example #6
0
    def setup_from_accts(self):
        # add an "Add" menu containing each email account type
        self.addList = addList = SimpleMenu(self.fromcombo.menu, 'simplemenu')
        for emailtype in emailprotocols.keys():
            addList.Append([
                skinget('serviceicons.%s' % emailtype).Resized(16),
                protocols[emailtype].name
            ],
                           method=lambda item, emailtype=emailtype:
                           add_email_account(emailtype))

        # link to creating an email account
        from gui.pref import prefsdialog
        self.accounts_item = SimpleMenuItem(
            _('Accounts...'), method=lambda *a: prefsdialog.show('accounts'))

        # watch the email list for changes
        pass

        self._obs_link = profile.emailaccounts.add_list_observer(
            self.on_email_accounts_changed, self.on_email_accounts_changed,
            'enabled')

        self.tocombo.Bind(EVT_WINDOW_DESTROY, lambda e:
                          (e.Skip(), self.unregister_observers()))
Example #7
0
    def show_extended_status_menu(self):
        from gui.status import get_state_choices

        m = SimpleMenu(self, skinkey=skin.get('%s.MenuSkin' % self.skinkey))

        for status in get_state_choices():
            statusname, statuslabel = status

            def onclick(item, state=statusname):
                self.change_state(
                    state
                )  #, change_text = self.status_state == self.GetValue())

            m.AppendItem(
                SimpleMenuItem(
                    [StatusMessage.icon_for(statusname), statuslabel],
                    method=onclick))

        if m.GetCount() > 0:
            m.Display(self.cbutton)
Example #8
0
class FormattingBar(ToolBar, NewSkinModule):

    initover = False

    def __init__(self, parent, textctrl, skinkey, formatOptions):

        ToolBar.__init__(self, parent, skinkey = None, alignment = wx.ALIGN_LEFT)

        self.SetSkinKey(skinkey, FormattingBarSkinDefaults)

        self.textctrl = textctrl
        if sys.platform.startswith("win"):
            textctrl.Bind(EVT_SELECTION_CHANGED, self.OnCursorMove)
        textctrl.Bind(EVT_TEXT_FORMAT_CHANGED, self.OnCursorMove)

        self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)

        self.fontdd = FontDropDown(self, skinkey = self.skinTB['buttonskin'])
        self.fontdd.SetMenuSkinKey(self.skinTB["menuskin"])
        self.fontdd.Bind(wx.EVT_COMMAND_CHOICE_SELECTED, self.OnFontSelected)

        icons = self.icons

        self.msize = SimpleMenu(self, self.skinTB['menuskin'], maxheight = 10)
        self.msize.SetItems(self.GenSizeItems(DEFAULT_SIZES)) #TODO: None default sizes
#        self.msize.Bind(wx.EVT_COMMAND_CHOICE_SELECTED, self.OnSizeSelected)

        self.bsize = UberButton(self, -1, '10', menu = self.msize, type = 'menu')
        self.bsize.SetStaticWidth(self.skinFB['sizedropdownwidth'])
        self.msize.SetWidth(self.skinFB['sizedropdownwidth'])

        self.bbold = UberButton(self, -1, icon = icons['bold'], type = 'toggle')
        self.bbold.Bind(wx.EVT_TOGGLEBUTTON, self.OnBoldButton)

        self.bitalic = UberButton(self, -1, icon = icons['italic'], type="toggle")
        self.bitalic.Bind(wx.EVT_TOGGLEBUTTON, self.OnItalicButton)

        self.bunderline = UberButton(self, -1, icon = icons['underline'],  type="toggle")
        self.bunderline.Bind(wx.EVT_TOGGLEBUTTON, self.OnUnderlineButton)

        self.bcolor = UberButton(self, -1, icon = icons['foregroundcolor'] )
        self.bcolor.Bind(wx.EVT_BUTTON, self.OnColorButton)

        self.bbgcolor = UberButton(self,-1, icon = icons['backgroundcolor'])
        self.bbgcolor.Bind(wx.EVT_BUTTON, self.OnBGColorButton)

        self.bemote = UberButton(self, -1, icon = icons['emote'])
        self.bemote.Bind(wx.EVT_BUTTON, self.OnEmoteButton)

#        import pdb
#        pdb.set_trace()
        self.AddMany([self.fontdd,
                      self.bsize,
                      self.bbold,
                      self.bitalic,
                      self.bunderline,
                      self.bcolor,
                      self.bbgcolor,
                      self.bemote])


        self.initover = True
        self.EnableFormattingButtons(formatOptions)
        self.UpdateDisplay()

    def OnContextMenu(self, event):
        from gui.uberwidgets.umenu import UMenu
        m = UMenu(self)
        m.AddItem(_('Hide Formatting Bar'), callback = lambda: wx.CallAfter(setpref, 'messaging.show_formatting_bar', False))
        m.PopupMenu()

    def OnFontSelected(self, event):
        """
            Updates the button to the new font and applies it to the selection
            or calls ApplyStlye
        """
        self.textctrl.ApplyStyle(facename = self.fontdd.GetClientData(self.fontdd.GetSelection()).GetFaceName())


    def OnSizeSelected(self, item):
        """
            Updates the Size button to the new size and applies it to the selection
            or calls ApplyStyle
        """
        self.bsize.label = str(item.id)
        self.textctrl.ApplyStyle(pointsize = item.id)

    def OnBoldButton(self, event):
        self.textctrl.ApplyStyle(bold = event.EventObject.IsActive())

    def OnItalicButton(self, event):
        self.textctrl.ApplyStyle(italic = event.EventObject.IsActive())

    def OnUnderlineButton(self, event):
        self.textctrl.ApplyStyle(underline = event.EventObject.IsActive())

    def OnColorButton(self, event):
        oldtextcolor = self.textctrl.GetFormat().GetTextColour()
        self.textctrl.ApplyStyle(textcolor = wx.GetColourFromUser(self, oldtextcolor, _('Choose a foreground color')))

    def OnBGColorButton(self, event):
        oldbgcolor = self.textctrl.GetFormat().GetTextColour()
        self.textctrl.ApplyStyle(bgcolor = wx.GetColourFromUser(self, oldbgcolor, _('Choose a background color')))

    def OnEmoteButton(self, event):
        self.DisplayEmotibox(self.bemote.ScreenRect)

    def DisplayEmotibox(self, rect):
        import hooks
        hooks.notify('digsby.statistics.emoticons.box_viewed')
        ebox = self.GetEmotibox()
        # position and display the emotibox
        ebox.Display(rect)

    def GetEmotibox(self):
        'Shares the emoticon box between all instances of this class.'

        b = None
        old_name, new_name = getattr(self, '_emotipack_name', None), pref('appearance.conversations.emoticons.pack', type = unicode, default = u'default')
        self._emotipack_name = new_name

        try:
            b = self.__class__.emotibox
            if not wx.IsDestroyed(b):
                if old_name != new_name:
                    b.Destroy()
                elif b.Parent is not self:
                    b.Reparent(self)

        except AttributeError:
            pass

        if b is None or wx.IsDestroyed(b):
            from gui.imwin.emoticons import get_emoticon_bitmaps
            b = self.__class__.emotibox = UberEmotiBox(self, get_emoticon_bitmaps(self._emotipack_name), self.textctrl, maxwidth = 12)
        else:
            b.SetTextCtrl(self.textctrl)

        return b

    def OnCursorMove(self, event):

        event.Skip()
        wx.CallAfter(self.UpdateDisplay)

    def UpdateDisplay(self):
        if wx.IsDestroyed(self.textctrl):
            return

        selection = self.textctrl.GetSelection()
        if selection[0] != selection[1]:
            return

        textattr = self.textctrl.GetFormat()
        font = textattr.GetFont()

        facename = font.GetFaceName()
        self.fontdd.SetSelection(self.fontdd.FindString(facename, False))
        self.bsize.SetLabel(str(font.GetPointSize()))

        self.bbold.Active(font.GetWeight() == wx.FONTWEIGHT_BOLD)
        self.bitalic.Active(font.GetStyle() == wx.FONTSTYLE_ITALIC)
        self.bunderline.Active(font.GetUnderlined())


    def EnableFormattingButtons(self, enabledict):

        if enabledict is None:
            return

        default = enabledict['default'] if 'default' in enabledict else True

        #TODO: fontdd should be disableable
        buttons = [#('font', self.fontdd),
                   ('size',      self.bsize),
                   ('bold',      self.bbold),
                   ('italic',    self.bitalic),
                   ('underline', self.bunderline),
                   ('color',     self.bcolor),
                   ('bgcolor',   self.bbgcolor),
                   ('emote',     self.bemote)]

        for key, button in buttons:
            button.Enable(enabledict[key] if key in enabledict else default)

    def GenSizeItems(self, sizes = DEFAULT_SIZES):
        """
            Sets the list of selectable sizes
            If not set sizes default to ['8', '10', '12', '14', '18', '24', '36']
        """
        return [SimpleMenuItem([str(size)], id=size, method = self.OnSizeSelected) for size in sizes]

    def DoUpdateSkin(self, skin):

        self.skinFB = skin

        ToolBar.DoUpdateSkin(self, SkinProxy(skin['toolbarskin'], ToolBarSkinDefaults))

        icons = self.icons = {}
        icons['bold'] = skin['icons.bold']
        icons['italic'] = skin['icons.italic']
        icons['underline'] = skin['icons.underline']
        icons['foregroundcolor'] = skin['icons.foregroundcolor']
        icons['backgroundcolor'] = skin['icons.backgroundcolor']
        icons['emote'] = skin['icons.emote']

        iconsize = skin['iconsize']
        for key in icons:
            if icons[key] is not None:
                icons[key] = icons[key].Resized(iconsize)

        if self.initover:
            self.bsize.SetStaticWidth(skin['sizedropdownwidth'])
            self.msize.SetWidth(skin['sizedropdownwidth'])

            self.bbold.SetIcon(icons['bold'])
            self.bitalic.SetIcon(icons['italic'])
            self.bunderline.SetIcon(icons['underline'])
            self.bcolor.SetIcon(icons['foregroundcolor'])
            self.bbgcolor.SetIcon(icons['backgroundcolor'])
            self.bemote.SetIcon(icons['emote'])

    def GetSkinProxy(self):
        return self.skinFB if hasattr(self, 'skinFB') else None
Example #9
0
class CapabilitiesBar(SimplePanel):
    '''
    A specialized UberBar used used in the infobox and the IM window
    has a subbar with to/from combos.
    '''
    def __init__(self,
                 parent,
                 buddy_callback,
                 showCapabilities=True,
                 infoboxmode=False):
        SimplePanel.__init__(self, parent)

        self.buddy_callback = buddy_callback

        self.Bind(wx.EVT_PAINT, lambda e: wx.PaintDC(self))

        self.infoboxmode = infoboxmode
        self._lastcaps = None

        self.UpdateSkin()
        self.Sizer = wx.BoxSizer(wx.VERTICAL)

        # create delegates for callbacks
        for action in ('OnSendFiles', 'OnSendFolder', 'OnViewPastChats',
                       'OnAlert', 'OnBlock', 'OnAddContact'):
            setattr(self, action, Delegate())

        # Create the uberbar for the capabilities.
        self.cbar = bar = UberBar(self,
                                  skinkey=self.capabilitiesskin,
                                  overflowmode=True)
        # FIXME: we should simply not allow the capabilities bar to be created for native mode
        if not showCapabilities or nativeIMWindow:
            self.cbar.Hide()

        if not infoboxmode:
            self.cbar.Bind(wx.EVT_CONTEXT_MENU,
                           lambda e: self.ActionsBarMenu.PopupMenu(event=e))

        # Create all the buttons for the capabilities bar.

        iconsize = skin.get('ActionsBar.IconSize')
        icons = skin.get('ActionsBar.Icons')

        for attr, title, tooltip in buttons:
            icon = getattr(icons, attr).Resized(iconsize)
            if attr == 'files':
                # "files" has a dropdown menu
                button = UberButton(bar,
                                    -1,
                                    title,
                                    icon=icon,
                                    type='menu',
                                    menu=self.FileMenu)

                # Change the label and action of the files button when it's overflowed into
                # the menu on the right.
                button.overflow_label = _('Send File')
                button.overflow_callback = self.OnSendFiles
            else:
                # hack until I fix this :[ -kevin
                if attr == 'video' and infoboxmode: continue

                button = UberButton(bar, -1, title, icon=icon)
                button.overflow_label = title

            button.SetToolTipString(tooltip)

            setattr(self, 'b' + attr, button)
            bar.Add(button, calcSize=False)

        bar.OnUBSize()

        #TODO Add button logics

        #        if not self.infoboxmode:
        #            self.badd = UberButton(bar,-1,'',icon = getattr(icons, 'add').Resized(iconsize))
        #            bar.AddStatic(self.badd)
        #            self.badd.Bind(wx.EVT_BUTTON,lambda e: self.OnAddContact())

        # Create multichat icon for the roomlist
        if pref('messaging.groupchat.enabled', False) and not self.infoboxmode:
            self.bmultichat = UberButton(
                bar,
                -1,
                icon=skin.get('actionsbar.icons.roomlist').Resized(16),
                type='toggle')
            self.bmultichat.SetToolTipString(_('Group Chat'))
            bar.AddStatic(self.bmultichat)

        self.ihistory = SimpleMenuItem(_('View Past Chats'),
                                       method=self.OnViewPastChats)

        def show_prefs_notifications(a):
            import gui.pref.prefsdialog as prefsdialog
            prefsdialog.show('notifications')

        self.ialert = SimpleMenuItem(_("Alert Me When..."),
                                     method=show_prefs_notifications)
        self.iblock = SimpleMenuItem(_("Block"), method=self.OnBlock)

        if not self.infoboxmode:
            self.iadd = SimpleMenuItem(_("Add Contact"),
                                       method=self.OnAddContact)
            bar.AddMenuItem(self.iadd)
        bar.AddMenuItem(self.ihistory)
        bar.AddMenuItem(self.ialert)

        if not self.infoboxmode:
            bar.AddMenuItem(SimpleMenuItem(id=-1))
            bar.AddMenuItem(self.iblock)

        self.Sizer.Add(bar, 0, wx.EXPAND)

        # create the To/From bar
        self.tfbar = tfbar = UberBar(self, skinkey=self.tofromskin)
        self.tfbar.Hide()

        tofrom_font = skin.get('tofrombar.font', default_font)
        tofrom_color = skin.get('tofrombar.fontcolor', wx.BLACK)

        talign = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT

        self.to_label = ClearText(tfbar, _('To:'), alignment=talign)
        self.to_label.Font = tofrom_font
        self.to_label.FontColor = tofrom_color
        self.from_label = ClearText(tfbar, _('From:'), alignment=talign)
        self.from_label.Font = tofrom_font
        self.from_label.FontColor = tofrom_color

        self.cto = UberCombo(tfbar,
                             skinkey=self.tofromcomboskin,
                             typeable=False,
                             size=(100, 20),
                             minmenuwidth=200)
        self.cfrom = UberCombo(tfbar,
                               skinkey=self.tofromcomboskin,
                               typeable=False,
                               size=(100, 20),
                               minmenuwidth=200)

        tfbar.Add(self.to_label, calcSize=False)
        tfbar.Add(self.cto, True, calcSize=False)
        tfbar.Add(self.from_label, calcSize=False)
        tfbar.Add(self.cfrom, True)

        self.Sizer.Add(tfbar, 0, wx.EXPAND)

        profile.prefs.link(action_icons_key, self.UpdateIcons)

        self.cbar.overflowmenu.BeforeDisplay += self.ApplyCaps

    ToCombo = property(lambda self: self.cto)
    FromCombo = property(lambda self: self.cfrom)

    def UpdateSkin(self):
        'Tells the subbars what skins they should load.'

        sget = skin.get
        self.capabilitiesskin = sget('actionsbar.toolbarskin', None)
        self.tofromskin = sget('tofrombar.toolbarskin', None)

        self.menuskin = sget('%s.menuskin' % self.capabilitiesskin, None)

        self.tofromcomboskin = sget("tofrombar.comboboxskin", None)

        self.iconsize = sget('ActionsBar.IconSize')
        self.icons = sget('ActionsBar.Icons')

        if hasattr(self, 'to_label'):
            tofrom_font = sget('tofrombar.font', lambda: default_font())
            tofrom_color = sget('tofrombar.fontcolor', lambda: wx.BLACK)

            self.to_label.Font = self.from_label.Font = tofrom_font
            self.to_label.FontColor = self.from_label.FontColor = tofrom_color

        if hasattr(self, 'cbar'): self.cbar.SetSkinKey(self.capabilitiesskin)
        if hasattr(self, 'tfbar'): self.tfbar.SetSkinKey(self.tofromskin)
        if hasattr(self, 'cto'): self.cto.SetSkinKey(self.tofromcomboskin)
        if hasattr(self, 'cfrom'): self.cfrom.SetSkinKey(self.tofromcomboskin)

        self.UpdateIcons()

    def UpdateIcons(self, *a):
        'Updates icon sizes for buttons.'

        icons_pref = pref(action_icons_key)
        textonly = icons_pref == 'text'

        icons = self.icons
        size = self.iconsize
        #TODO: Add Button logics
        #        allbuttons = list(buttons)
        #        allbuttons.append(('add',''))

        with self.Frozen():
            for attr, title, tooltip in buttons:
                icon = None if textonly else getattr(icons, attr).Resized(size)
                button = getattr(self, 'b' + attr, None)
                if button is not None:
                    button.SetIcon(icon)
                    button.SetAlignment(wx.VERTICAL if icons_pref ==
                                        'above' else wx.HORIZONTAL)
                    button.SetLabel('' if icons_pref == 'icons' else title)

        self.Parent.Layout()
        self.Refresh()

    def ShowToFrom(self, show=True):
        'Show or hide the to/from bar.'

        return self.tfbar.Show(show)

    @property
    def RoomListButtonShown(self):
        bmultichat = getattr(self, 'bmultichat', None)
        return bmultichat is not None and bmultichat.IsShown()

    @property
    def ToFromShown(self):
        'Returns True if the To/From bar is shown.'

        return self.tfbar.IsShown()

    def ShowCapabilities(self, show=True):
        'Show/Hide the capabilities bar.'

        return self.cbar.Show(show)
        #self.Layout()

    def CapabilitiesIsShown(self):
        'Returns True if the capabilities bar is shown.'

        return self.cbar.IsShown()

    def GetButton(self, button):
        'Returns one of the butons by name.'

        return getattr(self, 'b' + button, None)

    def ApplyCaps(self, contact=None, convo=None):
        'Those shows and hides options depending on the capabilities the Contact reports.'

        if contact is None and convo is None:
            convo = self.buddy_callback()
            from common.Conversation import Conversation
            if not isinstance(convo, Conversation):
                contact = convo
                convo = None

        c = None
        if convo is not None:
            if convo.ischat:
                c = set([caps.IM])
            elif contact is None:
                contact = convo.buddy

        if c is None:
            c = set(contact.caps)

        if contact is not None:
            c.add(('blocked', contact.blocked))

        # early exit if capabilities are the same.
        if c == self._lastcaps: return

        buttons_caps = [('binfo', contact is not None and not any(
            (contact.sms and contact.mobile, self.infoboxmode))),
                        ('bim', caps.IM in c), ('bfiles', caps.FILES in c),
                        ('bemail', caps.EMAIL in c), ('bsms', caps.SMS in c),
                        ('bvideo', caps.VIDEO in c)]

        for name, val in buttons_caps:
            ctrl = getattr(self, name, None)
            if ctrl is not None:
                ctrl.Show(ctrl, val, False)

        cbar = self.cbar
        menu = cbar.overflowmenu
        count = menu.spine.items.count
        iblock = self.iblock

        if caps.BLOCKABLE in c and not count(iblock):
            cbar.AddMenuItem(SimpleMenuItem(id=-1))
            cbar.AddMenuItem(iblock)
        elif not caps.BLOCKABLE in c and count(iblock):
            cbar.overflowmenu.RemoveItem(iblock)

        if contact is not None:
            if contact.blocked:
                content = _('Unblock {name}')
            else:
                content = _('Block {name}')

            iblock.content = [content.format(name=contact.name)]

        self.set_groupchat_visibility(contact, convo)

        i = len(menu.spine.items) - 1
        if menu.GetItem(i).id == -1:
            menu.RemoveItem(i)

        # don't show the dropdown on the right for widgets.
        self.cbar.overflowbutton.Show(not getattr(contact, 'iswidget', False))

        self._lastcaps = c

        cbar.GenWidthRestriction(True)

        self.update_add_contact_shown(convo)

        self.Parent.Layout()

    def update_add_contact_shown(self, convo):
        if not hasattr(self, 'iadd'):
            return

        ischat = convo is not None and convo.ischat
        overflow = self.cbar.overflowmenu

        if ischat:
            if overflow.GetIndex(self.iadd) != -1:
                overflow.RemoveItem(self.iadd)
        else:
            if overflow.GetIndex(self.iadd) == -1:
                overflow.InsertItem(overflow.GetIndex(self.ihistory),
                                    self.iadd)

    def set_groupchat_visibility(self, contact, convo):
        if not hasattr(self, 'bmultichat'):
            return

        proto = getattr(contact, 'protocol', getattr(convo, 'protocol', None))
        groupchat = False
        if proto is not None:
            groupchat = getattr(proto,
                                'supports_group_chat', False) and getattr(
                                    contact, 'supports_group_chat', False)
            self.bmultichat.Show(groupchat)

    @property
    def FileMenu(self):

        self._filemenu = SimpleMenu(self, self.menuskin)
        self.send_file_item = SimpleMenuItem(_('Send File'),
                                             lambda *a: self.OnSendFiles())
        #            if b and b.online:
        self._filemenu.AppendItem(self.send_file_item)
        self._filemenu.AppendItem(
            SimpleMenuItem(_('Transfer History'),
                           lambda *a: FileTransferDialog.Display()))

        return self._filemenu

#        try:
#            return self._filemenu
#        except AttributeError:
#            self._filemenu = self.build_file_menu()
#            return self._filemenu

    @property
    def ActionsBarMenu(self):
        try:
            return self._actionsbarmenu
        except AttributeError:
            self._actionsbarmenu = self.build_actionsbar_menu()
            return self._actionsbarmenu

    def build_actionsbar_menu(self):
        m = UMenu(self, onshow=self.update_actionsbar_menu)

        c = self._actionsbar_checks = {}
        for name, label in [('icons', _('Icons Only')),
                            ('text', _('Text Only')),
                            ('next', _('Icons Next to Text')),
                            ('above', _('Icons Above Text'))]:

            def cb(name=name):
                with self.Frozen():
                    setpref(action_icons_key, name)

            c[name] = m.AddCheckItem(label, callback=cb)

        m.AddSep()
        m.AddItem(
            _('Hide Actions Bar'),
            callback=lambda: setpref('messaging.show_actions_bar', False))

        return m

    def update_actionsbar_menu(self, menu):
        p = pref(action_icons_key)
        for name, item in self._actionsbar_checks.iteritems():
            item.Check(p == name)
Example #10
0
class ComboListEditor(object):
    '''
    Given an UberCombo and a list of strings, allows the combo to "edit"
    the list.
    '''
    def __init__(self, combo, OnLoseFocus):
        self.combo = combo

        # the "remove" menu contains every item
        menu = combo.menu
        self.remove_menu = SimpleMenu(menu,
                                      combo.menuskin,
                                      callback=self.OnRemove)

        self.remove_item = SimpleMenuItem(_('Remove'), menu=self.remove_menu)
        self.add_item = SimpleMenuItem(_('Add...'), method=self.OnAdd)

        self.OnLoseFocus = OnLoseFocus

    def SetContentCallback(self, cb):
        if not hasattr(cb, '__call__'): raise TypeError
        self.content_cb = cb

    def EditList(self,
                 seq,
                 selected_item=None,
                 add_cb=None,
                 remove_cb=None,
                 default=''):

        self.default = default

        if add_cb is not None: self.add_cb = add_cb
        if remove_cb is not None: self.remove_cb = remove_cb

        assert isinstance(seq, list), repr(list)
        self.seq = list(seq)
        self.menu_items = [SimpleMenuItem(self.content_cb(i)) for i in seq]
        self.remove_menu.SetItems(list(self.menu_items))

        if selected_item is not None:
            self.selection = seq.index(selected_item)
        else:
            self.selection = -1 if len(seq) == 0 else 0

    def Apply(self):
        items = list(self.menu_items)  # Normal Items

        if len(self.menu_items):
            items.append(SimpleMenuItem(id=-1)),  # ---- a separator

        items.append(self.add_item)  # Add

        if len(self.menu_items):
            items.append(
                self.remove_item)  # Remove (if there are items to remove)

        combo = self.combo
        combo.SetCallbacks(selection=self.OnComboSelection, value=self.OnValue)
        combo.menu.SetItems(items)

        newval = self.menu_items[self.selection] if len(
            self.menu_items) and self.selection != -1 else self.default
        combo.ChangeValue(newval)

    def OnComboSelection(self, item):
        LOG('OnSelection: %r', item)

        self.selection = self.menu_items.index(item)
        self.combo.ChangeValue(item)
        self.OnLoseFocus()

    def GetValue(self):

        return self.menu_items[
            self.selection].GetContentAsString() if self.selection != -1 else (
                None if not self.default else self.default)

    def OnAdd(self, item):
        'Invoked when the "Add" menu item is clicked.'

        self.combo.EditValue('')

    def OnValue(self, val):
        wx.CallAfter(self.OnValueLater, val)

    def OnValueLater(self, val):

        # This method is called when the editable part of the combo loses focus.
        # - if the combo is on screen, the user hit enter or otherwise caused this to happen.
        #   in this case, perform validation and display an error dialog if the validation fails
        # - otherwise, maybe another app stole focus--some external event cause this to happen
        #   popping up a modal dialog would be bad, so just return the value to what it was before

        if val == '' or not self.combo.IsShown(
        ) or not self.combo.Top.IsActive():

            LOG(
                "Val: %s\nCombo is ShownOnScreen: %s\nTop level parent is Active: %s",
                val, self.combo.IsShownOnScreen(),
                not self.combo.Top.IsActive())

            if val == '': LOG('empty string, selection is %s', self.selection)
            else:
                LOG('combo not on screen, falling back to %s', self.selection)

            # Restore the combo's value.
            if self.combo.Top.IsActive():
                self.OnLoseFocus()
            return self.combo.ChangeValue(self.menu_items[
                self.selection] if self.selection != -1 else self.default)

        val = self.add_cb(val)

        if val is None:
            self.combo.EditValue()
        else:
            LOG('add_cb returned True')

            self.seq.append(val)
            self.menu_items.append(SimpleMenuItem(self.content_cb(val)))
            self.remove_menu.AppendItem(SimpleMenuItem(self.content_cb(val)))
            self.selection = len(self.menu_items) - 1
            self.Apply()

    def OnRemove(self, item):
        'Invoked when one of the "remove" menu items is clicked.'
        i = self.remove_menu.GetItemIndex(item)
        assert len(self.menu_items) <= len(self.remove_menu)

        if self.remove_cb(self.seq[i]):
            LOG('removing item %d (selection is %s)', i, self.selection)
            self.seq.pop(i)
            self.remove_menu.RemoveItem(i)
            self.menu_items.pop(i)

            if i == self.selection:
                l = len(self.menu_items)
                if l:
                    i = i % len(self.menu_items)
                    newval = self.menu_items[i]
                else:
                    i = -1
                    newval = self.default
                self.combo.ChangeValue(newval)
            elif i < self.selection:
                i -= 1

            self.selection = i
            LOG('now selection is %s', self.selection)
            self.Apply()