Source code for enaml.qt.qt_widget

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

from enaml.colors import parse_color

from .qt.QtGui import QWidget, QWidgetItem, QColor, QApplication
from .qt.QtCore import Qt, QSize
from .qt_object import QtObject


def q_parse_color(color):
    """ Convert a color string into a QColor.

    Parameters
    ----------
    color : string
        A CSS3 color string to convert to a QColor.

    Returns
    -------
    result : QColor
        The QColor for the given color string

    """
    rgba = parse_color(color)
    if rgba is None:
        qcolor = QColor()
    else:
        r, g, b, a = rgba
        qcolor = QColor.fromRgbF(r, g, b, a)
    return qcolor


[docs]class QtWidget(QtObject): """ A Qt4 implementation of an Enaml Widget. """ #: An attribute which will hold the default focus rect state if #: it is ever changed by the user. _default_focus_attr = None #: An attribute which will hold the widget item for the widget. _widget_item = None #: An attribute which indicates whether or not the background #: color of the widget has been changed. _bgcolor_changed = False #: An attribute which indicates whether or not the foreground #: color of the widget has been changed. _fgcolor_changed = False
[docs] def create_widget(self, parent, tree): """ Creates the underlying QWidget object. """ return QWidget(parent)
[docs] def create(self, tree): """ Create and initialize the underlying widget. """ super(QtWidget, self).create(tree) self.set_minimum_size(tree['minimum_size']) self.set_maximum_size(tree['maximum_size']) self.set_bgcolor(tree['bgcolor']) self.set_fgcolor(tree['fgcolor']) self.set_font(tree['font']) self.set_enabled(tree['enabled']) self.set_visible(tree['visible']) self.set_show_focus_rect(tree['show_focus_rect']) #-------------------------------------------------------------------------- # Public Api #--------------------------------------------------------------------------
[docs] def widget_item(self): """ Get the QWidgetItem for the underlying widget. Returns ------- result : QWidgetItem The QWidgetItem to use for the underlying widget. """ res = self._widget_item if res is None: res = self._widget_item = QWidgetItem(self.widget()) return res #-------------------------------------------------------------------------- # Message Handlers #--------------------------------------------------------------------------
[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'])
[docs] def on_action_set_bgcolor(self, content): """ Handle the 'set_bgcolor' action from the Enaml widget. """ self.set_bgcolor(content['bgcolor'])
[docs] def on_action_set_fgcolor(self, content): """ Handle the 'set_fgcolor' action from the Enaml widget. """ self.set_fgcolor(content['fgcolor'])
[docs] def on_action_set_font(self, content): """ Handle the 'set_font' action from the Enaml widget. """ self.set_font(content['font'])
[docs] def on_action_set_minimum_size(self, content): """ Handle the 'set_minimum_size' action from the Enaml widget. """ self.set_minimum_size(content['minimum_size'])
[docs] def on_action_set_maximum_size(self, content): """ Handle the 'set_maximum_size' action from the Enaml widget. """ self.set_maximum_size(content['maximum_size'])
[docs] def on_action_set_show_focus_rect(self, content): """ Handle the 'set_show_focus_rect' action from the Enaml widget. """ self.set_show_focus_rect(content['show_focus_rect']) #-------------------------------------------------------------------------- # Widget Update Methods #--------------------------------------------------------------------------
[docs] def set_minimum_size(self, min_size): """ Sets the minimum size on the underlying widget. Parameters ---------- min_size : (int, int) The minimum size allowable for the widget. A value of (-1, -1) indicates the default min size. """ # QWidget uses (0, 0) as the minimum size. if -1 in min_size: min_size = (0, 0) self.widget().setMinimumSize(QSize(*min_size))
[docs] def set_maximum_size(self, max_size): """ Sets the maximum size on the underlying widget. Parameters ---------- max_size : (int, int) The minimum size allowable for the widget. A value of (-1, -1) indicates the default max size. """ # QWidget uses 16777215 as the max size if -1 in max_size: max_size = (16777215, 16777215) self.widget().setMaximumSize(QSize(*max_size))
[docs] def set_enabled(self, enabled): """ Set the enabled state on the underlying widget. Parameters ---------- enabled : bool Whether or not the widget is enabled. """ self.widget().setEnabled(enabled)
[docs] def set_visible(self, visible): """ Set the visibility state on the underlying widget. Parameters ---------- visible : bool Whether or not the widget is visible. """ self.widget().setVisible(visible)
[docs] def set_bgcolor(self, bgcolor): """ Set the background color on the underlying widget. Parameters ---------- bgcolor : str The background color of the widget as a CSS color string. """ if bgcolor or self._bgcolor_changed: widget = self.widget() role = widget.backgroundRole() qcolor = q_parse_color(bgcolor) if not qcolor.isValid(): app_palette = QApplication.instance().palette(widget) qcolor = app_palette.color(role) widget.setAutoFillBackground(False) else: widget.setAutoFillBackground(True) palette = widget.palette() palette.setColor(role, qcolor) widget.setPalette(palette) self._bgcolor_changed = True
[docs] def set_fgcolor(self, fgcolor): """ Set the foreground color on the underlying widget. Parameters ---------- fgcolor : str The foreground color of the widget as a CSS color string. """ if fgcolor or self._fgcolor_changed: widget = self.widget() role = widget.foregroundRole() qcolor = q_parse_color(fgcolor) if not qcolor.isValid(): app_palette = QApplication.instance().palette(widget) qcolor = app_palette.color(role) palette = widget.palette() palette.setColor(role, qcolor) widget.setPalette(palette) self._fgcolor_changed = True
[docs] def set_font(self, font): """ Set the font on the underlying widget. Parameters ---------- font : str The font for the widget as a CSS font string. """ pass
[docs] def set_show_focus_rect(self, show): """ Sets whether or not to show the focus rectangle around the widget. This is currently only supported on OSX. """ if sys.platform == 'darwin': widget = self.widget() attr = Qt.WA_MacShowFocusRect if show is None: if self._default_focus_attr is not None: widget.setAttribute(attr, self._default_focus_attr) else: if self._default_focus_attr is None: self._default_focus_attr = widget.testAttribute(attr) widget.setAttribute(attr, show)