Add Christoph Hetz's all new, all singing, and all dancing input fields

This commit is contained in:
eknauel 2005-11-11 08:01:07 +00:00
parent 54e9e1cee4
commit 445317ca90
3 changed files with 1849 additions and 0 deletions

171
doc/input-fiels-de.txt Normal file
View File

@ -0,0 +1,171 @@
Input-fields
============
1. Erstellen und installieren
-----------------------------
(make-input-field x-dim y-dim) -> <input-field>
erstellt ein Input-field mit x-dim Spalten und y-dim Zeilen.
Make-input-field können weitere optinale Parameter übergeben
werden:
(make-input-field x-dim y-dim
[default-text
[behavior
[insert-active
[x-scroll-enabled
[y-scroll-enabled]]]]])
default-text: ist ein String, der am Anfang und nach einem Reset (s.u.)
der Inhalt des Input-fields ist.
(Default: "")
behavior: ist eine Liste von Paaren. Der car eines solchen Paares
ist die Nummer eines Zeichens oder einer Tastenkombination,
wie sie von wgetch (aus ncurses) zurückgegeben werden.
Der cdr des Paares ist ein Symbol, das eine Nachricht an ein
Input-field darstellt, so würde ein Input-field, das mit dem
Behvior
(list (cons 27
'clear))
erzeugt worden ist beim drücken der ESC-Taste seinen Inhalt
löschen.Es stehen zwei Standardlisten zu Verfügung:
standard-behavior und standard-behavior-pro (s.u.).
(Default: standard-behavior)
insert-active: ist ein Boolean und gibt an ob das sich das Input-field am
Anfang im Insert- oder im Overwrite-Modus befindet.
(Default: #t)
x-scroll-enabled: ist ein Boolean und gibt an ob horizontales Scrollen
erlaubt ist.
(Default #f)
y-scroll-enabled: ist ein Boolean und gibt an, ob vertikales Scrollen erlaubt ist.
(Default #f)
(install-input-field input-field
window
x-loc y-loc)
Ordnet das Input-field input-field dem (ncurses-)Fenter window zu und
platziert es mit der linken oberen Ecke in der Spalte x-loc und der
Zeile y-loc.
Will man das Input-field später nicht direkt verwenden, sondern nur
über cursor-over-input-field? (s.u.) so kann man es auch mittels
make&install-input-field auf einmal erzeugen und installieren:
(make&install-input-field window
x-loc y-loc
x-dim y-dim
[...])
2. Typpredikat und Feldselektoren
----------------------------------
Input-fields exportirt außerdem ein Typpredikat:
input-field?
und die folgenden Selektoren
input-field-default-text: default-text
input-field-text: der aktuelle Inhalt des Input-fields
als String
input-field-x-location: x-loc
input-field-y-location: y-loc
input-field-x-size: x-dim
input-field-y-size: y-dim
input-field-x-scroll: x-scroll-enabled
input-field-y-scroll: y-scroll-enabled
input-field-line: die Zeile, in der der Cursor steht
input-field-column: die Spalte, in der der Cursor steht
input-field-insert: insert-active
3. Bahaviors
----------------------
standard-behavior führt die folgenden Bindungen ein:
Pfeil-Hoch : Cursor um eine Zeile nach oben bewegen.
Pfeil-Runter: Cursor um eine Zeile nach unten bewegen.
Pfeil-links: Cursor nach links bewegen.
Pfeil-Rechts: Cursor nach rechts bewegen.
Home: An den Anfang der Zeile springen.
End: Ans Ende der Zeile springen.
Backspace: Zeichen vor dem Cursor löschen.
Delete: Zeichen unter dem Cursor löschen
standard-behavior-pro erweitert standard-behavior um die
folgenden Bindungen:
C-p: Cursor um eine Zeile nach oben bewegen.
C-n: Cursor um eine Zeile nach unten bewegen.
C-b: Cursor nach links bewegen.
C-f: Cursor nach rechts bewegen.
C-a: An den Anfang der Zeile springen.
C-e: Ans Ende der Zeile springen.
C-d: Zeichen unter dem Cursor löschen.
C-k: alles rechts vom Cursor löschen.
die folgenden (hoffentlich) selbsterklärenden Symbole stehen
zum Erstellen von Behaviors zu verfügung:
'move-prev-line
'move-next-line
'move-left
'move-right
'move-forawrd - wie move-right, springt aber nach Ende der Zeile
auf den Anfang der Nächsten.
'move-backward - equivalent zu 'move-forward
'goto-begin-of-line
'goto-end-of-line
'goto-begin-of-first-line
'goto-begin-of-last-line
'goto-begin-of-word-forward
'goto-begin-of-word-backward
'delete-left
'delete-right
'delete-all-left
'delete-all-right
'delete-line
'restore: Synchronisiert inrterne Daten mit externer Darstellung
und Zeichent das Input-field neu.
(war bisher nicht nötig, aber sobald Sonderzeichen erlaubt
sind.... ;-)
Außerdem zeichnet die Funktion
(input-field-refresh input-field)
das Input-field neu.
4. Cursor-over-inputfield? und send-input-field
-----------------------------------------------
(cursor-over-input-field? window) -> #f | input-field
liefert, wenn der Cursor im Fenster window über einem zuvor installiertem
Input-field steht, dieses Input-field zurück, ansonsten #f.
(send-input-field input-field integer) -> (values boolean boolean)
übergibt dem Input-field input-field die Zahl integer. Das Input-field
schaut zuerst, ob es sich um eine im Behavior gebundene Zahl handelt und
führt, falls dies der Fall ist die entsprechende Aktion aus. Falls integer
nicht im Behavior gebunden ist überprüft das Input-field ob es sich um einen
gültigen zum Einfügen gültigen Ascii-code (32-126) handelt und fügt das
entsprechende Zeichen gegebenenfalls an der aktuellen Cursorposition ein.
5. Position, Größe, Scrolleigenschaften nachträglich verändern
--------------------------------------------------------------
;; TODOOO
hierzu stehen folgende Funktionen zur Verfügung:
(input-field-reset input-field) - stellt den default-text wieder her
(input-field-clear input-field) - löscht den Inhalt
(input-field-move input-field x-loc y-loc) - setzt die linke, obere Ecke auf (x-loc y-loc)
(input-field-resize input-field x-dim y-dim) - setzt ...
(input-field-toggle-x-scroll input-field)
(input-field-toggle-y-scroll input-field)

217
scheme/demo.scm Normal file
View File

@ -0,0 +1,217 @@
(define NULL (ascii->char 0))
(define demo
(lambda ()
(let ((win (init-screen)))
(keypad win #t)
(noecho)
(make&install-input-field win
20 10
42 23
"
+----------------------------------+
| f1 : move left input-field |
| f2 : move right input-field |
| f3 : move up input-field |
| f4 : move down input-field |
| |
| f5 : make bigger in x direction |
| f6 : make smaler in x direction |
| f7 : make bigger in y direction |
| f8 : make smaler in y direction |
| |
| f9 : toggle x-scroll |
| f10 : toggle y-scroll |
| |
| f11 : clear |
| f12 : reset |
| |
| tab : toggle insert |
| |
| ESC : quit |
+----------------------------------+
0-0 0-1 0-2 0-3 0-4 0-5
1-0 1-1 1-2 1-3 1-4 1-5 1-6
2-0 2-1 2-2 2-3 2-4 2-5 2-6 2-7
3-0 3-1 3-2 3-3 3-4 3-5 3-6 3-7 3-8
4-0 4-1 4-2 4-3 4-4 4-5 4-6 4-7 4-8 4-9
5-0 5-1 5-2 5-3 5-4 5-5 5-6 5-7 5-8 4-9
6-0 6-1 6-2 6-3 6-4 6-5 6-6 6-7 6-8
7-0 7-1 7-2 7-3 7-4 7-5 7-6 7-7
8-0 8-1 8-2 8-3 8-4 8-5 8-6
9-0 9-1 9-2 9-3 9-4 9-5\n"
(append
(list (cons 9 ;; tab
'toggle-insert)
(cons key-ppage
'move-backward)
(cons key-npage
'move-forward))
standard-behavior-pro)
#t #t #t)
(wmove win 10 20)
(screen-refresh win)
(letrec ((else-loop (lambda (asc)
(let ((infl (cursor-over-input-field? win)))
(cond ((= asc 27)
(wclear win)
(clear)
(echo)
(endwin))
((= asc key-f1)
(input-field-move infl
(- (input-field-x-location infl)
1)
(input-field-y-location infl))
(screen-refresh win)
(loop (wgetch win)))
((= asc key-f2)
(input-field-move infl
(+ (input-field-x-location infl)
1)
(input-field-y-location infl))
(screen-refresh win)
(loop (wgetch win)))
((= asc key-f3)
(input-field-move infl
(input-field-x-location infl)
(- (input-field-y-location infl)
1))
(screen-refresh win)
(loop (wgetch win)))
((= asc key-f4)
(input-field-move infl
(input-field-x-location infl)
(+ (input-field-y-location infl)
1))
(screen-refresh win)
(loop (wgetch win)))
((= asc key-f5)
(input-field-resize infl
(+ (input-field-x-size infl)
1)
(input-field-y-size infl))
(screen-refresh win)
(loop (wgetch win)))
((= asc key-f6)
(input-field-resize infl
(- (input-field-x-size infl)
1)
(input-field-y-size infl))
(screen-refresh win)
(loop (wgetch win)))
((= asc key-f7)
(input-field-resize infl
(input-field-x-size infl)
(+ (input-field-y-size infl)
1))
(screen-refresh win)
(loop (wgetch win)))
((= asc key-f8)
(input-field-resize infl
(input-field-x-size infl)
(- (input-field-y-size infl)
1))
(screen-refresh win)
(loop (wgetch win)))
((= asc key-f9)
(input-field-toggle-x-scroll infl)
(wrefresh win)
(loop (wgetch win)))
((= asc key-f10)
(input-field-toggle-y-scroll infl)
(wrefresh win)
(loop (wgetch win)))
((= asc key-f11)
(input-field-clear infl)
(wrefresh win)
(loop (wgetch win)))
((= asc key-f12)
(input-field-reset infl)
(wrefresh win)
(loop (wgetch win)))
(else (loop (wgetch win)))))))
(loop (lambda (asc)
(cond ((cursor-over-input-field? win)
=> (lambda (infl)
(call-with-values
(lambda ()
(send-input-field infl asc))
(lambda (was-known is-changed)
(if is-changed
(begin
(wrefresh win)
(loop (wgetch win)))
(if was-known
(loop (wgetch win))
(else-loop asc)))))))))))
(loop (wgetch win))))))
(define screen-refresh
(lambda (screen)
(let ((infl (cursor-over-input-field? screen))
(x (getx screen))
(y (gety screen)))
(wclear screen)
(input-field-refresh infl)
(wdraw-box screen
(- (input-field-x-location infl) 1)
(- (input-field-y-location infl) 1)
(+ (input-field-x-size infl) 2)
(+ (input-field-y-size infl) 2))
(wmove screen y x)
(wrefresh screen))))
(define wdraw-box
(lambda (win x y dimx dimy)
(mvwaddstr win
y
x "+")
(mvwaddstr win
y
(+ dimx
(- x
1)) "+")
(mvwaddstr win
(+ dimy
(- y
1))
x "+")
(mvwaddstr win
(+ dimy
(- y
1))
(+ dimx
(- x
1)) "+")
(let loop-x ((dx (+ x 1)))
(if (= dx (+ x (- dimx 2)))
(begin
(mvwaddstr win y dx "-")
(mvwaddstr win (+ dimy
(- y
1)) dx "-"))
(begin
(mvwaddstr win y dx "-")
(mvwaddstr win (+ dimy
(- y
1)) dx "-")
(loop-x (+ dx 1)))))
(let loop-y ((dy (+ y 1)))
(if (= dy (+ y (- dimy 2)))
(begin
(mvwaddstr win dy x "|")
(mvwaddstr win dy (+ dimx
(- x
1)) "|"))
(begin
(mvwaddstr win dy x "|")
(mvwaddstr win dy (+ dimx
(- x
1)) "|")
(loop-y (+ dy 1)))))))

1461
scheme/input-fields.scm Normal file

File diff suppressed because it is too large Load Diff