You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

60 lines
2.2 KiB

(in-package #:gui)
(defclass text-field (text)
((focusp :initarg :focusp :initform nil :accessor focusp)
(border :initarg :border :initform :solid :accessor border)
(border-color :initarg :border-color :initform r:+black+ :accessor border-color)
(border-thickness :initarg :border-thickness :initform 1 :accessor border-thickness)
(cursor :initarg :cursor :initform nil :accessor cursor)
(padding :initarg :padding :initform 0 :accessor padding)
(min-width :initarg :min-width :initform 0 :accessor min-width)))
(defmethod calculate-size ((txt text-field))
(with-slots (w h font font-size text spacing padding min-width) txt
(when font
(let ((size (r:measure-text-ex (load-font font font-size)
(or text "")
(float font-size)
spacing)))
(setf w (max min-width (+ (v:vx size) (* padding 2))))
(setf h (+ (max (v:vy (r:measure-text-ex (load-font font font-size)
" "
(float font-size)
spacing))
(v:vy size))
(* padding 2)))
(update-x txt)
(update-y txt)))))
(defmethod draw ((self text-field))
(with-slots (font font-size text screen-x screen-y w h color spacing visible focusp border border-thickness border-color cursor padding) self
(when visible
(when border
(r:draw-rectangle-lines-ex (r:make-rectangle :x screen-x
:y screen-y
:width w
:height h)
(float border-thickness)
border-color))
(when focusp
(let ((size (r:measure-text-ex (load-font font font-size)
(str:substring 0 cursor text)
(float font-size)
spacing)))
(r:draw-line-ex (v:vec2 (+ screen-x padding (v:vx size))
(+ screen-y padding))
(v:vec2 (+ screen-x padding (v:vx size))
(+ screen-y padding (v:vy size)))
1.0
color)))
(when text
(r:draw-text-ex (load-font font font-size)
text
(v:vec (float (+ screen-x padding)) (float (+ screen-y padding)))
(float font-size)
spacing
color)))))
(defmacro make-text-field (&rest args)
`(update (make-instance 'text-field ,@args)))