@@ -190,8 +190,6 @@ def __init__(self, ax, label, image=None,
190190 self .color = color
191191 self .hovercolor = hovercolor
192192
193- self ._lastcolor = color
194-
195193 def _click (self , event ):
196194 if (self .ignore (event )
197195 or event .inaxes != self .ax
@@ -706,76 +704,58 @@ def __init__(self, ax, label, initial='',
706704
707705 self .DIST_FROM_LEFT = .05
708706
709- self .text = initial
710- self . label = ax . text ( - label_pad , 0.5 , label ,
711- verticalalignment = 'center' ,
712- horizontalalignment = 'right' ,
713- transform = ax .transAxes )
714- self . text_disp = self . _make_text_disp ( self . text )
707+ self .label = ax . text (
708+ - label_pad , 0.5 , label , transform = ax . transAxes ,
709+ verticalalignment = 'center' , horizontalalignment = 'right' )
710+ self . text_disp = self . ax . text (
711+ self . DIST_FROM_LEFT , 0.5 , initial , transform = self . ax .transAxes ,
712+ verticalalignment = 'center' , horizontalalignment = 'left' )
715713
716714 self .cnt = 0
717715 self .change_observers = {}
718716 self .submit_observers = {}
719717
720- # If these lines are removed, the cursor won't appear the first
721- # time the box is clicked:
722- self . ax . set_xlim ( 0 , 1 )
723- self . ax . set_ylim ( 0 , 1 )
718+ ax . set (
719+ xlim = ( 0 , 1 ), ylim = ( 0 , 1 ), # s.t. cursor appears from first click.
720+ navigate = False , facecolor = color ,
721+ xticks = [], yticks = [] )
724722
725723 self .cursor_index = 0
726724
727- # Because this is initialized, _render_cursor
728- # can assume that cursor exists.
729- self .cursor = self .ax .vlines (0 , 0 , 0 )
730- self .cursor .set_visible (False )
725+ self .cursor = ax .vlines (0 , 0 , 0 , visible = False ,
726+ transform = mpl .transforms .IdentityTransform ())
731727
732728 self .connect_event ('button_press_event' , self ._click )
733729 self .connect_event ('button_release_event' , self ._release )
734730 self .connect_event ('motion_notify_event' , self ._motion )
735731 self .connect_event ('key_press_event' , self ._keypress )
736732 self .connect_event ('resize_event' , self ._resize )
737- ax .set_navigate (False )
738- ax .set_facecolor (color )
739- ax .set_xticks ([])
740- ax .set_yticks ([])
733+
741734 self .color = color
742735 self .hovercolor = hovercolor
743736
744- self ._lastcolor = color
745-
746737 self .capturekeystrokes = False
747738
748- def _make_text_disp (self , string ):
749- return self .ax .text (self .DIST_FROM_LEFT , 0.5 , string ,
750- verticalalignment = 'center' ,
751- horizontalalignment = 'left' ,
752- transform = self .ax .transAxes )
739+ @property
740+ def text (self ):
741+ return self .text_disp .get_text ()
753742
754743 def _rendercursor (self ):
755744 # this is a hack to figure out where the cursor should go.
756745 # we draw the text up to where the cursor should go, measure
757746 # and save its dimensions, draw the real text, then put the cursor
758747 # at the saved dimensions
759748
760- widthtext = self .text [:self .cursor_index ]
761- no_text = False
762- if widthtext in ["" , " " , " " ]:
763- no_text = widthtext == ""
764- widthtext = ","
765-
766- wt_disp = self ._make_text_disp (widthtext )
767-
768- self .ax .figure .canvas .draw ()
769- bb = wt_disp .get_window_extent ()
770- inv = self .ax .transData .inverted ()
771- bb = inv .transform (bb )
772- wt_disp .set_visible (False )
773- if no_text :
774- bb [1 , 0 ] = bb [0 , 0 ]
775- # hack done
776- self .cursor .set_visible (False )
749+ text = self .text_disp .get_text () # Save value before overwriting it.
750+ widthtext = text [:self .cursor_index ]
751+ self .text_disp .set_text (widthtext or "," )
752+ bb = self .text_disp .get_window_extent ()
753+ if not widthtext : # Use the comma for the height, but keep width to 0.
754+ bb .x1 = bb .x0
755+ self .cursor .set (
756+ segments = [[(bb .x1 , bb .y0 ), (bb .x1 , bb .y1 )]], visible = True )
757+ self .text_disp .set_text (text )
777758
778- self .cursor = self .ax .vlines (bb [1 , 0 ], bb [0 , 1 ], bb [1 , 1 ])
779759 self .ax .figure .canvas .draw ()
780760
781761 def _notify_submit_observers (self ):
@@ -795,33 +775,31 @@ def _keypress(self, event):
795775 return
796776 if self .capturekeystrokes :
797777 key = event .key
798-
778+ text = self . text
799779 if len (key ) == 1 :
800- self . text = (self . text [:self .cursor_index ] + key +
801- self . text [self .cursor_index :])
780+ text = (text [:self .cursor_index ] + key +
781+ text [self .cursor_index :])
802782 self .cursor_index += 1
803783 elif key == "right" :
804- if self .cursor_index != len (self . text ):
784+ if self .cursor_index != len (text ):
805785 self .cursor_index += 1
806786 elif key == "left" :
807787 if self .cursor_index != 0 :
808788 self .cursor_index -= 1
809789 elif key == "home" :
810790 self .cursor_index = 0
811791 elif key == "end" :
812- self .cursor_index = len (self . text )
792+ self .cursor_index = len (text )
813793 elif key == "backspace" :
814794 if self .cursor_index != 0 :
815- self . text = (self . text [:self .cursor_index - 1 ] +
816- self . text [self .cursor_index :])
795+ text = (text [:self .cursor_index - 1 ] +
796+ text [self .cursor_index :])
817797 self .cursor_index -= 1
818798 elif key == "delete" :
819799 if self .cursor_index != len (self .text ):
820- self .text = (self .text [:self .cursor_index ] +
821- self .text [self .cursor_index + 1 :])
822-
823- self .text_disp .remove ()
824- self .text_disp = self ._make_text_disp (self .text )
800+ text = (text [:self .cursor_index ] +
801+ text [self .cursor_index + 1 :])
802+ self .text_disp .set_text (text )
825803 self ._rendercursor ()
826804 self ._notify_change_observers ()
827805 if key == "enter" :
@@ -831,9 +809,7 @@ def set_val(self, val):
831809 newval = str (val )
832810 if self .text == newval :
833811 return
834- self .text = newval
835- self .text_disp .remove ()
836- self .text_disp = self ._make_text_disp (self .text )
812+ self .text_disp .set_text (newval )
837813 self ._rendercursor ()
838814 self ._notify_change_observers ()
839815 self ._notify_submit_observers ()
@@ -885,23 +861,8 @@ def position_cursor(self, x):
885861 self .cursor_index = 0
886862 else :
887863 bb = self .text_disp .get_window_extent ()
888-
889- trans = self .ax .transData
890- inv = self .ax .transData .inverted ()
891- bb = trans .transform (inv .transform (bb ))
892-
893- text_start = bb [0 , 0 ]
894- text_end = bb [1 , 0 ]
895-
896- ratio = (x - text_start ) / (text_end - text_start )
897-
898- if ratio < 0 :
899- ratio = 0
900- if ratio > 1 :
901- ratio = 1
902-
864+ ratio = np .clip ((x - bb .x0 ) / bb .width , 0 , 1 )
903865 self .cursor_index = int (len (self .text ) * ratio )
904-
905866 self ._rendercursor ()
906867
907868 def _click (self , event ):
@@ -924,13 +885,9 @@ def _resize(self, event):
924885 def _motion (self , event ):
925886 if self .ignore (event ):
926887 return
927- if event .inaxes == self .ax :
928- c = self .hovercolor
929- else :
930- c = self .color
931- if c != self ._lastcolor :
888+ c = self .hovercolor if event .inaxes == self .ax else self .color
889+ if c != self .ax .get_facecolor ():
932890 self .ax .set_facecolor (c )
933- self ._lastcolor = c
934891 if self .drawon :
935892 self .ax .figure .canvas .draw ()
936893
0 commit comments