tuikit/editfield.py
author Radek Brich <radek.brich@devl.cz>
Sun, 10 Apr 2011 22:54:38 +0200
changeset 5 ae128c885d0f
parent 0 a35731b5e31a
child 8 fcaabd817774
permissions -rw-r--r--
New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     2
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     3
import locale
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     4
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     5
from .widget import Widget
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     6
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     7
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     8
class EditField(Widget):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     9
    def __init__(self, width=10, value=''):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    10
        Widget.__init__(self, width, 1)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    11
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    12
        self.code = locale.getpreferredencoding()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    13
        if not type(value) is str:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    14
            value = str(value, self.code)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    15
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    16
        self.value = value
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    17
        self.maxlen = None   # unlimited
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    18
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    19
        self.tw = 0
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    20
        self.cur = 0   # position of cursor on screen
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    21
        self.pos = 0      # position of cursor in value
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    22
        self.ofs = 0      # position of value beginning on screen
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    23
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    24
        self.connect('resize', self.on_resize)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    25
        self.connect('draw', self.on_draw)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    26
        self.connect('keypress', self.on_keypress)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    27
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    28
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    29
    def on_resize(self):
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    30
        self.tw = self.width - 2  # real width of text field (minus space for arrows)
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    31
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    32
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    33
    def on_draw(self, screen, x, y):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    34
        # draw value
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    35
        val = self.value + ' ' * self.tw         # add spaces to fill rest of field
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    36
        val = val[self.ofs : self.ofs + self.tw]  # cut value - begin from ofs, limit to tw chars
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    37
        screen.puts(x + 1, y, val.encode(self.code))
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    38
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    39
        # draw arrows if content overflows
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    40
        c = ' '
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    41
        if self.ofs > 0:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    42
            c = '<'
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    43
        screen.putch(x, y, c)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    44
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    45
        c = ' '
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    46
        if len(self.value[self.ofs:]) > self.tw:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    47
            c = '>'
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    48
        screen.putch(x + self.width-1, y, c)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    49
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    50
        self.cursor = (1 + self.cur, 0)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    51
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    52
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    53
    def on_keypress(self, keyname, char):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    54
        if keyname:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    55
            if keyname == 'left':
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    56
                self.move_left()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    57
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    58
            if keyname == 'right':
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    59
                self.move_right()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    60
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    61
            if keyname == 'backspace':
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    62
                if self.pos > 0:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    63
                    self.move_left()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    64
                    self.del_char()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    65
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    66
            if keyname == 'delete':
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    67
                self.del_char()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    68
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    69
        if char:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    70
            self.add_char(char)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    71
            self.move_right()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    72
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    73
        self.redraw()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    74
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    75
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    76
    def move_left(self):
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    77
        if self.cur > 1 or (self.cur == 1 and self.pos == 1):
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    78
            # move cursor
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    79
            self.pos -= 1
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    80
            self.cur -= 1
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    81
        else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    82
            # move content in field
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    83
            if self.pos > self.cur:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    84
                self.pos -= 1
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    85
                self.ofs -= 1
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    86
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    87
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    88
    def move_right(self):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    89
        if self.pos < len(self.value):
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    90
            if self.cur < self.tw - 2 \
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    91
            or (self.cur == self.tw - 2 and self.pos == len(self.value)-1):
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    92
                # move cursor
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    93
                self.pos += 1
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    94
                self.cur += 1
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    95
            else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    96
                # move content in field
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    97
                self.pos += 1
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    98
                self.ofs += 1
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    99
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   100
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   101
    def add_char(self, c):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   102
        self.value = self.value[:self.pos] + c + self.value[self.pos:]
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   103
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   104
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   105
    def del_char(self):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   106
        self.value = self.value[:self.pos] + self.value[self.pos+1:]
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   107