Moved Interaction related classes from hooke.command -> hooke.interaction.
[hooke.git] / hooke / interaction.py
1 """The `interaction` module provides :class:`Request`,
2 :class:`Response`, an related classes for handling user interaction
3 through the
4 :class:`hooke.engine.CommandEngine`/:class:`hooke.ui.UserInterface`
5 connection.
6 """
7
8
9 class InList (list):
10     """:class:`Request` validator class.
11
12     Examples
13     --------
14
15     >>> i = InList(['abc', 'def', 5, True])
16     >>> i('abc')
17     >>> i(5)
18     >>> i(False)
19     Traceback (most recent call last):
20       ...
21     ValueError: False
22     """
23     def __init__(self, *args, **kwargs):
24         list.__init__(self, *args, **kwargs)
25
26     def __call__(self, value):
27         """Raises ValueError if a given `value` is not in our internal
28         list.
29         """
30         if value not in self:
31             raise ValueError(value)
32
33 class Interaction (object):
34     """Mid-command inter-process interaction.
35
36     Stores :attr:`type`, a string representing the interaction type
37     ('boolean', 'string', ...).
38     """
39     def __init__(self, type):
40         self.type = type
41
42 class Request (Interaction):
43     """Command engine requests for information from the UI.
44     """
45     def __init__(self, type, response_class,
46                  msg, default=None, validator=None):
47         super(Request, self).__init__(type)
48         self.response_class = response_class
49         self.msg = msg
50         self.default = default
51         self.validator = validator
52
53     def response(self, value):
54         if self.validator != None:
55             self.validator(value)
56         return self.response_class(value)
57
58 class Response (Interaction):
59     """UI response to a :class:`Request`.
60     """
61     def __init__(self, type, value):
62         super(Response, self).__init__(type)
63         self.value = value
64
65 class BooleanRequest (Request):
66     def __init__(self, msg, default=None):
67         super(BooleanRequest, self).__init__(
68             'boolean', BooleanResponse, msg, default,
69             validator = InList([True, False, default]))
70
71 class BooleanResponse (Response):
72     def __init__(self, value):
73         super(BooleanResponse, self).__init__('boolean', value)
74
75 class StringRequest (Request):
76     def __init__(self, msg, default=None):
77         super(StringRequest, self).__init__(
78             'string', StringResponse, msg, default)
79
80 class StringResponse (Response):
81     def __init__(self, value):
82         super(StringResponse, self).__init__('string', value)
83
84 class FloatRequest (Request):
85     def __init__(self, msg, default=None):
86         super(FloatRequest, self).__init__(
87             'float', FloatResponse, msg, default)
88
89 class FloatResponse (Response):
90     def __init__(self, value):
91         super(FloatResponse, self).__init__('float', value)
92
93 class SelectionRequest (Request):
94     def __init__(self, msg, default=None, options=[]):
95         super(SelectionRequest, self).__init__(
96             'selection', SelectionResponse, msg, default)
97         self.options = options
98
99 class SelectionResponse (Response):
100     def __init__(self, value):
101         super(SelectionResponse, self).__init__('selection', value)
102
103 class PointRequest (Request):
104     def __init__(self, msg, curve, block=0, default=None):
105         super(PointRequest, self).__init__(
106             'point', PointResponse, msg, default)
107         self.options = options
108
109 class PointResponse (Response):
110     def __init__(self, value):
111         super(PointResponse, self).__init__('point', value)