File: mapped_view.enaml

package info (click to toggle)
python-enaml 0.19.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,284 kB
  • sloc: python: 31,443; cpp: 4,499; makefile: 140; javascript: 68; lisp: 53; sh: 20
file content (108 lines) | stat: -rw-r--r-- 2,483 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#------------------------------------------------------------------------------
# Copyright (c) 2013-2025, Nucleic Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file LICENSE, distributed with this software.
#------------------------------------------------------------------------------
""" An example of using the Enaml stdlib `MappedView` component.

The `MappedView` is an enamldef subtype of the `Include` type which will
automatically create a view for an object based on it's type and a given
typemap. See the documentation for `MappedView` for a full description.

In this example, a simple class hierarchy is created. For each type in
the hierararchy, a custom view is created. These views are provided as
a typemap to a `MappedView` so that when a given object is selected, the
proper view is displayed.

<< autodoc-me >>
"""
from atom.api import Atom, Str, Int, List, Range, Value, observe

from enaml.layout.api import vbox
from enaml.stdlib.mapped_view import MappedView
from enaml.widgets.api import (
    Window, Form, Field, SpinBox, Label, ObjectCombo, Container
)


class Base(Atom):
    name = Str()


class Foo(Base):
    a = Int()
    b = Int()
    c = Int()


class Bar(Base):
    d = Str()
    e = Str()
    f = Str()
    g = Str()


enamldef BaseView(Form):
    attr model: Base
    Label:
        text = 'Name'
    Label:
        hug_width = 'ignore'
        align = 'center'
        text << model.name


enamldef FooView(BaseView):
    attr model: Foo
    Label:
        text = 'a'
    SpinBox:
        value := model.a
    Label:
        text = 'b'
    SpinBox:
        value := model.b
    Label:
        text = 'c'
    SpinBox:
        value := model.c


enamldef BarView(BaseView):
    attr model: Bar
    Label:
        text = 'd'
    Field:
        text := model.d
    Label:
        text = 'e'
    Field:
        text := model.e
    Label:
        text = 'f'
    Field:
        text := model.f
    Label:
        text = 'g'
    Field:
        text := model.g


class Model(Atom):

    objects = List(Base)


enamldef Main(Window):
    attr main_model = Model(objects=[
        Base(name='Base'), Foo(name='Foo'), Bar(name='Bar')
    ])
    Container:
        ObjectCombo: combo:
            items << main_model.objects
            to_string = lambda obj: obj.name
        MappedView:
            model << combo.selected
            typemap = {Base: BaseView, Foo: FooView, Bar: BarView}