Skip to content

Commit

Permalink
Merge pull request #383 from enthought/feature/enable_demo_runner
Browse files Browse the repository at this point in the history
Demo runner for enable
  • Loading branch information
midhun-pm authored Jan 8, 2020
2 parents 27a6e99 + b7cf082 commit c7c1571
Show file tree
Hide file tree
Showing 34 changed files with 661 additions and 400 deletions.
91 changes: 24 additions & 67 deletions enable/example_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
demo programs have to use.
"""
from __future__ import absolute_import

from traits.api import HasTraits, Instance
from traits.etsconfig.api import ETSConfig
from traitsui.api import Item, View

from enable.api import Component, ComponentEditor, Window

# FIXME - it should be enough to do the following import, but because of the
# PyQt/traits problem (see below) we can't because it would drag in traits too
Expand All @@ -23,80 +27,27 @@
raise RuntimeError("Can't load wx or qt4 backend for Chaco.")


if ETSConfig.toolkit == 'wx':
import wx
from pyface.util.guisupport import start_event_loop_wx, get_app_wx

class DemoFrame(wx.Frame):
def __init__ ( self, *args, **kw ):
wx.Frame.__init__( *(self,) + args, **kw )
#self.SetTitle("Enable Demo")
self.SetAutoLayout( True )
if ETSConfig.toolkit == 'wx' or ETSConfig.toolkit == 'qt4':

# Create the subclass's window
self.enable_win = self._create_window()
class DemoFrame(HasTraits):

# Listen for the Activate event so we can restore keyboard focus.
wx.EVT_ACTIVATE( self, self._on_activate )
component = Instance(Component)

sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.enable_win.control, 1, wx.EXPAND)
self.SetSizer(sizer)
self.Show( True )
return
traits_view = View(Item('component', editor=ComponentEditor(),
show_label=False),
resizable=True)

def _on_activate(self, event):
if self.enable_win is not None and self.enable_win.control is not None:
self.enable_win.control.SetFocus()
def _component_default(self):
return self._create_component()

def _create_window(self):
"Subclasses should override this method and return an enable.Window"
def _create_component(self):
""" Create and return a component which is typically a
container with nested components """
raise NotImplementedError


def demo_main(demo_class, size=(400,400), title="Enable Demo"):
"Takes the class of the demo to run as an argument."
app = get_app_wx()
frame = demo_class(None, size=size, title=title)
app.SetTopWindow(frame)
start_event_loop_wx(app)
return frame

elif ETSConfig.toolkit == 'qt4':
from pyface.qt import QtGui
from pyface.util.guisupport import start_event_loop_qt4, get_app_qt4

class DemoFrame(QtGui.QWidget):
def __init__ (self, parent, **kw):
QtGui.QWidget.__init__(self)

# Create the subclass's window
self.enable_win = self._create_window()

layout = QtGui.QVBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.enable_win.control)

self.setLayout(layout)

if 'size' in kw:
self.resize(*kw['size'])

if 'title' in kw:
self.setWindowTitle(kw['title'])

self.show()

def _create_window(self):
"Subclasses should override this method and return an enable.Window"
raise NotImplementedError

def demo_main(demo_class, size=(400,400), title="Enable Demo"):
"Takes the class of the demo to run as an argument."
app = get_app_qt4()
frame = demo_class(None, size=size, title=title)
start_event_loop_qt4(app)
return frame
def demo_main(demo_class, size=(640,480), title="Enable Example"):
demo_class().configure_traits()


elif ETSConfig.toolkit == 'pyglet':
Expand All @@ -114,9 +65,15 @@ def __init__(self):
self.enable_win = None
return

def _create_window(self):
def _create_component(self):
""" Create and return a component which is typically a
container with nested components """
raise NotImplementedError

def _create_window(self):
return Window(self, -1, component=self._create_component())


def demo_main(demo_class, size=(640,480), title="Enable Example"):
""" Runs a simple application in Pyglet using an instance of
**demo_class** as the main window or frame.
Expand Down
25 changes: 25 additions & 0 deletions examples/demo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# -------------------------------------------------------------------------
#
# (C) Copyright 2019-2020 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in enthought/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!
#
# Author: David C. Morrill
# Date: 09/15/2005
#
# -------------------------------------------------------------------------

