Limit the scope of menu accelerators

I'm using Python 2.7.2 and wxPython 2.8.12.1 on Arch Linux x86_64.

I'd like to make the following example work this way:
* when left TextCtrl (text_A) has focus, by pressing Shift+A it should
execute do_A(), and by pressing Shift+B it should write B in the text
area (in the real application I would also dynamically disable
menu.foo.bar_B)
* when right TextCtrl (text_B) has focus, by pressing Shift+A it
should write A in the text area, and by pressing Shift+B it should
execute do_B() (in the real application I would also dynamically
disable menu.foo.bar_A)

···

#############################################
import wx

class Foo(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, size=(600, 480))

        self.init_menu()
        self.init_text()

        self.Centre()
        self.Show(True)

    def init_menu(self):
        self.menu = wx.MenuBar()
        self.SetMenuBar(self.menu)

        self.menu.foo = wx.Menu()
        self.menu.Append(self.menu.foo, "&Foo")

        self.menu.foo.bar_A = self.menu.foo.Append(wx.ID_ANY, "Bar&A
\tShift+A")
        self.menu.foo.bar_B = self.menu.foo.Append(wx.ID_ANY, "Bar&B
\tShift+B")

        self.Bind(wx.EVT_MENU, self.handle_A, self.menu.foo.bar_A)
        self.Bind(wx.EVT_MENU, self.handle_B, self.menu.foo.bar_B)

    def init_text(self):
        self.box = wx.BoxSizer(wx.HORIZONTAL)
        self.SetSizer(self.box)

        self.text_A = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.text_B = wx.TextCtrl(self, style=wx.TE_MULTILINE)

        self.box.Add(self.text_A, 1, flag=wx.EXPAND)
        self.box.Add(self.text_B, 1, flag=wx.EXPAND)

    def handle_A(self, event):
        print('A')

    def handle_B(self, event):
        print('B')

app = wx.App()
Foo()
app.MainLoop()
#############################################

Of course dynamically disabling the menu items is not enough, in fact
the respective accelerators are not set free when items are disabled.

I know I can limit the scope of menu accelerators with instances of
wx.AcceleratorTable, but I want to display the key combinations in the
menu, and that way their scope will be extended to the whole window
anyway.

Thank you!

I'm simplifying my question: is it possible to show keyboard shortcuts
in menu items without setting them automatically as working
accelerators?

No, although that is something I've also wished for. See if you can find a ticket for this already in Trac (trac.wxwidgets.org) and if not please add a ticket for it.

···

On 11/11/11 6:29 AM, Dario Giovannetti wrote:

I'm simplifying my question: is it possible to show keyboard shortcuts
in menu items without setting them automatically as working
accelerators?

--
Robin Dunn
Software Craftsman

You could always try binding them to a no-op handler, possibly one that
beeps then aborts the event, alternatively you could check if the menu
item is enabled at the beginning of each handler, (less elegant I
know). Possibly you could overload the wxMenu with a Enable that either
stores the original binding and binds to a disabled menu item selected
event handler or restores the original binding depending on the value of
the Enable parameter.

Gadget/Steve

···

On 11/11/2011 2:29 PM, Dario Giovannetti wrote:

I'm simplifying my question: is it possible to show keyboard shortcuts
in menu items without setting them automatically as working
accelerators?

Thanks Robin, I've found wxTrac has been migrated to GitHub Issues - wxWidgets (don't
know why it was closed), wxTrac has been migrated to GitHub Issues - wxWidgets (closed
more understandably) and wxTrac has been migrated to GitHub Issues - wxWidgets (which
looks somewhat related, but not mentioning this problem directly).
What do you suggest to do? Reopening one of the closed tickets,
replying to #11320 or creating a new ticket?

···

On 11 Nov, 23:29, Robin Dunn <ro...@alldunn.com> wrote:

On 11/11/11 6:29 AM, Dario Giovannetti wrote:

> I'm simplifying my question: is it possible to show keyboard shortcuts
> in menu items without setting them automatically as working
> accelerators?

No, although that is something I've also wished for. See if you can
find a ticket for this already in Trac (trac.wxwidgets.org) and if not
please add a ticket for it.

--
Robin Dunn
Software Craftsmanhttp://wxPython.org

Thanks for answering, however I don't understand exactly your first
answer, and about the second one, the key combination is "stolen" by
the menu item even if it's not bound to a handler: my goal is not just
disabling the key shortcuts, but also restoring their default
behaviour (for example in TextCtrl's) when the menu item is disabled.
Yes, I may adapt your solution by dynamically changing the label of
menu items (which are responsible for accelerators), but, when those
items are disabled, the shortcuts wouldn't be shown, so I'd rather
avoid that behaviour.

···

On 12 Nov, 09:47, Gadget/Steve <GadgetSt...@live.co.uk> wrote:

On 11/11/2011 2:29 PM, Dario Giovannetti wrote:> I'm simplifying my question: is it possible to show keyboard shortcuts
> in menu items without setting them automatically as working
> accelerators?

You could always try binding them to a no-op handler, possibly one that
beeps then aborts the event, alternatively you could check if the menu
item is enabled at the beginning of each handler, (less elegant I
know). Possibly you could overload the wxMenu with a Enable that either
stores the original binding and binds to a disabled menu item selected
event handler or restores the original binding depending on the value of
the Enable parameter.

Gadget/Steve

signature.asc
< 1KVisualizzaScarica

Well, it's not quite the same thing so I would make a new ticket and then just state in the description that it is similar to #11320.

···

On 11/12/11 6:34 AM, Dario Giovannetti wrote:

On 11 Nov, 23:29, Robin Dunn<ro...@alldunn.com> wrote:

On 11/11/11 6:29 AM, Dario Giovannetti wrote:

I'm simplifying my question: is it possible to show keyboard shortcuts
in menu items without setting them automatically as working
accelerators?

No, although that is something I've also wished for. See if you can
find a ticket for this already in Trac (trac.wxwidgets.org) and if not
please add a ticket for it.

Thanks Robin, I've found wxTrac has been migrated to GitHub Issues - wxWidgets (don't
know why it was closed), wxTrac has been migrated to GitHub Issues - wxWidgets (closed
more understandably) and wxTrac has been migrated to GitHub Issues - wxWidgets (which
looks somewhat related, but not mentioning this problem directly).
What do you suggest to do? Reopening one of the closed tickets,
replying to #11320 or creating a new ticket?

--
Robin Dunn
Software Craftsman

I've just opened the new ticket: wxTrac has been migrated to GitHub Issues - wxWidgets

···

On 14 Nov, 18:31, Robin Dunn <ro...@alldunn.com> wrote:

On 11/12/11 6:34 AM, Dario Giovannetti wrote:

> On 11 Nov, 23:29, Robin Dunn<ro...@alldunn.com> wrote:
>> On 11/11/11 6:29 AM, Dario Giovannetti wrote:

>>> I'm simplifying my question: is it possible to show keyboard shortcuts
>>> in menu items without setting them automatically as working
>>> accelerators?

>> No, although that is something I've also wished for. See if you can
>> find a ticket for this already in Trac (trac.wxwidgets.org) and if not
>> please add a ticket for it.
> Thanks Robin, I've foundhttp://trac.wxwidgets.org/ticket/8745(don’t
> know why it was closed),wxTrac has been migrated to GitHub Issues - wxWidgets(closed
> more understandably) andhttp://trac.wxwidgets.org/ticket/11320(which
> looks somewhat related, but not mentioning this problem directly).
> What do you suggest to do? Reopening one of the closed tickets,
> replying to #11320 or creating a new ticket?

Well, it's not quite the same thing so I would make a new ticket and
then just state in the description that it is similar to #11320.

--
Robin Dunn
Software Craftsmanhttp://wxPython.org