Source code for enaml.stdlib.sessions
#------------------------------------------------------------------------------
# Copyright (c) 2012, Enthought, Inc.
# All rights reserved.
#------------------------------------------------------------------------------
""" Enaml Standard Library - Sessions
This module contains some Session subclasses and associated utilities that
handle common Session use cases.
"""
from collections import Iterable
from functools import wraps
from enaml.session import Session
from enaml.session_factory import SessionFactory
[docs]class SimpleSession(Session):
""" A concrete Session class that receives a callable, positional,
and keyword arguments and creates the associated view(s).
"""
[docs] def __init__(self, sess_callable, *args, **kwargs):
""" Initialize the session with the callable and arguments.
"""
super(SimpleSession, self).__init__()
self.sess_callable = sess_callable
self.args = args
self.kwargs = kwargs
[docs] def on_open(self):
""" Create the view from the callable
"""
w = self.sess_callable(*self.args, **self.kwargs)
if isinstance(w, Iterable):
self.windows.extend(w)
else:
self.windows.append(w)
[docs]def simple_session(sess_name, sess_descr, sess_callable, *args, **kwargs):
""" Creates a SessionFactory instance for a callable.
This creates a SessionFactory instance which will create instances
of SimpleSession when prompted by the application.
Parameters
----------
sess_name : str
A unique, human-friendly name for the session.
sess_descr : str
A brief description of the session.
sess_callable : callable
A callable which will return an Enaml view or iterable of views.
*args, **kwargs
Optional positional and keyword arguments to pass to the callable
when the session is created.
"""
fact = SessionFactory(
sess_name, sess_descr, SimpleSession, sess_callable, *args, **kwargs
)
return fact
[docs]def view_factory(sess_name=None, sess_descr=None):
""" A decorator that creates a session factory from a callable.
This can be used in the following ways:
@view_factory
def view(...):
...
return View(...)
@view_factory('my-views', 'This is several views')
def views(...):
...
return [View1(...), View2(...)]
simple = view_factory(Main)
"""
def wrapper(func, _name, _descr):
if _name is None:
_name = func.__name__
if _descr is None:
_descr = func.__doc__ or 'no description'
@wraps(func)
def closure(*args, **kwargs):
return simple_session(_name, _descr, func, *args, **kwargs)
return closure
if sess_name is not None and callable(sess_name):
return wrapper(sess_name, None, sess_descr)
def _wrapper(func):
return wrapper(func, sess_name, sess_descr)
return _wrapper
[docs]def show_simple_view(view, toolkit='qt', description=''):
""" Display a simple view to the screen in the local process.
Parameters
----------
view : Object
The top level Object to use as the view.
toolkit : string, optional
The toolkit backend to use to display the view. Currently
supported values are 'qt' and 'wx'. The default is 'qt'.
Note that not all functionality is available on Wx.
description : string, optional
An optional description to give to the session.
"""
f = lambda: view
if toolkit == 'qt':
from enaml.qt.qt_application import QtApplication
app = QtApplication([simple_session('main', description, f)])
elif toolkit == 'wx':
from enaml.wx.wx_application import WxApplication
app = WxApplication([simple_session('main', description, f)])
else:
raise ValueError('Unknown toolkit `%s`' % toolkit)
app.start_session('main')
app.start()
return app