""" Run the Traits UI demo.
"""

from __future__ import absolute_import

from traitsui.extras.demo import demo

demo()
8 changes: 4 additions & 4 deletions examples/enable/basic_draw.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ def _draw_mainlayer(self, gc, view_bounds=None, mode="default"):
gc.fill_path()


class MyFrame(DemoFrame):
class Demo(DemoFrame):

def _create_window(self):
def _create_component(self):
box = Box(bounds=[100.0, 100.0], position=[50.0, 50.0])
container = Container(bounds=[500, 500])
container.add(box)
return Window(self, -1, component=container)
return container


if __name__ == "__main__":
# Save demo so that it doesn't get garbage collected when run within
# existing event loop (i.e. from ipython).
demo = demo_main(MyFrame)
demo = demo_main(Demo)
24 changes: 14 additions & 10 deletions examples/enable/basic_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
"""
from __future__ import print_function

from enable.example_support import DemoFrame, demo_main

from traits.api import Float
from enable.api import Component, Pointer, Window

from enable.api import Component, Pointer, Container
from enable.example_support import DemoFrame, demo_main


class Box(Component):
Expand Down Expand Up @@ -36,7 +36,7 @@ def _draw_mainlayer(self, gc, view_bounds=None, mode="default"):
gc.fill_path()

# draw line around outer box
gc.set_stroke_color((0,0,0,1))
gc.set_stroke_color((0, 0, 0, 1))
gc.rect(self.outer_x, self.outer_y, self.outer_width,
self.outer_height)
gc.stroke_path()
Expand All @@ -56,7 +56,7 @@ def normal_left_down(self, event):
return

def moving_mouse_move(self, event):
self.position = [event.x-self.offset_x, event.y-self.offset_y]
self.position = [event.x - self.offset_x, event.y - self.offset_y]
event.handled = True
self.request_redraw()
return
Expand All @@ -75,14 +75,18 @@ def moving_mouse_leave(self, event):
return


class MyFrame(DemoFrame):
class Demo(DemoFrame):

def _create_component(self):
container = Container()
box = Box(bounds=[100, 100], position=[50, 50], padding=15)
container.add(box)
return container


def _create_window(self):
box = Box(bounds=[100,100], position=[50,50], padding=15)
return Window(self, -1, component=box)


if __name__ == "__main__":
# Save demo so that it doesn't get garbage collected when run within
# existing event loop (i.e. from ipython).
demo = demo_main(MyFrame, title="Click and drag to move the box")
demo = demo_main(Demo)
17 changes: 7 additions & 10 deletions examples/enable/canvas_demo.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,24 @@
from enable.api import Canvas, Viewport, Window
from enable.tools.api import ViewportPanTool
from enable.api import Canvas, Viewport
from enable.example_support import demo_main, DemoFrame
from enable.tools.api import ViewportPanTool


class MyFrame(DemoFrame):

def _create_window(self):
class Demo(DemoFrame):

def create_component(self):
canvas = Canvas(bgcolor="lightsteelblue", draw_axes=True)
from basic_move import Box
box = Box(color="red", bounds=[50, 50], resizable="")
box.position= [75, 75]
box.position = [75, 75]
canvas.add(box)


viewport = Viewport(component=canvas)
viewport.view_position = [0, 0]
viewport.tools.append(ViewportPanTool(viewport))
return viewport

return Window(self, -1, component=viewport)


if __name__ == "__main__":
# Save demo so that it doesn't get garbage collected when run within
# existing event loop (i.e. from ipython).
demo = demo_main(MyFrame, title="Canvas example")
demo = demo_main(Demo, title="Canvas example")
10 changes: 5 additions & 5 deletions examples/enable/compass_example.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
from __future__ import print_function

from enable.api import OverlayContainer, Compass, Window
from enable.api import OverlayContainer, Compass
from enable.example_support import demo_main, DemoFrame


class MyFrame(DemoFrame):
class Demo(DemoFrame):

def _create_window(self):
def _create_component(self):
compass = Compass(scale=2, color="blue", clicked_color="red")

container = OverlayContainer()
container.add(compass)

compass.on_trait_change(self._arrow_printer, "clicked")
self.compass = compass
return Window(self, component=container)
return container

def _arrow_printer(self):
print("Clicked:", self.compass.clicked)
Expand All @@ -23,4 +23,4 @@ def _arrow_printer(self):
if __name__ == "__main__":
# Save demo so that it doesn't get garbage collected when run within
# existing event loop (i.e. from ipython).
demo = demo_main(MyFrame, title="Slider example")
demo = demo_main(Demo, title="Slider example")
18 changes: 8 additions & 10 deletions examples/enable/container_demo.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from chaco.api import PlotComponent, AbstractOverlay, OverlayPlotContainer
from traits.api import Enum, Float, Int, Str, Tuple

from kiva.trait_defs.kiva_font_trait import KivaFont
from enable.api import ColorTrait, Window
from enable.tools.api import DragTool
from enable.api import ColorTrait
from enable.example_support import DemoFrame, demo_main

from chaco.api import PlotComponent, AbstractOverlay, OverlayPlotContainer
from enable.tools.api import DragTool
from kiva.trait_defs.kiva_font_trait import KivaFont


class Region(PlotComponent, DragTool):
Expand Down Expand Up @@ -68,9 +67,9 @@ def overlay(self, component, gc, view_bounds=None, mode="normal"):
gc.show_text(self.text)


class PlotFrame(DemoFrame):
class Demo(DemoFrame):

def _create_window(self):
def _create_component(self):
rect1 = Region("orchid", position=[50, 50])
rect2 = Region("cornflowerblue", position=[200, 50])
rect1.overlays.append(Overlay("One", component=rect1))
Expand All @@ -90,11 +89,10 @@ def _create_window(self):

top_container = OverlayPlotContainer()
top_container.add(container1, container2)

return Window(self, -1, component=top_container)
return top_container


if __name__ == "__main__":
# Save demo so that it doesn't get garbage collected when run within
# existing event loop (i.e. from ipython).
demo = demo_main(PlotFrame, size=(600, 600))
demo = demo_main(Demo, size=(600, 600))
12 changes: 6 additions & 6 deletions examples/enable/filled_container_demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@
as the user drags the circles around.
"""
from numpy import array

from traits.api import Any, Enum, Float, Instance, Tuple

from enable.api import Container, Component, Pointer, str_to_font
from enable.example_support import DemoFrame, demo_main
from enable.api import Container, Component, Pointer, str_to_font, Window


class MyFilledContainer(Container):
Expand Down Expand Up @@ -156,9 +156,9 @@ def _draw_mainlayer(self, gc, view_bounds=None, mode="default"):
return


class MyFrame(DemoFrame):
class Demo(DemoFrame):

def _create_window(self):
def _create_component(self):
circle1 = Circle(bounds=[75, 75], position=[50, 50],
shadow_type="dashed")
circle2 = Circle(bounds=[75, 75], position=[200, 50],
Expand All @@ -168,10 +168,10 @@ def _create_window(self):
container.auto_size = True
container.add(circle1)
container.add(circle2)
return Window(self, -1, component=container)
return container


if __name__ == "__main__":
# Save demo so that it doesn't get garbage collected when run within
# existing event loop (i.e. from ipython).
demo = demo_main(MyFrame, title="Click and drag to move the circles")
demo = demo_main(Demo, title="Click and drag to move the circles")
Loading

0 comments on commit c7c1571

Please sign in to comment.