Source code for enable.trait_defs.ui.editor_with_component

# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!

from traits.api import Instance, observe
from traitsui.api import toolkit_object

from enable.component import Component
from enable.enable_traits import font_trait
from enable.label import Label
from enable.window import Window


#: The toolkit's Editor base class
Editor = toolkit_object("editor:Editor")


[docs]class EditorWithComponent(Editor): """Base class for editors which hold a Component that displays the value. This is distinct from CompononentEditor in that the value is not the Component. """ #: The window that displays the component. window = Instance(Window) #: The component that is created by the UI. component = Instance(Component)
[docs] def init(self, parent): self.component = self.create_component() size = self._get_initial_size() self.window = self.create_window(parent, size) self.control = self.window.control self._parent = parent
[docs] def create_component(self): raise NotImplementedError()
[docs] def create_window(self, parent, size): window = Window( parent, size=size, component=self.component, high_resolution=self.factory.high_resolution, bgcolor='sys_window', ) return window
[docs] def dispose(self): if self.window is not None: self.window.cleanup() self.component = None self.window = None self._parent = None super().dispose()
[docs]class EditorWithLabelComponent(EditorWithComponent): """A class that creates a Label component. By default it displays the string representation of the value. """ #: The font to use for the label. font = font_trait()
[docs] def create_component(self): """Creates the label component.""" component = Label( hjustify="center", vjustify="center", resizable='hv', text=self.str_value, font=self.font, ) return component
[docs] def update_editor(self): if self.component is not None: self.component.text = self.str_value self.component.invalidate_and_redraw()
[docs] @observe('font') def update_font(self, event): if self.component is not None: self.component.font = self.font self.component.invalidate_and_redraw()
def _get_initial_size(self): width = self.item.width height = self.item.height if width < 0: width = 200 if height < 0: height = 50 return width, height
[docs] def set_size_policy(self, direction, resizable, springy, stretch): """Set the size policy of the editor's component. This is only used by the Qt backend. This is always springy and resizable. """ from pyface.qt import QtGui policy = self.window.control.sizePolicy() if direction == QtGui.QBoxLayout.Direction.LeftToRight: policy.setHorizontalStretch(stretch) policy.setHorizontalPolicy(QtGui.QSizePolicy.Policy.Expanding) policy.setVerticalStretch(stretch) policy.setVerticalPolicy(QtGui.QSizePolicy.Policy.Expanding) else: # TopToBottom policy.setVerticalStretch(stretch) policy.setVerticalPolicy(QtGui.QSizePolicy.Policy.Expanding) policy.setHorizontalStretch(stretch) policy.setHorizontalPolicy(QtGui.QSizePolicy.Policy.Expanding) self.window.control.setSizePolicy(policy) if self.window.control is not self.control: super().set_size_policy()