Source code for enaml.qt.qt_menu_bar

#------------------------------------------------------------------------------
#  Copyright (c) 2012, Enthought, Inc.
#  All rights reserved.
#------------------------------------------------------------------------------
import sys

from .qt.QtGui import QMainWindow, QMenuBar
from .qt_menu import QtMenu
from .qt_widget import QtWidget


[docs]class QtMenuBar(QtWidget): """ A Qt implementation of an Enaml MenuBar. """ #-------------------------------------------------------------------------- # Setup Methods #--------------------------------------------------------------------------
[docs] def create_widget(self, parent, tree): """ Create the underlying menu bar widget. """ # On OSX, there is a weird issue where creating a QMenuBar with # a parent will cause the menu bar to not show up when its added # to the main window. On that platform we work around the issue # by having the QMainWindow create the menu bar for us, or by # creating it without a parent. This issue is even more weird, # because in the C++ code for QMainWindow::menuBar() the newly # created menu bar is given the QMainWindow as its parent... if sys.platform == 'darwin': if isinstance(parent, QMainWindow): menu_bar = parent.menuBar() else: menu_bar = QMenuBar() else: menu_bar = QMenuBar(parent) return menu_bar
[docs] def init_layout(self): """ Initialize the layout for the underlying control. """ super(QtMenuBar, self).init_layout() widget = self.widget() for child in self.children(): if isinstance(child, QtMenu): widget.addMenu(child.widget()) #-------------------------------------------------------------------------- # Child Events #--------------------------------------------------------------------------
[docs] def child_removed(self, child): """ Handle the child removed event for a QtMenuBar. """ if isinstance(child, QtMenu): self.widget().removeAction(child.widget().menuAction())
[docs] def child_added(self, child): """ Handle the child added event for a QtMenuBar. """ if isinstance(child, QtMenu): before = self.find_next_action(child) self.widget().insertMenu(before, child.widget()) #-------------------------------------------------------------------------- # Utility Methods #--------------------------------------------------------------------------
[docs] def find_next_action(self, child): """ Get the QAction instance which comes immediately after the actions of the given child. Parameters ---------- child : QtMenu The child menu of interest. Returns ------- result : QAction or None The QAction which comes immediately after the actions of the given child, or None if no actions follow the child. """ # The target action must be tested for membership against the # current actions on the menu bar itself, since this method may # be called after a child is added, but before the actions for # the child have actually added to the menu. index = self.index_of(child) if index != -1: actions = set(self.widget().actions()) for child in self.children()[index + 1:]: if isinstance(child, QtMenu): target = child.widget().menuAction() if target in actions: return target