Source code for enaml.qt.qt_action_group

#------------------------------------------------------------------------------
#  Copyright (c) 2012, Enthought, Inc.
#  All rights reserved.
#------------------------------------------------------------------------------
from .qt.QtGui import QActionGroup
from .qt_action import QtAction
from .qt_object import QtObject


class QCustomActionGroup(QActionGroup):
    """ A QActionGroup subclass which fixes some toggling issues.

    When a QActionGroup is set from non-exlusive to exclusive, it
    doesn't uncheck the non-current actions. It also does not keep
    track of the most recently checked widget when in non-exclusive
    mode, so that state is lost. This subclass corrects these issues.

    """
    def __init__(self, *args, **kwargs):
        """ Initialize a QCustomActionGroup.

        Parameters
        ----------
        *args, **kwargs
            The positional and keyword arguments needed to initialize
            a QActionGroup.

        """
        super(QCustomActionGroup, self).__init__(*args, **kwargs)
        self.triggered.connect(self.onTriggered)
        self._last_checked = None

    def onTriggered(self, action):
        """ The signal handler for the 'triggered' signal.

        """
        if action.isCheckable() and action.isChecked():
            if self.isExclusive():
                last = self._last_checked
                if last is not None and last is not action:
                    last.setChecked(False)
            self._last_checked = action

    def setExclusive(self, exclusive):
        """ Set the exclusive state of the action group.

        Parameters
        ----------
        exclusive : bool
            Whether or not the action group is exclusive.

        """
        super(QCustomActionGroup, self).setExclusive(exclusive)
        if exclusive:
            last = self._last_checked
            if last is not None:
                last.setChecked(True)
                for action in self.actions():
                    if action is not last:
                        action.setChecked(False)


[docs]class QtActionGroup(QtObject): """ A Qt implementation of an Enaml ActionGroup. """ #-------------------------------------------------------------------------- # Setup Methods #--------------------------------------------------------------------------
[docs] def create_widget(self, parent, tree): """ Create the underlying action group widget. """ return QCustomActionGroup(parent)
[docs] def create(self, tree): """ Create and initialize the underlying control. """ super(QtActionGroup, self).create(tree) self.set_exclusive(tree['exclusive']) self.set_enabled(tree['enabled']) self.set_visible(tree['visible'])
[docs] def init_layout(self): """ Initialize the layout for the underlying control. """ super(QtActionGroup, self).init_layout() widget = self.widget() for child in self.children(): if isinstance(child, QtAction): widget.addAction(child.widget()) #-------------------------------------------------------------------------- # Child Events #--------------------------------------------------------------------------
[docs] def child_removed(self, child): """ Handle the child removed event for a QtActionGroup. """ if isinstance(child, QtAction): action = child.widget() self.widget().removeAction(action) parent = self.parent() if parent is not None: parent.widget().removeAction(action)
[docs] def child_added(self, child): """ Handle the child added event for a QtActionGroup. """ # The easiest way to handle the insert is to tell the parent to # insert all the current actions. It will work out the proper # ordering automatically. if isinstance(child, QtAction): self.widget().addAction(child.widget()) parent = self.parent() if parent is not None: before = parent.find_next_action(self) parent.widget().insertActions(before, self.actions()) #-------------------------------------------------------------------------- # Utility Methods #--------------------------------------------------------------------------
[docs] def actions(self): """ Get the QAction children for this action group. Returns ------- result : list The list of QAction instances which are children of this action group. Unlike the list returned by the `actions` method of the QActionGroup, the children in this list will have the correct order. """ isinst = isinstance return [c.widget() for c in self.children() if isinst(c, QtAction)] #-------------------------------------------------------------------------- # Message Handling #--------------------------------------------------------------------------
[docs] def on_action_set_exclusive(self, content): """ Handle the 'set_exclusive' action from the Enaml widget. """ self.set_exclusive(content['exclusive'])
[docs] def on_action_set_enabled(self, content): """ Handle the 'set_enabled' action from the Enaml widget. """ self.set_enabled(content['enabled'])
[docs] def on_action_set_visible(self, content): """ Handle the 'set_visible' action from the Enaml widget. """ self.set_visible(content['visible']) #-------------------------------------------------------------------------- # Widget Update Methods #--------------------------------------------------------------------------
[docs] def set_exclusive(self, exclusive): """ Set the exclusive state of the underlying control. """ self.widget().setExclusive(exclusive)
[docs] def set_enabled(self, enabled): """ Set the enabled state of the underlying control. """ self.widget().setEnabled(enabled)
[docs] def set_visible(self, visible): """ Set the visible state of the underlying control. """ self.widget().setVisible(visible)