source: trunk/python/customgui_qt4agg.py

Last change on this file was 2603, checked in by Kana Sugimoto, 12 years ago

New Development: No

JIRA Issue: No (bug fixes and a minor improvement)

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs: interactive test needed.

Put in Release Notes: No

Module(s): asapplotter, flagplotter, and sdplot (CASA)

Description:

Fixed bugs in asapplotter and flagplotter which prevented users from exiting
from notation mode, when the other buttons in the additional toolbar is not active.
Consintently use 'self._data' in asapplotter.plotgrid() instead of 'scan'.


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