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