Changeset main,44 for main


Ignore:
Timestamp:
11/08/2007 11:26:33 PM (19 years ago)
Author:
David Owen <dsowen@…>
branch-nick:
tui-new
revision id:
dsowen@fugue88.ws-20071108232633-o1pxoj710jjn381p
Message:

Forms may now be activated; they cycle through textboxes and auto-scroll.

Location:
main
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • main/form-test.lisp

    r43 r44  
    4747             (progn
    4848               (setf (scroll form) 4)
    49                (tui-input:read-key w))
     49               (activate form (lambda (key)
     50                                (member key '(#\Esc #\Tab #\Return :key-f12)))))
    5051          (destroy-form form))))))
  • main/form.lisp

    r43 r44  
    33(defpackage #:tui-form
    44  (:use #:cl #:dso-util #:tui-input #:tui-widget #:tui-window)
    5   (:export #:form-value #:defform #:create-form #:destroy-form #:scroll))
     5  (:export #:form-value #:defform #:create-form #:destroy-form #:scroll
     6           #:activate))
    67
    78(in-package #:tui-form)
     
    8788(defmethod (setf text) (text (r reflector))
    8889  (with-slots (data name) r
    89     (setf (form-value data name) r)))
     90    (setf (form-value data name) text)))
    9091
    9192
     
    119120
    120121(defun widget-visible-p (form widget)
    121   (with-slots (widgets window scroll) form
    122     (when (integerp widget)
    123       (setf widget (aref widgets widget)))
     122  (with-slots (window scroll) form
    124123    (with-slots (row) widget
    125124      (<= 0 (- row scroll) (1- (size window))))))
     
    139138            (setf (aref peers i) (create-peer widget-def form)))))
    140139      r)))
     140
     141(defun ensure-widget-visible (form i)
     142  (with-slots (widget-defs window scroll) form
     143    (let ((widget (aref widget-defs i)))
     144      (with-slots (row) widget
     145        (let* ((line (- row scroll))
     146               (diff (- line (bound line 0 (1- (size window))))))
     147          (incf (scroll form) diff))))))
    141148
    142149
     
    169176        (destroy (aref peers i))
    170177        (setf (aref peers i) nil)))))
     178
     179
     180
     181(defmethod activate ((form form) &optional (callback 'nothing))
     182  (with-slots (peers) form
     183    (flet ((callback (key)
     184             (if (member key '(#\Return #\Newline #\Tab :key-btab))
     185                 key
     186                 (funcall callback key))))
     187      (let ((focus 0)
     188            (n (length peers)))
     189        (loop
     190           (ensure-widget-visible form focus)
     191           (let ((key (activate (aref peers focus) #'callback)))
     192             (case key
     193               ((#\Return #\Newline #\Tab)
     194                (setf focus (mod (1+ focus) n)))
     195               (:key-btab
     196                (setf focus (mod (1- focus) n)))
     197               (t
     198                (return-from activate key)))))))))
  • main/tui.asd

    r42 r44  
    1616               (:file "display-string"
    1717                      ;; "input" only for testing
    18                       :depends-on ("cdk" "input"))
     18                      :depends-on ("cdk" "cursor" "input" "output" "window"))
    1919               (:module "widget"
    2020                        :depends-on ("cursor"
  • main/widget/textbox.lisp

    r40 r44  
    102102                (setf (insertion-point textbox) (insertion-point textbox)))))
    103103           (t
    104             (if (or (keywordp key) (member key '(#\Return #\Tab #\Esc)))
     104            (if (or (keywordp key)
     105                    (member key '(#\Return #\Newline #\Tab #\Esc)))
    105106                (let ((r (funcall callback key)))
    106107                  (when r
Note: See TracChangeset for help on using the changeset viewer.