How to make StatusInteractivePopUpWindow active by default

  • Hi,

    When I use StatusInteractivePopUpWindow as a UI base for an extension, the vanilla List within is not active (in focus?) by default. So when I press its shortcut and the window opens, I need to click on the List for it to be active. It seems that there is no problem like this if I use vanilla’s Window, but the problem does still happen with FloatingWindow. I was wondering why that is? Is there a way to make a popup window that would be active? Can there be an argument in StatusInteractivePopUpWindow to control this? I’m not sure with the documentation on the website — mentions Window in the sample code instead of StatusInteractivePopUpWindow.

    While I’m here, is there an option to bind “Escape” key to a close() command?


  • admin

    hello @anya,

    the different types of windows in macOS have different behaviours. this is documented in the macOS Human Interface Guidelines, see Window Anatomy > Types of Windows.

    it’s possible to change some of these default behaviours by accessing the underlying AppKit objects directly. here’s an example showing how you can make the list inside StatusInteractivePopUpWindow become the first responder, and how to use the Escape and Enter keys to cancel/confirm the dialog.

    from mojo.UI import StatusInteractivePopUpWindow
    from vanilla import Button, List, HorizontalLine
    class StatusInteractivePopUpWindowDemo(object):
        def __init__(self):
            self.w = StatusInteractivePopUpWindow((200, 300))
            self.w.myButton = Button((10, 10, -10, 20), "My Button")
            self.w.myList = List((10, 40, -10, -55), ['a', 'b', 'c'])
            self.w.line = HorizontalLine((10, -40, -10, 1))
            self.w.cancelButton = Button((10, -30, 70, 20), "Cancel", callback=self.cancelCallback)
            self.w.okButton = Button((90, -30, 70, 20), "OK", callback=self.okCallback)
            # make `myList` the first responder
            # define the OK button as the default one (Enter key)
            # bind the Cancel button to the Escape key
            self.w.cancelButton.bind(chr(27), [])
        def cancelCallback(self, sender):
        def okCallback(self, sender):
            # get all items in list
            items = self.w.myList.get()
            # get list selection
            selection = self.w.myList.getSelection()
            # get selected list items
            selectedItems = [item for i, item in enumerate(items) if i in selection]

    hope this helps!

    ps. see also @tal’s reply to a similar question here (33m18s)

  • Thank you so much, Gustavo!