Changeset 1885


Ignore:
Timestamp:
08/21/10 12:03:00 (14 years ago)
Author:
Kana Sugimoto
Message:

New Development: No

JIRA Issue: Yes (CAS-1801)

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs:

Put in Release Notes: No

Module(s): plotter

Description: bug fixes and a bit reorganization of the code.


Location:
trunk/python
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/casatoolbar.py

    r1884 r1885  
    152152            self.notewin.load_textwindow(event)
    153153        elif event.button == 3 and self._note_picked(event):
    154             self.notewin.show_modmenu(event)
     154            self.notewin.load_modmenu(event)
    155155        return
    156156
     
    228228        self.bNote.config(relief='raised')
    229229        self.mode='spec'
     230        self.notewin.close_widgets()
    230231        self.__disconnect_event()
    231232        #self.canvas.mpl_connect('button_press_event',self._select_spectrum)
     
    240241        self.bNote.config(relief='raised')
    241242        self.mode='stat'
     243        self.notewin.close_widgets()
    242244        self.__disconnect_event()
    243245        self._p.register('button_press',self._single_mask)
  • trunk/python/notationwindow.py

    r1884 r1885  
    77######################################
    88class NotationWindowCommon:
     9    """
     10    A base class to define the functions that the backend-based
     11    GUI notation class must implement to print/modify/delete notes on a canvas.
     12
     13    The following methods *must* be implemented in the backend-based
     14    parent class:
     15        _get_note : get text in text box
     16        _get_anchval : get anchor value selected
     17    """
    918    def __init__(self,master=None):
    1019        #self.parent = master
     
    1221        self.event = None
    1322        self.note = None
    14         self.ancval = None
    1523        self.anchors = ["figure","axes","data"]
    1624        self.seltext = {}
     
    1927    @asaplog_post_dec
    2028    def print_text(self):
    21         anchor = self.anchors[self.ancval.get()]
     29        """
     30        """
     31        anchor = self.anchors[self._get_anchval()]
    2232        notestr = self._get_note().rstrip("\n")
    2333        if len(notestr.strip()) == 0:
    24             self._clear_textbox()
     34            #self._clear_textbox()
    2535            #print "Empty string!"
    2636            return
     
    2838        myaxes = None
    2939        calcpos = True
    30         xpos=None
    31         ypos=None
     40        xpos = None
     41        ypos = None
    3242        if self.seltext:
    3343            # You are modifying a text
     
    4050                # printing text in the same coord.
    4151                # you don't have to recalc position
     52                parent = self.seltext['parent']
     53                transform = self.seltext['textobj'].get_transform()
    4254                (xpos, ypos) = self.seltext['textobj'].get_position()
    43                 transform = self.seltext['textobj'].get_transform()
    44                 parent = self.seltext['parent']
    4555            elif anchor == "figure":
    4656                # converting from "axes"/"data" -> "figure"
     
    7989        # alignment of the text: ha (horizontal), va (vertical)
    8090        ha = 'left'
    81         va = 'center'
     91        #va = 'center'
     92        va = 'top'
    8293        if not calcpos:
    8394            # you aready know parent, tansform, xpos and ypos
     
    110121        self.numnote += 1
    111122
    112         self._clear_textbox()
    113         msg = "A note added to figure: str = '"+notestr+"'"
    114         msg += "   at ["+str(xpos)+", "+str(ypos)+"] in "+anchor+"-coordinate"
    115         msg += "\nTotal number of notes are "+str(self.numnote)
     123        #self._clear_textbox()
     124        msg = "Added note: '"+notestr+"'"
     125        msg += " @["+str(xpos)+", "+str(ypos)+"] ("+anchor+"-coord)"
     126        msg += "\ntotal number of notes are "+str(self.numnote)
    116127        asaplog.push( msg )
    117128
    118129    def _get_axes_from_pos(self,pos,canvas):
     130        """helper function to get axes of a position in a plot (fig-coord)"""
    119131        if len(pos) != 2:
    120132            raise ValueError, "pixel position should have 2 elements"
     
    130142       
    131143    def _convert_pix2dat(self,pos,axes):
     144        """
     145        helper function to convert a position in figure-coord (0-1) to
     146        data-coordinate of the axes       
     147        """
    132148        # convert a relative position from lower-left of the canvas
    133149        # to a data in axes
     
    152168
    153169    @asaplog_post_dec
    154     def _selected_text(self,event):
     170    def _get_selected_text(self,event):
     171        """helper function to return a dictionary of the nearest note to the event."""
    155172        (w,h) = event.canvas.get_width_height()
    156173        dist2 = w*w+h*h
     
    160177                d2 = self._get_text_dist2(event,textobj)
    161178                if dist2 >= d2:
    162                     dist2=d2
    163                     selected={'anchor': 'figure', \
    164                              'parent': event.canvas.figure, 'textobj': textobj}
     179                    dist2 = d2
     180                    selected = {'anchor': 'figure', \
     181                                'parent': event.canvas.figure, 'textobj': textobj}
    165182                    msg = "Fig loop: a text, '"+textobj.get_text()+"', at "
    166183                    msg += str(textobj.get_position())+" detected"
    167                     asaplog.push(msg)
     184                    print msg
    168185        for ax in self.canvas.figure.axes:
    169186            for textobj in ax.texts:
     
    173190                        anchor='axes'
    174191                        if ax.transData == textobj.get_transform():
    175                             anchor='data'                   
    176                         selected={'anchor': anchor, 'parent': ax, 'textobj': textobj}
     192                            anchor = 'data'                   
     193                        selected = {'anchor': anchor, \
     194                                    'parent': ax, 'textobj': textobj}
    177195                        msg = "Ax loop: a text, '"+textobj.get_text()+"', at "
    178196                        msg += str(textobj.get_position())+" detected"
    179                         asaplog.push(msg)
     197                        print msg
     198
     199        if selected:
     200            msg = "Selected (modify/delete): '"+textobj.get_text()
     201            msg += "' @"+str(textobj.get_position())
     202            msg += " ("+selected['anchor']+"-coord)"
     203            asaplog.push(msg)
    180204
    181205        return selected
    182206
    183207    def _get_text_dist2(self,event,textobj):
     208        """
     209        helper function to calculate square of distance between
     210        a event position and a text object.
     211        """
    184212        (x,y) = textobj._get_xy_display()
    185213        return (x-event.x)**2+(y-event.y)**2
    186214
    187215    def delete_note(self):
     216        """
     217        Remove selected note.
     218        """
    188219        #print "You selected 'OK'"
    189220        self._remove_seltext()
     
    192223    @asaplog_post_dec
    193224    def _remove_seltext(self):
     225        """helper function to remove the selected note"""
    194226        if len(self.seltext) < 3:
    195227            raise ValueError, "Don't under stand selected text obj."
     
    202234
    203235        textobj = self.seltext['textobj']
    204         msg = "A note deleted from figure: str = '"+textobj.get_text()+"'"
    205         msg += "   at "+str(textobj.get_position())\
    206                +" in "+self.seltext['anchor']+"-coordinate"
    207         msg += "\nTotal number of notes are "+str(self.numnote)
     236        msg = "Deleted note: '"+textobj.get_text()+"'"
     237        msg += "@"+str(textobj.get_position())\
     238               +" ("+self.seltext['anchor']+"-coord)"
     239        msg += "\ntotal number of notes are "+str(self.numnote)
    208240        asaplog.push( msg )
    209241
    210242        self.seltext = {}
    211243
     244    @asaplog_post_dec
    212245    def cancel_delete(self):
    213         #print "You selected 'CANCEL'"
     246        """
     247        Cancel deleting the selected note.
     248        Fired when 'Cancel' button selected on confirmation dialog
     249        """
     250        asaplog.push( "Cancel deleting: '"+self.seltext['textobj'].get_text()+"'" )
    214251        self.seltext = {}
    215252
     
    224261
    225262class NotationWindowTkAgg(NotationWindowCommon):
     263    """
     264    Backend based
     265    """
    226266    def __init__(self,master=None):
    227267        self.parent = master._tkcanvas
    228268        NotationWindowCommon.__init__(self,master=master)
    229         self.textwin=self._create_textwindow(master=None)
    230         self.menu=self._create_modmenu(master=self.parent)
    231        
     269        self.anchval = None
     270        self.textwin = self._create_textwindow(master=None)
     271        self.menu = self._create_modmenu(master=self.parent)
     272
     273    ### Notation window widget
    232274    def _create_textwindow(self,master=None):
    233275        twin = Tk.Toplevel(padx=3,pady=3)
     
    255297        radio = Tk.LabelFrame(master=parent,text="anchor",
    256298                            labelanchor="nw",padx=5,pady=3)
    257         self.ancval = Tk.IntVar(master=radio,value=0)
     299        self.anchval = Tk.IntVar(master=radio,value=0)
    258300        self.rFig = self._NewRadioButton(radio,"figure",state=Tk.NORMAL,
    259                                          variable=self.ancval,value=0,
     301                                         variable=self.anchval,value=0,
    260302                                         side=Tk.LEFT)
    261303        self.rAxis = self._NewRadioButton(radio,"panel",state=Tk.DISABLED,
    262                                           variable=self.ancval,value=1,
     304                                          variable=self.anchval,value=1,
    263305                                          side=Tk.LEFT)
    264306        self.rData = self._NewRadioButton(radio,"data",state=Tk.DISABLED,
    265                                           variable=self.ancval,value=2,
     307                                          variable=self.anchval,value=2,
    266308                                          side=Tk.LEFT)
    267309        # set initial selection "figure"
    268         self.ancval.set(0)
     310        self.anchval.set(0)
    269311        return radio
    270312
     
    297339            self.rFig.select()
    298340
     341    def _get_anchval(self):
     342        return self.anchval.get()
     343
    299344    def _get_note(self):
    300345        return self.textbox.get("1.0",Tk.END)
     
    323368
    324369    def _cancel_text(self):
    325         self._finish_textwindow()
     370        self.close_textwindow()
    326371
    327372    def _print_text(self):
    328373        self.print_text()
    329         self._finish_textwindow()
     374        self.close_textwindow()
    330375
    331376    def load_textwindow(self,event):
     377        """
     378        Load text window at a event position to add a note on a plot.
     379        Parameter:
     380            event:   an even object to specify the position to load
     381                     text window.
     382        """
     383        self.close_modmenu()
    332384        if event.canvas._tkcanvas != self.parent:
    333385            raise RuntimeError, "Got invalid event!"
     
    336388        is_ax = (event.inaxes != None)
    337389        (xpix, ypix) = self._disppix2screen(event.x, event.y)
    338         offset=5
     390        offset = 5
    339391        self.show_textwindow(xpix+offset,ypix+offset,enableaxes=is_ax)
    340392       
    341393    def show_textwindow(self,xpix,ypix,basetext=None,enableaxes=False):
     394        """
     395        Load text window at a position of screen to add a note on a plot.
     396        Parameters:
     397            xpix, ypix:   a pixel position from Upper-left corner
     398                          of the screen.
     399            basetext:     None (default) or any string.
     400                          A string to be printed on text box when loaded.
     401            enable axes:  False (default) or True.
     402                          If True, 'panel' & 'data' radio button is enabled.
     403        """
    342404        if not self.textwin: return
    343405        self._reset_radio()
     
    352414        self.textwin.geometry("%sx%s+%s+%s"%(w,h,xpix,ypix))
    353415
    354     def _finish_textwindow(self):
     416    def close_textwindow(self):
     417        """Close text window."""
     418        self.seltext = {}
    355419        self._reset_radio()
    356420        self._clear_textbox()
    357421        self.textwin.withdraw()
    358422
     423
     424    ### Modify/Delete menu widget
    359425    def _create_modmenu(self,master=None):
    360426        if master:
    361             self.parent=master
     427            self.parent = master
    362428        if not self.parent:
    363429            return False
    364430        menu = Tk.Menu(master=self.parent,tearoff=False)
    365         menu.add_command(label="Modify",command=self.modify)
    366         menu.add_command(label="Delete",command=self.delnote_dialog)
     431        menu.add_command(label="Modify",command=self._modify_note)
     432        menu.add_command(label="Delete",command=self._delnote_dialog)
    367433        return menu
    368434
    369     def show_modmenu(self,event):
    370         self.seltext = self._selected_text(event)
     435    def load_modmenu(self,event):
     436        """
     437        Load cascade menu at a event position to modify or delete
     438        selected text.
     439        Parameter:
     440            event:  an even object to specify the position to load
     441                    text window.
     442        """
     443        self.close_textwindow()
     444        self.seltext = self._get_selected_text(event)
    371445        if len(self.seltext) == 3:
    372             tkcanvas=event.canvas._tkcanvas
     446            tkcanvas = event.canvas._tkcanvas
    373447            xpos = tkcanvas.winfo_rootx() + int(event.x)
    374448            ypos = tkcanvas.winfo_rooty() \
     
    376450            self.menu.post(xpos,ypos)
    377451
    378     def modify(self):
     452    def close_modmenu(self):
     453        """Close cascade menu."""
     454        self.seltext = {}
     455        self.menu.unpost()
     456
     457    ### load text window for modification
     458    def _modify_note(self):
     459        """helper function to load text window to modify selected note"""
    379460        #print "Modify selected!!"
    380461        textobj = self.seltext['textobj']
     
    393474        self._set_note(textobj.get_text())
    394475
    395     def delnote_dialog(self):
     476    ### close all widgets
     477    def close_widgets(self):
     478        """Close note window and menu"""
     479        self.close_textwindow()
     480        self.close_modmenu()
     481
     482    ### dialog to confirm deleting note
     483    def _delnote_dialog(self):
    396484        remind = "Delete text?\n '"+self.seltext['textobj'].get_text()+"'"
    397485        answer = tkMessageBox.askokcancel(parent=self.parent,title="Delete?",
     
    403491            self.cancel_delete()
    404492
    405 
     493    ### helper functions
    406494    def _disppix2screen(self,xpixd,ypixd):
    407495        # calculate a pixel position form Upper-left of the SCREEN
Note: See TracChangeset for help on using the changeset viewer.