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