source: trunk/python/customgui_qt4agg.py@ 2241

Last change on this file since 2241 was 2173, checked in by Kana Sugimoto, 14 years ago

New Development: Yes

JIRA Issue: No

Ready for Test: Yes

Interface Changes: Yes

What Interface Changed: enabled flagplotter on PyQt4 backend

Test Programs: sdflag with interactive=True

Put in Release Notes: Yes

Module(s): flagplotter, sdflag, asapplotter, sdplot

Description:

enabled flagplotter on PyQt4 backend
renamed methods_newcasabar() in asapplotter and flagplotter class as _new_custombar()


File size: 29.5 KB
Line 
1import os
2import matplotlib, numpy
3from asap.logging import asaplog, asaplog_post_dec
4from matplotlib.patches import Rectangle
5from asap.parameters import rcParams
6from asap._asap import stmath
7from asap.customgui_base import *
8
9import PyQt4 as qt
10
11######################################
12## Add CASA custom toolbar ##
13######################################
14class CustomToolbarQT4Agg(CustomToolbarCommon, qt.QtGui.QToolBar):
15 def __init__(self,parent):
16 from asap.asapplotter import asapplotter
17 if not isinstance(parent,asapplotter):
18 return False
19 if not parent._plotter:
20 return False
21 self._p = parent._plotter
22 self.figmgr = self._p.figmgr
23 self.canvas = self.figmgr.canvas
24 self.mode = ''
25 self.button = True
26 self.pagecount = None
27 CustomToolbarCommon.__init__(self,parent)
28 self.notewin = NotationWindowQT4Agg(master=self.canvas)
29 self._add_custom_toolbar()
30
31 def _add_custom_toolbar(self):
32 qt.QtGui.QToolBar.__init__(self,parent=self.figmgr.window)
33 self.figmgr.window.addToolBar(qt.QtCore.Qt.BottomToolBarArea,self)
34 self.bNote = self._NewButton(master=self,
35 text='notation',
36 command=self.modify_note,
37 balloon="add note on plot")
38 self.bNote.setCheckable(True)
39
40 self.bStat = self._NewButton(master=self,
41 text='statistics',
42 command=self.stat_cal,
43 balloon="calculate statistics")
44 self.bStat.setCheckable(True)
45
46 # page change oparations
47 frPage = qt.QtGui.QWidget(parent=self,flags=qt.QtCore.Qt.Tool)
48 loPage = qt.QtGui.QHBoxLayout(self)
49 loPage.addStretch(1)
50 self.lPagetitle = qt.QtGui.QLabel('Page:',parent=frPage)
51 self.lPagetitle.setMargin(5)
52 loPage.addWidget(self.lPagetitle)
53 self.pagecount = qt.QtGui.QLabel(parent=frPage)
54 self.pagecount.setStyleSheet("background-color: white")
55 self.pagecount.setMargin(3)
56 self.pagecount.setText(' 1')
57 loPage.addWidget(self.pagecount)
58
59 self.bNext = self._NewButton(master=frPage,
60 text=' + ',
61 command=self.next_page,
62 addit=False,
63 balloon="plot next page")
64 loPage.addWidget(self.bNext)
65 self.bPrev = self._NewButton(master=frPage,
66 text=' - ',
67 command=self.prev_page,addit=False,
68 balloon="plot previous page")
69 loPage.addWidget(self.bPrev)
70 frPage.setLayout(loPage)
71 self.addWidget(frPage)
72
73 self.bQuit = self._NewButton(master=self,
74 text='Quit',
75 command=self.quit,
76 balloon="Close window")
77
78 self.pagecount.setText(' '*4)
79
80 self.disable_button()
81 return
82
83 def _NewButton(self, master, text, command, balloon=None,addit=True):
84 b = qt.QtGui.QPushButton(text,parent=master)
85 if balloon: b.setToolTip(balloon)
86 if addit: master.addWidget(b)
87 master.connect(b,qt.QtCore.SIGNAL('clicked()'),command)
88 return b
89
90 def show_pagenum(self,pagenum,formatstr):
91 self.pagecount.setText(formatstr % (pagenum))
92
93 def spec_show(self):
94 if not self.figmgr.toolbar.mode == '' or not self.button: return
95 self.figmgr.toolbar.set_message("spec value: drag on a spec")
96 if self.mode == 'spec': return
97 self.mode = 'spec'
98 self.notewin.close_widgets()
99 self.__disconnect_event()
100 self._p.register('button_press',self._select_spectrum)
101
102 def stat_cal(self):
103 if not self.figmgr.toolbar.mode == '' or not self.button:
104 # Get back button status BEFORE clicked
105 self.bStat.setChecked(not self.bStat.isChecked())
106 return
107 if self.mode == 'stat':
108 # go back to spec mode
109 self.bStat.setChecked(False)
110 self.bStat.setToolTip("calculate statistics")
111 self.spec_show()
112 return
113 self.figmgr.toolbar.set_message("statistics: click at start and end channels")
114 self.bStat.setChecked(True)
115 self.bStat.setToolTip("Back to spec value mode")
116 self.bNote.setChecked(False)
117 self.bNote.setToolTip("add note on plot")
118 self.mode = 'stat'
119 self.notewin.close_widgets()
120 self.__disconnect_event()
121 self._p.register('button_press',self._single_mask)
122
123 def modify_note(self):
124 if not self.figmgr.toolbar.mode == '':
125 # Get back button status BEFORE clicked
126 self.bNote.setChecked(not self.bNote.isChecked())
127 return
128 if self.mode == 'note':
129 self.bNote.setChecked(False)
130 self.bNote.setToolTip("add note on plot")
131 self.mode = 'none'
132 self.spec_show()
133 return
134 self.figmgr.toolbar.set_message("text: select a position/text")
135 self.bStat.setChecked(False)
136 self.bStat.setToolTip("calculate statistics")
137 self.bNote.setChecked(True)
138 self.bNote.setToolTip("Back to spec value mode")
139 self.mode = 'note'
140 self.__disconnect_event()
141 self._p.register('button_press',self._mod_note)
142
143 def quit(self):
144 self.__disconnect_event()
145 self.disable_button()
146 self._p.quit()
147
148 def enable_button(self):
149 if self.button: return
150 self.bStat.setEnabled(True)
151 self.button = True
152 self.spec_show()
153
154 def disable_button(self):
155 if not self.button: return
156 self.bStat.setChecked(False)
157 self.bStat.setDisabled(True)
158 self.button = False
159 self.mode = ''
160 self.__disconnect_event()
161
162 def enable_next(self):
163 self.bNext.setEnabled(True)
164
165 def disable_next(self):
166 self.bNext.setDisabled(True)
167
168 def enable_prev(self):
169 self.bPrev.setEnabled(True)
170
171 def disable_prev(self):
172 self.bPrev.setDisabled(True)
173
174 # pause buttons for slow operations
175 def _pause_buttons(self,operation="end",msg=""):
176 buttons = ["bStat","bNote","bQuit"]
177 if operation == "start":
178 enable = False
179 else:
180 enable = True
181 for btn in buttons:
182 getattr(self,btn).setEnabled(enable)
183 self.figmgr.toolbar.set_message(msg)
184
185 def delete_bar(self):
186 self.__disconnect_event()
187 self.destroy()
188
189 def __disconnect_event(self):
190 self._p.register('button_press',None)
191 self._p.register('button_release',None)
192
193 def _draw_span(self,axes,x0,x1,**kwargs):
194 height = self._p.figure.bbox.height
195 y1 = height - axes.bbox.y1
196 h = axes.bbox.height
197 w = abs(x1 - x0)
198 rect = [ int(val) for val in min(x0,x1), y1, w, h ]
199 self._p.canvas.drawRectangle( rect )
200 # nothing is returned by drawRectangle
201 return None
202
203 def _remove_span(self,span):
204 # Nothing to do with remove. just refresh (call only once)
205 self.canvas.draw()
206
207
208
209######################################
210## Notation box window ##
211######################################
212class NotationWindowQT4Agg(NotationWindowCommon):
213 """
214 Backend based class to create widgets to add, modify, or delete
215 note on the plot.
216
217 Note:
218 Press LEFT-mouse button on the plot to ADD a note on the canvas.
219 A notation window will be loaded for specifying note string and
220 anchor. The note will be anchored on a position in whether figure-
221 (0-1 relative in a figure), panel- (0-1 relative in a plot axes),
222 or data-coordinate (data value in a plot axes).
223 Press RIGHT-mouse button on a note to MODIFY/DELETE it. A cascade
224 menu will be displayed and you can select an operation.
225 """
226 def __init__(self,master=None):
227 self.parent = master
228 NotationWindowCommon.__init__(self,master=master)
229 self.anchval = None
230 self.textwin = self._create_textwindow(master=None)
231 self.menu = self._create_modmenu(master=self.parent)
232
233 ### Notation window widget
234 def _create_textwindow(self,master=None):
235 """Create notation window widget and iconfy it"""
236 #twin = qt.QtGui.QWidget(parent=master, flags=qt.QtCore.Qt.Popup)
237 twin = qt.QtGui.QWidget(parent=master, flags=qt.QtCore.Qt.Dialog)
238 twin.setWindowTitle("Notation")
239 self.textbox = self._NotationBox(parent=twin)
240 radiobox = self._AnchorRadio(parent=twin)
241 self.actionbs = self._ActionButtons(parent=twin)
242 vbox = qt.QtGui.QVBoxLayout(twin)
243 vbox.addWidget(self.textbox)
244 vbox.addWidget(radiobox)
245 vbox.addLayout(self.actionbs)
246 twin.setLayout(vbox)
247 #twin.setCentralWidget(self.textbox)
248 twin.hide()
249 return twin
250
251 def _NotationBox(self,parent=None):
252 textbox = qt.QtGui.QPlainTextEdit(parent=parent)
253 textbox.setStyleSheet("background-color: white")
254 fmetric = qt.QtGui.QFontMetrics(textbox.currentCharFormat().font())
255 textbox.resize(fmetric.width("A")*20+fmetric.leading()*2,
256 fmetric.height()*2+fmetric.ascent()+fmetric.descent())
257 del fmetric
258 textbox.setMinimumSize(textbox.size())
259 textbox.setUndoRedoEnabled(True)
260 textbox.setMidLineWidth(3)
261 textbox.setFrameShadow(qt.QtGui.QFrame.Sunken)
262 textbox.setCursor(qt.QtCore.Qt.IBeamCursor)
263 textbox.setFocus()
264 return textbox
265
266 def _AnchorRadio(self,parent=None):
267 # Returns a QGoupBox object which includes radio butons to
268 # select an anchor
269 anchbox = qt.QtGui.QGroupBox("anchor",parent=parent)
270 self.radio = qt.QtGui.QButtonGroup(parent=anchbox)
271 self.rFig = self._NewRadioButton(anchbox,"figure",\
272 bgr=self.radio,value=0,\
273 balloon="a fixed position in figure")
274 self.rAxis = self._NewRadioButton(anchbox,"panel",\
275 bgr=self.radio,value=1,\
276 balloon="a fixed realtive position in subplot")
277 self.rData = self._NewRadioButton(anchbox,"data",\
278 bgr=self.radio,value=2,\
279 balloon="a fixed data position in subplot")
280 hbox = qt.QtGui.QHBoxLayout(anchbox)
281 hbox.addWidget(self.rFig)
282 hbox.addWidget(self.rAxis)
283 hbox.addWidget(self.rData)
284 anchbox.setLayout(hbox)
285 # set initial selection "figure"
286 self.rFig.setChecked(True)
287 self.radio.setExclusive(True)
288 self.anchval = self.radio.checkedId()
289 return anchbox
290
291 def _NewRadioButton(self,parent,text,balloon=None,bgr=None,value=None):
292 rb= qt.QtGui.QRadioButton(text,parent=parent)
293 if bgr:
294 if value is not None:
295 bgr.addButton(rb,value)
296 else:
297 bgr.addButton(rb)
298 if balloon: rb.setToolTip(balloon)
299 return rb
300
301 def _enable_radio(self):
302 """Enable 'panel' and 'data' radio button"""
303 self.rAxis.setEnabled(True)
304 self.rData.setEnabled(True)
305 # select Figure as the default value
306 self.rFig.setChecked(True)
307 self.anchval = self.radio.checkedId()
308
309 def _reset_radio(self):
310 """Disable 'panel' and 'data' radio button"""
311 self.rAxis.setDisabled(True)
312 self.rData.setDisabled(True)
313 self.rFig.setEnabled(True)
314 # select Figure as the default value
315 self.rFig.setChecked(True)
316 self.anchval = self.radio.checkedId()
317
318 def _select_radio(self,selection):
319 """Select a specified radio button"""
320 if not selection in self.anchors:
321 return
322 if selection == "data":
323 self.rData.setChecked(True)
324 elif selection == "axes":
325 self.rAxis.setChecked(True)
326 else:
327 self.rFig.setChecked(True)
328 self.anchval = self.radio.checkedId()
329
330 def _get_anchval(self):
331 """Returns a integer of a selected radio button"""
332 self.anchval = self.radio.checkedId()
333 return self.anchval
334
335 def _get_note(self):
336 """Returns a note string specified in the text box"""
337 return str(self.textbox.toPlainText())
338
339 def _clear_textbox(self):
340 """Clear the text box"""
341 self.textbox.clear()
342
343 def _set_note(self,note=None):
344 """Set a note string to the text box"""
345 self._clear_textbox()
346 if len(note) >0:
347 self.textbox.setPlainText(note)
348
349 def _ActionButtons(self,parent=None):
350 # Returns a layout object which includes "cancel" and "print" buttons
351 actbuts = qt.QtGui.QHBoxLayout()
352 bCancel = self._NewButton(parent,"cancel",self._cancel_text,\
353 addit=False,\
354 balloon="cancel printing/modifying")
355 bPrint = self._NewButton(parent,"print", self._print_text,\
356 addit=False,\
357 balloon="print text on plot")
358 actbuts.addWidget(bCancel)
359 actbuts.addWidget(bPrint)
360 return actbuts
361
362 def _NewButton(self, parent, text, command, balloon=None, addit=True):
363 b = qt.QtGui.QPushButton(text,parent=parent)
364 if balloon: b.setToolTip(balloon)
365 if addit: parent.addWidget(b)
366 parent.connect(b,qt.QtCore.SIGNAL('clicked()'),command)
367 return b
368
369 def _cancel_text(self):
370 """
371 Cancel adding/modifying a note and close notaion window.
372 called when 'cancel' is selected.
373 """
374 self.close_textwindow()
375
376 def _print_text(self):
377 """
378 Add/Modify a note. Called when 'print' is selected on the
379 notation window.
380 """
381 self.print_text()
382 self.close_textwindow()
383
384 def load_textwindow(self,event):
385 """
386 Load text window at a event position to add a note on a plot.
387 Parameter:
388 event: an even object to specify the position to load
389 text window.
390 """
391 self.close_modmenu()
392 if event.canvas != self.parent:
393 raise RuntimeError, "Got invalid event!"
394
395 self.event = event
396 is_ax = (event.inaxes != None)
397 (xpix, ypix) = self._disppix2screen(event.x, event.y)
398 offset = 5
399 self.show_textwindow(xpix+offset,ypix+offset,enableaxes=is_ax)
400
401 def show_textwindow(self,xpix,ypix,basetext=None,enableaxes=False):
402 """
403 Load text window at a position of screen to add a note on a plot.
404 Parameters:
405 xpix, ypix: a pixel position from Upper-left corner
406 of the screen.
407 basetext: None (default) or any string.
408 A string to be printed on text box when loaded.
409 enableaxes: False (default) or True.
410 If True, 'panel' & 'data' radio button is enabled.
411 """
412 if not self.textwin: return
413 self._reset_radio()
414 if enableaxes:
415 self._enable_radio()
416 self.textwin.activateWindow()
417 h = self.textwin.minimumHeight()
418 w = self.textwin.minimumWidth()
419 self.textwin.resize(w,h)
420 self.textwin.move(xpix,ypix)
421 self.textbox.setFocus()
422 self.textwin.raise_()
423 self.textwin.show()
424 if w*h <= 1: # Initial load
425 self.textwin.setMinimumSize(self.textwin.size())
426
427 def close_textwindow(self):
428 """Close text window."""
429 self.seltext = {}
430 self._reset_radio()
431 self._clear_textbox()
432 self.textwin.hide()
433
434
435 ### Modify/Delete menu widget
436 def _create_modmenu(self,master=None):
437 """Create modify/delete menu widget"""
438 if master:
439 self.parent = master
440 if not self.parent:
441 return False
442 menu = qt.QtGui.QMenu(parent=self.parent)
443 menu.setTearOffEnabled(False)
444 menu.addAction("Modify",self._modify_note)
445 menu.addAction("Delete",self._delnote_dialog)
446 return menu
447
448 def load_modmenu(self,event):
449 """
450 Load cascade menu at a event position to modify or delete
451 selected text.
452 Parameter:
453 event: an even object to specify the position to load
454 text window.
455 """
456 self.close_textwindow()
457 self.seltext = self._get_selected_text(event)
458 if len(self.seltext) == 3:
459 canvas = event.canvas
460 corig = canvas.mapToGlobal(qt.QtCore.QPoint(0,0))
461 xpixs = corig.x() + int(event.x)
462 ypixs = corig.y() + canvas.height() - int(event.y)
463 self.menu.activateWindow()
464 self.menu.move(xpixs,ypixs)
465 self.menu.show()
466
467 def close_modmenu(self):
468 """Close cascade menu."""
469 self.seltext = {}
470 self.menu.hide()
471
472 ### load text window for modification
473 def _modify_note(self):
474 """helper function to load text window to modify selected note"""
475 textobj = self.seltext['textobj']
476 (xtx, ytx) = textobj._get_xy_display()
477 is_ax = (self.seltext['anchor'] != 'figure')
478 if not is_ax:
479 # previous anchor is figure
480 pos = textobj.get_position()
481 is_ax = (self._get_axes_from_pos(pos,self.canvas) != None)
482
483 (xpix, ypix) = self._disppix2screen(xtx,ytx)
484 offset = int(textobj.get_size())*2
485 self.show_textwindow(xpix,ypix+offset,basetext=textobj.get_text(),\
486 enableaxes=is_ax)
487 self._select_radio(self.seltext['anchor'])
488 self._set_note(textobj.get_text())
489
490 ### close all widgets
491 def close_widgets(self):
492 """Close note window and menu"""
493 self.close_textwindow()
494 self.close_modmenu()
495
496 ### dialog to confirm deleting note
497 def _delnote_dialog(self):
498 """Load dialog to confirm deletion of the text"""
499 remind = "Delete text?\n '"+self.seltext['textobj'].get_text()+"'"
500 from PyQt4.QtGui import QMessageBox as mbox
501 answer = mbox.question(self.parent,"Delete?",remind,
502 buttons = mbox.Ok | mbox.Cancel,
503 defaultButton=mbox.Cancel)
504 if answer == mbox.Ok:
505 self.delete_note()
506 else:
507 self.cancel_delete()
508
509 ### helper functions
510 def _disppix2screen(self,xpixd,ypixd):
511 """
512 helper function to calculate a pixel position form Upper-left
513 corner of the SCREEN from a pixel position (xpixd, ypixd)
514 from Lower-left of the CANVAS (which, e.g., event.x/y returns)
515
516 Returns:
517 (x, y): pixel position from Upper-left corner of the SCREEN.
518 """
519 corig = self.parent.mapToGlobal(qt.QtCore.QPoint(0,0))
520 xpixs = corig.x() + xpixd
521 ypixs = corig.y() + self.parent.height() - ypixd
522 return (int(xpixs), int(ypixs))
523
524
525
526
527
528
529###########################################
530## Add CASA custom Flag toolbar ##
531###########################################
532class CustomFlagToolbarQT4Agg(CustomFlagToolbarCommon, qt.QtGui.QToolBar):
533 def __init__(self,parent):
534 from asap.asapplotter import asapplotter
535 if not isinstance(parent,asapplotter):
536 return False
537 if not parent._plotter:
538 return False
539 self._p = parent._plotter
540 self.figmgr = self._p.figmgr
541 self.canvas = self.figmgr.canvas
542 self.mode = ''
543 self.button = True
544 self.pagecount = None
545 CustomFlagToolbarCommon.__init__(self,parent)
546 self.notewin=NotationWindowQT4Agg(master=self.canvas)
547 self._add_custom_toolbar()
548
549 def _add_custom_toolbar(self):
550 qt.QtGui.QToolBar.__init__(self,parent=self.figmgr.window)
551 self.figmgr.window.addToolBar(qt.QtCore.Qt.BottomToolBarArea,self)
552 self.bRegion = self._NewButton(master=self,
553 text='region',
554 command=self.select_region,
555 balloon="select channel regions")
556 self.bRegion.setCheckable(True)
557
558 self.bPanel = self._NewButton(master=self,
559 text='panel',
560 command=self.select_panel,
561 balloon="select a whole spectrum")
562 self.bPanel.setCheckable(True)
563
564 self.bClear = self._NewButton(master=self,
565 text='clear',
566 command=self.cancel_select,
567 balloon="clear selections")
568
569 self.bFlag = self._NewButton(master=self,
570 text='flag',
571 command=self.flag,
572 balloon="flag selections")
573
574 self.bUnflag = self._NewButton(master=self,
575 text='unflag',
576 command=self.unflag,
577 balloon="unflag selections")
578
579 self.bStat = self._NewButton(master=self,
580 text='statistics',
581 command=self.stat_cal,
582 balloon="print statistics of selections")
583
584 self.bNote = self._NewButton(master=self,
585 text='notation',
586 command=self.modify_note,
587 balloon="add note on plot")
588 self.bNote.setCheckable(True)
589
590 # page change oparations
591 frPage = qt.QtGui.QWidget(parent=self,flags=qt.QtCore.Qt.Tool)
592 loPage = qt.QtGui.QHBoxLayout(self)
593 loPage.addStretch(1)
594 self.lPagetitle = qt.QtGui.QLabel('Page:',parent=frPage)
595 self.lPagetitle.setMargin(5)
596 loPage.addWidget(self.lPagetitle)
597 self.pagecount = qt.QtGui.QLabel(parent=frPage)
598 self.pagecount.setStyleSheet("background-color: white")
599 self.pagecount.setMargin(3)
600 self.pagecount.setText(' 1')
601 loPage.addWidget(self.pagecount)
602
603 self.bNext = self._NewButton(master=frPage,
604 text='+',
605 #imagename="hand.ppm",
606 command=self.next_page,
607 addit=False,
608 balloon="plot next page")
609 loPage.addWidget(self.bNext)
610 self.bPrev = self._NewButton(master=frPage,
611 text='-',
612 command=self.prev_page,
613 addit=False,
614 balloon="plot previous page")
615 loPage.addWidget(self.bPrev)
616 frPage.setLayout(loPage)
617 self.addWidget(frPage)
618
619 self.bQuit = self._NewButton(master=self,
620 text='Quit',
621 #imagename="stock_close.ppm",
622 command=self.quit,
623 balloon="Close window")
624
625 self.pagecount.setText(' '*4)
626 self.disable_button()
627 return
628
629 def _NewButton(self, master, text, command, balloon=None,addit=True,imagename=None):
630 img = None
631 if imagename:
632 imagename = os.path.join(matplotlib.rcParams['datapath'], 'images', imagename)
633# img = Tk.PhotoImage(master=master, file=imagename)
634
635 b = qt.QtGui.QPushButton(text,parent=master)
636 if balloon: b.setToolTip(balloon)
637 if addit: master.addWidget(b)
638 master.connect(b,qt.QtCore.SIGNAL('clicked()'),command)
639# if img: b.image = img
640 return b
641
642 def show_pagenum(self,pagenum,formatstr):
643 self.pagecount.setText(formatstr % (pagenum))
644
645 def spec_show(self):
646 if not self.figmgr.toolbar.mode == '' or not self.button: return
647 self.figmgr.toolbar.set_message('spec value: drag on a spec')
648 if self.mode == 'spec': return
649 self.mode = 'spec'
650 self.notewin.close_widgets()
651 self.__disconnect_event()
652 self._p.register('button_press',self._select_spectrum)
653
654 def modify_note(self):
655 if not self.figmgr.toolbar.mode == '':
656 # Get back button status BEFORE clicked
657 self.bNote.setChecked(not self.bNote.isChecked())
658 return
659 if self.mode == 'note':
660 self.bNote.setChecked(False)
661 self.bNote.setToolTip("add note on plot")
662 self.mode = 'none'
663 self.spec_show()
664 return
665 self.figmgr.toolbar.set_message('text: select a position/text')
666 self.bNote.setChecked(True)
667 self.bNote.setToolTip("Back to spec value mode")
668 self.bRegion.setChecked(False)
669 self.bRegion.setToolTip("select channel regions")
670 self.bPanel.setChecked(False)
671 self.bPanel.setToolTip("select a whole spectrum")
672 self.mode = 'note'
673 self.__disconnect_event()
674 self._p.register('button_press',self._mod_note)
675
676 def select_region(self):
677 if not self.figmgr.toolbar.mode == '' or not self.button:
678 # Get back button status BEFORE clicked
679 self.bRegion.setChecked(not self.bRegion.isChecked())
680 if self.mode == 'region':
681 self.bRegion.setChecked(False)
682 self.bRegion.setToolTip("select channel regions")
683 self.mode = 'none'
684 self.spec_show()
685 return
686 self.figmgr.toolbar.set_message('select regions: click at start and end channels')
687 self.bNote.setChecked(False)
688 self.bNote.setToolTip("add note on plot")
689 self.bRegion.setChecked(True)
690 self.bRegion.setToolTip("Back to spec value mode")
691 self.bPanel.setChecked(False)
692 self.bPanel.setToolTip("select a whole spectrum")
693 self.mode = 'region'
694 self.notewin.close_widgets()
695 self.__disconnect_event()
696 self._p.register('button_press',self._add_region)
697
698 def select_panel(self):
699 if not self.figmgr.toolbar.mode == '' or not self.button:
700 # Get back button status BEFORE clicked
701 self.bPanel.setChecked(not self.bPanel.isChecked())
702 return
703 if self.mode == 'panel':
704 self.bPanel.setChecked(False)
705 self.bPanel.setToolTip("select subplots")
706 self.mode = 'none'
707 self.spec_show()
708 return
709 self.figmgr.toolbar.set_message('select spectra: click on subplots')
710 self.bNote.setChecked(False)
711 self.bNote.setToolTip("add note on plot")
712 self.bRegion.setChecked(False)
713 self.bRegion.setToolTip("select channel regions")
714 self.bPanel.setChecked(True)
715 self.bPanel.setToolTip("Back to spec value mode")
716 self.mode = 'panel'
717 self.notewin.close_widgets()
718 self.__disconnect_event()
719 self._p.register('button_press',self._add_panel)
720
721 def quit(self):
722 self.__disconnect_event()
723 self.disable_button()
724 self._p.unmap()
725
726 def enable_button(self):
727 if self.button: return
728 self.bRegion.setEnabled(True)
729 self.bPanel.setEnabled(True)
730 self.bClear.setEnabled(True)
731 self.bFlag.setEnabled(True)
732 self.bUnflag.setEnabled(True)
733 self.bStat.setEnabled(True)
734 self.button = True
735 self.spec_show()
736
737 def disable_button(self):
738 ## disable buttons which don't work for plottp
739 if not self.button: return
740 self.bRegion.setChecked(False)
741 self.bRegion.setToolTip("select channel regions")
742 self.bPanel.setChecked(False)
743 self.bPanel.setToolTip("select subplots")
744
745 self.bRegion.setDisabled(True)
746 self.bPanel.setDisabled(True)
747 self.bClear.setDisabled(True)
748 self.bFlag.setDisabled(True)
749 self.bUnflag.setDisabled(True)
750 self.bStat.setDisabled(True)
751 self.bNext.setDisabled(True)
752 self.bPrev.setDisabled(True)
753 self.button = False
754 self.mode = ''
755 self.notewin.close_widgets()
756 self.__disconnect_event()
757
758 def enable_next(self):
759 self.bNext.setEnabled(True)
760
761 def disable_next(self):
762 self.bNext.setDisabled(True)
763
764 def enable_prev(self):
765 self.bPrev.setEnabled(True)
766
767 def disable_prev(self):
768 self.bPrev.setDisabled(True)
769
770 # pause buttons for slow operations
771 def _pause_buttons(self,operation="end",msg=""):
772 buttons = ["bRegion","bPanel","bClear","bFlag","bUnflag","bStat",
773 "bNote","bQuit"]
774 if operation == "start":
775 enable = False
776 else:
777 enable = True
778 for btn in buttons:
779 getattr(self,btn).setEnabled(enable)
780 self.figmgr.toolbar.set_message(msg)
781
782 def delete_bar(self):
783 self.__disconnect_event()
784 self.destroy()
785
786 def __disconnect_event(self):
787 self._p.register('button_press',None)
788 self._p.register('button_release',None)
789
790 def _draw_span(self,axes,x0,x1,**kwargs):
791 height = self._p.figure.bbox.height
792 y1 = height - axes.bbox.y1
793 h = axes.bbox.height
794 w = abs(x1 - x0)
795 rect = [ int(val) for val in min(x0,x1), y1, w, h ]
796 self._p.canvas.drawRectangle( rect )
797 # nothing is returned by drawRectangle
798 return None
799
800 def _remove_span(self,span):
801 # Nothing to do with remove.
802 pass
Note: See TracBrowser for help on using the repository browser.