source: branches/casa-prerelease/pre-asap/python/customgui_qt4agg.py @ 2342

Last change on this file since 2342 was 2173, checked in by Kana Sugimoto, 13 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.