bc5f18587c366a4dc1c45f2859e51187393d1048
[hooke.git] / hooke / ui / gui / dialog / selection.py
1 # Copyright\r
2 \r
3 """Selection dialog.\r
4 """\r
5 \r
6 from os import remove\r
7 import types\r
8 \r
9 import wx\r
10 \r
11 from ....util.callback import callback, in_callback\r
12 \r
13 \r
14 class Selection (wx.Dialog):\r
15     """A selection dialog box.\r
16 \r
17     Lists options and two buttons.  The first button is setup by the\r
18     caller.  The second button cancels the dialog.\r
19 \r
20     The button appearance can be specified by selecting one of the\r
21     `standard wx IDs`_.\r
22 \r
23     .. _standard wx IDs:\r
24       http://docs.wxwidgets.org/stable/wx_stdevtid.html#stdevtid\r
25     """\r
26     def __init__(self, options, message, button_id, callbacks=None,\r
27                  default=None, selection_style='single', *args, **kwargs):\r
28         super(Selection, self).__init__(*args, **kwargs)\r
29 \r
30         self._options = options\r
31         if callbacks == None:\r
32             callbacks = {}\r
33         self._callbacks = callbacks\r
34         self._selection_style = selection_style\r
35 \r
36         self._c = {\r
37             'text': wx.StaticText(\r
38                 parent=self, label=message, style=wx.ALIGN_CENTRE),\r
39             'button': wx.Button(parent=self, id=button_id),\r
40             'cancel': wx.Button(self, wx.ID_CANCEL),\r
41             }\r
42         size = wx.Size(175, 200)\r
43         if selection_style == 'single':\r
44             self._c['listbox'] = wx.ListBox(\r
45                 parent=self, size=size, choices=options)\r
46             if default != None:\r
47                 self._c['listbox'].SetSelection(default)\r
48         else:\r
49             assert selection_style == 'multiple', selection_style\r
50             self._c['listbox'] = wx.CheckListBox(\r
51                 parent=self, size=size, choices=options)\r
52             if default != None:\r
53                 self._c['listbox'].Check(default)\r
54         self.Bind(wx.EVT_BUTTON, self.button, self._c['button'])\r
55         self.Bind(wx.EVT_BUTTON, self.cancel, self._c['cancel'])\r
56 \r
57         b = wx.BoxSizer(wx.HORIZONTAL)\r
58         self._add(b, 'button')\r
59         self._add(b, 'cancel')\r
60         v = wx.BoxSizer(wx.VERTICAL)\r
61         self._add(v, 'text')\r
62         self._add(v, 'listbox')\r
63         self._add(v, wx.StaticLine(\r
64                 parent=self, size=(20,-1), style=wx.LI_HORIZONTAL),\r
65                   flag=wx.GROW)\r
66         self._add(v, b)\r
67         self.SetSizer(v)\r
68         v.Fit(self)\r
69 \r
70     def _add(self, sizer, item,\r
71             flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL,\r
72             border=5):\r
73         kwargs = {'flag':flag, 'border':border}\r
74         if isinstance(item, types.StringTypes):\r
75             item = self._c[item]\r
76         kwargs['item'] = item # window\r
77         sizer.Add(**kwargs)\r
78 \r
79     @callback\r
80     def cancel(self, event):\r
81         """Close the dialog.\r
82         """\r
83         self.EndModal(wx.ID_CANCEL)\r
84 \r
85     def button(self, event):\r
86         """Call ._button_callback() and close the dialog.\r
87         """\r
88         if self._selection_style == 'single':\r
89             selected = self._c['listbox'].GetSelection()\r
90         else:\r
91             assert self._selection_style == 'multiple', self._selection_style\r
92             selected = self._c['listbox'].GetChecked()\r
93         self.selected = selected\r
94         in_callback(self, options=self._options, selected=selected)\r
95         self.EndModal(wx.ID_CLOSE)\r