summaryrefslogtreecommitdiff
path: root/next/lisp/minibuffer.lisp
blob: bfec04ba2e7634dee4fac292a5da6ba2cfa8d182 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
;;;; minibuffer.lisp --- major mode for input

(in-package :next)

(defvar minibuffer-mode-map (make-hash-table :test 'equalp))

(defvar *minibuffer* nil
  "A variable to store the mini-buffer")
(defparameter *minibuffer-prompt* (qnew "QLabel" "text" "input:")
  "A variable to store the minibuffer prompt")
(defparameter *minibuffer-input* (qnew "QLineEdit")
  "A variable to store the current minibuffer input")
(defparameter *minibuffer-completion* (qnew "QListWidget")
  "A variable to store the current minibuffer completion candidates")
(defparameter *minibuffer-callback* nil
  "A variable to store the function upon completion of the minibuffer read")
(defparameter *minibuffer-callback-buffer* nil
  "A variable to store the buffer which originally requested the minibuffer read")

(defun input (callback-function)
  (setf *minibuffer-callback* callback-function)
  (setf *minibuffer-callback-buffer* *active-buffer*)
  (|show| (buffer-view *minibuffer*))
  (|setFocus| *minibuffer-input*)
  (set-active-buffer *minibuffer*))

(defun return-input ()
  (set-active-buffer *minibuffer-callback-buffer*)
  (funcall *minibuffer-callback* (|text| *minibuffer-input*))
  (|setText| *minibuffer-input* "")
  (|hide| (buffer-view *minibuffer*)))

(define-key minibuffer-mode-map (kbd "Return") #'return-input)

(defun minibuffer-mode ()
  "Base mode for input"
  (let ((widget (qnew "QWidget")) (layout (qnew "QGridLayout")))
    (|addWidget| layout *minibuffer-prompt*      0 0 1 5)
    (|addWidget| layout *minibuffer-input*       0 1 1 15)
    (|addWidget| layout *minibuffer-completion*  1 1 1 15)
    (|setLayout| widget layout)
    (make-mode
     :name "Minibuffer-Mode"
     :keymap minibuffer-mode-map
     :view widget)))

(qadd-event-filter *minibuffer-input* |QEvent.KeyRelease| 'update-candidates)
(defun update-candidates (obj event)
  (declare (ignore obj)) ; supress unused warnings
  (declare (ignore event)) ; supress unused warnings
  nil)