tuikit/widgets/textfield.py
changeset 113 6796adfdc7eb
parent 112 ce2e67e7bbb8
parent 104 742e504ec053
child 119 dd91747504dd
equal deleted inserted replaced
112:ce2e67e7bbb8 113:6796adfdc7eb
    16 
    16 
    17         self.value = value
    17         self.value = value
    18         self.maxlen = None   # unlimited
    18         self.maxlen = None   # unlimited
    19 
    19 
    20         self.tw = 0       # real width of text field (minus space for arrows)
    20         self.tw = 0       # real width of text field (minus space for arrows)
    21         self.curspos = len(value)      # position of cursor in value
    21         self.curspos = 0  # position of cursor in value
    22         self.ofs = 0      # position of value beginning on screen
    22         self.ofs = 0      # position of value beginning on screen
    23 
    23 
    24         self._cursor_visible = True
    24         self._cursor_visible = True
       
    25         self.move_end()
    25 
    26 
    26     def resize(self, w, h):
    27     def resize(self, w, h):
    27         self.tw = self.width - 2
    28         self.tw = self.width - 2
       
    29         if self.curspos >= self.tw:
       
    30             self.ofs = self.curspos - self.tw
    28 
    31 
    29     def draw(self, buffer):
    32     def draw(self, buffer):
    30         color = self.theme.active if self.has_focus() else self.theme.normal
    33         color = self.theme.active if self.has_focus() else self.theme.normal
    31         with buffer.attr(color):
    34         with buffer.attr(color):
    32             # draw value
    35             # draw value
    46             buffer.putch(c, self.width-1, 0)
    49             buffer.putch(c, self.width-1, 0)
    47 
    50 
    48             self._cursor.update(1 + self.curspos - self.ofs, 0)
    51             self._cursor.update(1 + self.curspos - self.ofs, 0)
    49 
    52 
    50     def keypress_event(self, ev):
    53     def keypress_event(self, ev):
    51         consumed = True
    54         map_keyname_to_func = {
    52         if ev.keyname == 'left':
    55             'left':       self.move_left,
    53             self.move_left()
    56             'right':      self.move_right,
    54         elif ev.keyname == 'right':
    57             'home':       self.move_home,
    55             self.move_right()
    58             'end':        self.move_end,
    56         elif ev.keyname == 'backspace':
    59             'backspace':  self.move_left_and_del,
    57             if self.curspos > 0:
    60             'delete':     self.del_char,
    58                 self.move_left()
    61         }
    59                 self.del_char()
    62         consumed = False
    60         elif ev.keyname == 'delete':
    63         if ev.keyname in map_keyname_to_func:
    61             self.del_char()
    64             map_keyname_to_func[ev.keyname]()
    62         else:
    65             consumed = True
    63             consumed = False
       
    64 
       
    65         if not ev.keyname and ev.char:
    66         if not ev.keyname and ev.char:
    66             self.add_char(ev.char)
    67             self.add_char(ev.char)
    67             self.move_right()
    68             self.move_right()
    68             consumed = True
    69             consumed = True
    69 
       
    70         if consumed:
    70         if consumed:
    71             #self.redraw()
    71             #self.redraw()
    72             return True
    72             return True
    73         Widget.keypress_event(self, ev)
    73         Widget.keypress_event(self, ev)
    74 
    74 
    82                 self.curspos -= 1
    82                 self.curspos -= 1
    83                 self.ofs -= 1
    83                 self.ofs -= 1
    84 
    84 
    85     def move_right(self):
    85     def move_right(self):
    86         if self.curspos < len(self.value):
    86         if self.curspos < len(self.value):
    87             if self.curspos - self.ofs < self.tw - 2 \
    87             if self.curspos - self.ofs < self.tw - 1 \
    88             or (self.curspos - self.ofs == self.tw - 2 and self.curspos == len(self.value)-1):
    88             or (self.curspos - self.ofs == self.tw - 1 and self.curspos == len(self.value)-1):
    89                 # move cursor
    89                 # move cursor
    90                 self.curspos += 1
    90                 self.curspos += 1
    91             else:
    91             else:
    92                 # move content in field
    92                 # move content in field
    93                 self.curspos += 1
    93                 self.curspos += 1
    94                 self.ofs += 1
    94                 self.ofs += 1
    95 
    95 
       
    96     def move_home(self):
       
    97         self.curspos = 0
       
    98         self.ofs = 0
       
    99 
       
   100     def move_end(self):
       
   101         self.curspos = len(self.value)
       
   102         if self.curspos >= self.tw:
       
   103             self.ofs = self.curspos - self.tw
       
   104 
    96     def add_char(self, c):
   105     def add_char(self, c):
    97         self.value = self.value[:self.curspos] + c + self.value[self.curspos:]
   106         self.value = self.value[:self.curspos] + c + self.value[self.curspos:]
    98 
   107 
    99     def del_char(self):
   108     def del_char(self):
   100         self.value = self.value[:self.curspos] + self.value[self.curspos+1:]
   109         self.value = self.value[:self.curspos] + self.value[self.curspos+1:]
   101 
   110 
       
   111     def move_left_and_del(self):
       
   112         if self.curspos > 0:
       
   113             self.move_left()
       
   114             self.del_char()