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 """Module containing the classes for GUI components involving relaxation data."""
26
27
28 import wx
29 import wx.lib.buttons
30
31
32 from status import Status; status = Status()
33
34
35 from gui.components.menu import build_menu_item
36 from gui.fonts import font
37 from gui.misc import add_border, float_to_gui, gui_to_str, str_to_gui
38 from gui import paths
39 from gui.user_functions import User_functions; user_functions = User_functions()
40
41
43 """The GUI element for listing loaded relaxation data."""
44
45 - def __init__(self, gui=None, parent=None, box=None, id=None, buttons=True):
46 """Build the relaxation data list GUI element.
47
48 @keyword gui: The main GUI object.
49 @type gui: wx.Frame instance
50 @keyword parent: The parent GUI element that this is to be attached to (the panel object).
51 @type parent: wx object
52 @keyword data: The data storage container.
53 @type data: class instance
54 @keyword box: The vertical box sizer to pack this GUI component into.
55 @type box: wx.BoxSizer instance
56 @keyword id: A unique identification string. This is used to register the update method with the GUI user function observer object.
57 @type id: str
58 @keyword buttons: A flag which if True will display the buttons at the top.
59 @type buttons: bool
60 """
61
62
63 self.gui = gui
64 self.parent = parent
65
66
67 self.spacing = 5
68 self.border = 5
69 self.height_buttons = 40
70
71
72 self.panel = wx.Panel(self.parent)
73 box.Add(self.panel, 0, wx.ALL|wx.EXPAND, 0)
74
75
76 panel_sizer = wx.BoxSizer(wx.VERTICAL)
77 self.panel.SetSizer(panel_sizer)
78
79
80 stat_box = wx.StaticBox(self.panel, -1, "Relaxation data list")
81 stat_box.SetFont(font.subtitle)
82 sub_sizer = wx.StaticBoxSizer(stat_box, wx.VERTICAL)
83
84
85 panel_sizer.Add(sub_sizer, 0, wx.ALL|wx.EXPAND, 0)
86
87
88 box_centre = add_border(sub_sizer, border=self.border)
89
90
91 if buttons:
92 self.add_buttons(box_centre)
93
94
95 box_centre.AddSpacer(self.spacing)
96 self.init_element(box_centre)
97
98
99 self.build_element()
100
101
102 self.name = 'relaxation data list: %s' % id
103
104
105 self.observer_register()
106
107
108 - def Enable(self, enable=True):
109 """Enable or disable the element.
110
111 @keyword enable: The flag specifying if the element should be enabled or disabled.
112 @type enable: bool
113 """
114
115
116 self.button_add.Enable(enable)
117 self.button_delete.Enable(enable)
118
119
157
158
160 """Launch the bruker.read user function.
161
162 @param event: The wx event.
163 @type event: wx event
164 """
165
166
167 user_functions.bruker.read()
168
169
171 """Build the relaxation data listing grid."""
172
173
174 if status.exec_lock.locked():
175 return
176
177
178 wx.CallAfter(self.build_element_safe)
179
180
182 """Build the spectra listing GUI element in a thread safe wx.CallAfter call."""
183
184
185 self.element.Freeze()
186
187
188 self.element.DeleteAllItems()
189
190
191 n = 0
192 if hasattr(cdp, 'ri_ids'):
193
194 n = len(cdp.ri_ids)
195
196
197 for i in range(n):
198
199 id = cdp.ri_ids[i]
200 self.element.InsertStringItem(i, str_to_gui(id))
201
202
203 self.element.SetStringItem(i, 1, str_to_gui(cdp.ri_type[id]))
204
205
206 self.element.SetStringItem(i, 2, float_to_gui(cdp.frq[id]))
207
208
209 self.size_cols()
210
211
212 event = wx.PyCommandEvent(wx.EVT_SIZE.typeId, self.parent.GetId())
213 wx.PostEvent(self.parent.GetEventHandler(), event)
214
215
216 head = self.height_char + 10
217 centre = (self.height_char + 6) * n
218 foot = wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y)
219 height = head + centre + foot
220 self.element.SetMinSize((-1, height))
221 self.element.Layout()
222
223
224 self.element.Thaw()
225
226
232
233
235 """Initialise the GUI element for the relaxation data listing.
236
237 @param sizer: The sizer element to pack the element into.
238 @type sizer: wx.BoxSizer instance
239 """
240
241
242 self.element = wx.ListCtrl(self.panel, -1, style=wx.BORDER_SUNKEN|wx.LC_REPORT)
243
244
245 self.element.InsertColumn(0, str_to_gui("Relaxation data ID"))
246 self.element.InsertColumn(1, str_to_gui("Data type"))
247 self.element.InsertColumn(2, str_to_gui("Frequency (Hz)"))
248
249
250 self.element.SetFont(font.normal)
251
252
253 self.height_char = self.element.GetCharHeight()
254
255
256 self.element.Bind(wx.EVT_SIZE, self.resize)
257 self.element.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.on_right_click)
258 self.element.Bind(wx.EVT_RIGHT_UP, self.on_right_click)
259
260
261 sizer.Add(self.element, 0, wx.ALL|wx.EXPAND, 0)
262
263
265 """Register and unregister methods with the observer objects.
266
267 @keyword remove: If set to True, then the methods will be unregistered.
268 @type remove: False
269 """
270
271
272 if not remove:
273 status.observers.gui_uf.register(self.name, self.build_element)
274
275
276 else:
277 status.observers.gui_uf.unregister(self.name)
278
279
281 """Pop up menu for the right click.
282
283 @param event: The wx event.
284 @type event: wx event
285 """
286
287
288 if status.exec_lock.locked():
289 return
290
291
292 if not hasattr(self, 'popup_id_del'):
293
294 self.popup_id_del = wx.NewId()
295
296
297 self.element.Bind(wx.EVT_MENU, self.relax_data_delete, id=self.popup_id_del)
298
299
300 menu = wx.Menu()
301
302
303 menu.AppendItem(build_menu_item(menu, id=self.popup_id_del, text="&Delete", icon=paths.icon_16x16.remove))
304
305
306 self.element.PopupMenu(menu)
307 menu.Destroy()
308
309
311 """Launch the relax_data.delete user function.
312
313 @param event: The wx event.
314 @type event: wx event
315 """
316
317
318 item = self.element.GetFirstSelected()
319
320
321 if item == -1:
322 id = None
323
324
325 else:
326
327 id = gui_to_str(self.element.GetItemText(item))
328
329
330 user_functions.relax_data.delete(ri_id=id)
331
332
334 """Launch the relax_data.read user function.
335
336 @param event: The wx event.
337 @type event: wx event
338 """
339
340
341 user_functions.relax_data.read()
342
343
345 """Catch the resize to allow the element to be resized.
346
347 @param event: The wx event.
348 @type event: wx event
349 """
350
351
352 self.size_cols()
353
354
355 event.Skip()
356
357
359 """Set the column sizes."""
360
361
362 x, y = self.element.GetSize()
363
364
365 n = self.element.GetColumnCount()
366
367
368 if n == 0:
369 width = x
370 else:
371 width = int(x / n)
372
373
374 for i in range(n):
375 self.element.SetColumnWidth(i, width)
376