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
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))) |
|
|
|
|