1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 """The spin viewer frame."""
25
26
27 import wx
28
29
30 import dep_check
31 from graphics import WIZARD_IMAGE_PATH, fetch_icon
32 from gui.icons import Relax_icons
33 from gui.misc import gui_raise
34 from gui.spin_viewer.splitter import Tree_splitter
35 from gui.string_conv import gui_to_str, str_to_gui
36 from gui.wizards.wiz_objects import Wiz_page, Wiz_window
37 from gui.uf_objects import build_uf_menus, Uf_storage; uf_store = Uf_storage()
38 from lib.errors import RelaxNoPipeError
39 from pipe_control.pipes import cdp_name, pipe_names
40 from status import Status; status = Status()
41
42
43
44 TB_SPIN_LOADER_ID = wx.NewId()
45 TB_REFRESH = wx.NewId()
46
47
48
50 """A window element for the tree view."""
51
53 """Set up the relax prompt."""
54
55
56 self.gui = kwds.pop('parent')
57
58
59 kwds["style"] = wx.DEFAULT_FRAME_STYLE
60 if not status.debug and status.wx_info["os"] != 'darwin':
61 kwds["style"] = kwds["style"] | wx.MAXIMIZE
62 wx.Frame.__init__(self, *args, **kwds)
63
64
65 if not status.debug and status.wx_info["os"] != 'darwin':
66 self.Maximize()
67
68
69 self.SetIcons(Relax_icons())
70
71
72 self.size_x = 1000
73 self.size_y = 750
74
75
76 sizer = self.setup_window()
77
78
79 self._create_menu()
80
81
82 self.toolbar()
83
84
85 splitter = Tree_splitter(self.gui, self, -1)
86 sizer.Add(splitter, 1, wx.EXPAND|wx.ALL, 0)
87
88
89 self.name = 'spin viewer'
90
91
93 """Activate or deactivate certain elements in response to the execution lock."""
94
95
96 enable = False
97 if not status.exec_lock.locked():
98 enable = True
99
100
101 for menu, label in self.menubar.GetMenus():
102
103 for item in menu.GetMenuItems():
104 wx.CallAfter(item.Enable, enable)
105
106
107 wx.CallAfter(self.bar.EnableTool, TB_SPIN_LOADER_ID, enable)
108
109
110 wx.CallAfter(self.pipe_name.Enable, enable)
111
112
114 """Build a menu for the window."""
115
116
117 self.menubar = wx.MenuBar()
118 if status.show_gui:
119 self.SetMenuBar(self.menubar)
120
121
122 self.menu_uf_ids = build_uf_menus(parent=self, menubar=self.menubar)
123
124
147
148
149 - def Show(self, show=True):
170
171
173 """Event handler for the refresh action (thread safe).
174
175 @keyword event: The wx event.
176 @type event: wx event
177 """
178
179
180 wx.CallAfter(self.refresh_safe)
181
182
184 """Refresh the spin viewer window."""
185
186
187 wx.BeginBusyCursor()
188
189
190 self.update_pipes()
191
192
193 self.tree_panel.update()
194
195
196 self.container.display(self.tree_panel.get_info())
197
198
199 if wx.IsBusy():
200 wx.EndBusyCursor()
201
202
204 """Event handler for the close window action.
205
206 @keyword event: The wx event.
207 @type event: wx event
208 """
209
210
211 status.observers.gui_uf.unregister(self.name)
212 status.observers.pipe_alteration.unregister(self.name)
213 status.observers.exec_lock.unregister(self.name)
214
215
216 self.Hide()
217
218
220 """The spin loading wizard.
221
222 @keyword event: The wx event.
223 @type event: wx event
224 """
225
226
227 if not cdp_name():
228 gui_raise(RelaxNoPipeError())
229 return
230
231
232 wx.BeginBusyCursor()
233
234
235 if hasattr(self, 'wizard'):
236 self.wizard.Destroy()
237
238
239 self.wizard = Wiz_window(parent=self, size_x=1000, size_y=750, title="Load spins")
240 self.page_indices = {}
241
242
243 self.page_method = Load_method_page(self.wizard)
244 self.page_indices['method'] = self.wizard.add_page(self.page_method, apply_button=True, skip_button=False)
245 self.wizard.set_seq_next_fn(self.page_indices['method'], self.wizard_page_after_load_method)
246
247
248 page = uf_store['sequence.read'].create_page(self.wizard)
249 self.page_indices['sequence.read'] = self.wizard.add_page(page, skip_button=True)
250 self.wizard.set_seq_next_fn(self.page_indices['sequence.read'], self.wizard_page_after_sequence_read)
251
252
253 page = uf_store['structure.read_pdb'].create_page(self.wizard)
254 self.page_indices['structure.read_pdb'] = self.wizard.add_page(page, skip_button=True)
255 self.wizard.set_seq_next_fn(self.page_indices['structure.read_pdb'], self.wizard_page_after_structure_read)
256
257
258 page = uf_store['structure.read_xyz'].create_page(self.wizard)
259 self.page_indices['structure.read_xyz'] = self.wizard.add_page(page, skip_button=True)
260 self.wizard.set_seq_next_fn(self.page_indices['structure.read_xyz'], self.wizard_page_after_structure_read)
261
262
263 page = uf_store['spectrum.read_spins'].create_page(self.wizard)
264 self.page_indices['spectrum.read_spins'] = self.wizard.add_page(page, skip_button=True)
265 self.wizard.set_seq_next_fn(self.page_indices['spectrum.read_spins'], self.wizard_page_after_sequence_read)
266
267
268 page = uf_store['structure.load_spins'].create_page(self.wizard)
269 self.page_indices['structure.load_spins'] = self.wizard.add_page(page)
270
271
272 page = Finish_page(self.wizard)
273 self.page_indices['fin'] = self.wizard.add_page(page, apply_button=False, skip_button=False)
274
275
276 if wx.IsBusy():
277 wx.EndBusyCursor()
278
279
280 self.wizard.run()
281
282
284 """Set up the window.
285
286 @return: The sizer object.
287 @rtype: wx.Sizer instance
288 """
289
290
291 self.SetTitle("The spin viewer")
292
293
294 sizer = wx.BoxSizer(wx.VERTICAL)
295 self.SetSizer(sizer)
296
297
298 self.Bind(wx.EVT_CLOSE, self.handler_close)
299
300
301 self.SetSize((self.size_x, self.size_y))
302
303
304 return sizer
305
306
346
347
349 """Catch the user function call to properly specify the parent window.
350
351 @keyword event: The wx event.
352 @type event: wx event
353 """
354
355
356 uf_id = event.GetId()
357
358
359 name = uf_store.get_uf(uf_id)
360
361
362 uf_store[name](event=event, wx_parent=self)
363
364
412
413
415 """Set the page after the load method choice.
416
417 @return: The index of the next page.
418 @rtype: int
419 """
420
421
422 if self.page_method.selection == 'sequence':
423 return self.page_indices['sequence.read']
424
425
426 elif self.page_method.selection == 'new pdb':
427 return self.page_indices['structure.read_pdb']
428
429
430 elif self.page_method.selection == 'new xyz':
431 return self.page_indices['structure.read_xyz']
432
433
434 elif self.page_method.selection == 'new spectrum':
435 return self.page_indices['spectrum.read_spins']
436
437
438 elif self.page_method.selection == 'preload':
439 return self.page_indices['structure.load_spins']
440
441
443 """Set the page after the sequence.read user function page.
444
445 @return: The index of the last page.
446 @rtype: int
447 """
448
449
450 return self.page_indices['fin']
451
452
454 """Set the page after the structure.read_* user function pages.
455
456 @return: The index of the structure.load_spins page.
457 @rtype: int
458 """
459
460
461 return self.page_indices['structure.load_spins']
462
463
464
465 -class Finish_page(Wiz_page):
466 """The terminating wizard page."""
467
468
469 image_path = WIZARD_IMAGE_PATH + 'spin.png'
470 main_text = 'The spin systems should now have been loaded into the relax data store.'
471 title = 'Spin loading complete'
472
473 - def add_contents(self, sizer):
474 """This blank method is needed so that the page shows and does nothing.
475
476 @param sizer: A sizer object.
477 @type sizer: wx.Sizer instance
478 """
479
480
481
482 -class Load_method_page(Wiz_page):
483 """The wizard page for specifying how to load spins."""
484
485
486 image_path = WIZARD_IMAGE_PATH + 'spin.png'
487 main_text = 'Select the method for loading spins into relax. Two options are possible: the first is to read sequence information out of a text file via the sequence.read user function; the second is to read in a 3D structure file via the structure.read_pdb user function and then to load the spins from this structure using the structure.load_spins user function.'
488 title = 'Spin loading'
489
490
491 - def add_contents(self, sizer):
492 """Add the specific GUI elements.
493
494 @param sizer: A sizer object.
495 @type sizer: wx.Sizer instance
496 """
497
498
499 msg = "Please specify by which method spins should be loaded into the relax data store:"
500 text = wx.StaticText(self, -1, msg)
501 text.Wrap(self._main_size)
502 sizer.Add(text, 0, wx.LEFT, 0)
503
504
505 sizer.AddStretchSpacer()
506
507
508 sizer2 = wx.BoxSizer(wx.HORIZONTAL)
509 sizer.Add(sizer2, 1, wx.ALL|wx.EXPAND, 0)
510
511
512 sizer.AddStretchSpacer()
513
514
515 sizer2.AddStretchSpacer()
516
517
518 sizer_radio = wx.BoxSizer(wx.VERTICAL)
519 sizer2.Add(sizer_radio, 1, wx.ALL|wx.EXPAND, 0)
520
521
522 self.preload_flag = False
523 if hasattr(cdp, 'structure') and not cdp.structure.empty():
524 self.preload_flag = True
525
526
527 if self.preload_flag:
528
529 self.radio_preload = wx.RadioButton(self, -1, "From a pre-loaded structure.", style=wx.RB_GROUP)
530 sizer_radio.Add(self.radio_preload, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 0)
531
532
533 sizer_radio.AddSpacer(20)
534
535
536 if self.preload_flag:
537 style = 0
538 else:
539 style = wx.RB_GROUP
540 self.radio_seq = wx.RadioButton(self, -1, "From a file containing sequence data.", style=style)
541 sizer_radio.Add(self.radio_seq, 0, wx.LEFT, 0)
542
543
544 sizer_radio.AddSpacer(20)
545
546
547 self.radio_new_pdb = wx.RadioButton(self, -1, "From a new PDB structure file.")
548 sizer_radio.Add(self.radio_new_pdb, 0, wx.LEFT, 0)
549
550
551 sizer_radio.AddSpacer(20)
552
553
554 self.radio_new_xyz = wx.RadioButton(self, -1, "From a new XYZ structure file.")
555 sizer_radio.Add(self.radio_new_xyz, 0, wx.LEFT, 0)
556
557
558 sizer_radio.AddSpacer(20)
559
560
561 self.radio_new_spectrum = wx.RadioButton(self, -1, "From a peak list or spectrum formatted file.")
562 sizer_radio.Add(self.radio_new_spectrum, 0, wx.LEFT, 0)
563
564
565 self.Bind(wx.EVT_RADIOBUTTON, self._on_select, self.radio_seq)
566 self.Bind(wx.EVT_RADIOBUTTON, self._on_select, self.radio_new_pdb)
567 self.Bind(wx.EVT_RADIOBUTTON, self._on_select, self.radio_new_xyz)
568 self.Bind(wx.EVT_RADIOBUTTON, self._on_select, self.radio_new_spectrum)
569 if self.preload_flag:
570 self.Bind(wx.EVT_RADIOBUTTON, self._on_select, self.radio_preload)
571
572
573 sizer2.AddStretchSpacer(3)
574
575
576 sizer.AddStretchSpacer()
577
578
579 if self.preload_flag:
580 self.selection = 'preload'
581 else:
582 self.selection = 'sequence'
583
584
585 - def _on_select(self, event=None):
586 """Handle the radio button switching.
587
588 @keyword event: The wx event.
589 @type event: wx event
590 """
591
592
593 button = event.GetEventObject()
594
595
596 if button == self.radio_seq:
597 self.selection = 'sequence'
598 elif button == self.radio_new_pdb:
599 self.selection = 'new pdb'
600 elif button == self.radio_new_xyz:
601 self.selection = 'new xyz'
602 elif button == self.radio_new_spectrum:
603 self.selection = 'new spectrum'
604 elif self.preload_flag and button == self.radio_preload:
605 self.selection = 'preload'
606