Support display of multi-row menus

This commit is contained in:
Jaidyn Ann 2023-07-02 18:31:35 -05:00
parent 125976e844
commit 23297ecfba
2 changed files with 13 additions and 8 deletions

View File

@ -416,9 +416,10 @@ avoid triggering this."
`((:en "PLAY" :eo "EKLUDI" `((:en "PLAY" :eo "EKLUDI"
:selection 100 :selected t :selection 100 :selected t
:return ,(🌍:make-overworld-state *casino-map*)) :return ,(🌍:make-overworld-state *casino-map*))
(:en "SUBMENU" :eo "SUBMENUO" (:en "SUBMENU" :eo "SUBMENUO" :row 1
:return ,(📋:make-menu-state (submenu))) :return ,(📋:make-menu-state (submenu)))
(:en "QUIT" :eo "REZIGNI" (:en "TERURE" :eo "BADLY" :row 1)
(:en "QUIT" :eo "REZIGNI" :row 2
:return nil))) :return nil)))

View File

@ -40,7 +40,7 @@ A state-function for use with the #'state-loop."
(defun menu-state-draw (matrix menu-plist) (defun menu-state-draw (matrix menu-plist)
"Render a menu in menu-plist format to the given matrix. "Render a menu in menu-plist format to the given matrix.
A core part of #'menu-state." A core part of #'menu-state."
(render-menu-strip matrix menu-plist 0 0)) (render-menu-items matrix menu-plist 0 0))
(defun menu-state-update (menu-plist) (defun menu-state-update (menu-plist)
@ -87,26 +87,30 @@ left-to-right, unless negative — in which case, right-to-left."
matrix)) matrix))
(defun render-menu-strip (matrix items x y &key (max-item-width 12) (height 3)) (defun render-menu-items (matrix items x y &key (max-item-width 12) (height 3))
"Render several menu items to the matrix, starting at the given x/y coordinates, "Render several menu items to the matrix, starting at the given x/y coordinates,
maximum width for any given item, and the height of all items. maximum width for any given item, and the height of all items.
The item list should be an plist of the following format: The item list should be an plist of the following format:
(((LABEL :en BIRD :eo BIRDO)(SELECTED . T)(SELECTION . 100)) (((LABEL :en BIRD :eo BIRDO)(SELECTED . T)(SELECTION . 100))
((LABEL :en BAR :eo BARO)(SELECTION . -20)) )" ((LABEL :en BAR :eo BARO)(SELECTION . -20)) )"
(let ((x x)) (let ((row-xes '()))
(mapcar (mapcar
(lambda (item) (lambda (item)
(let* ((label (:getf-lang item)) (let* ((label (:getf-lang item))
(selection (or (getf item :selection) (selection (or (getf item :selection)
0)) 0))
(width (:at-most max-item-width (width (:at-most max-item-width
(+ (length label) 2)))) (+ (length label) 2)))
(render-menu-item matrix label x y (row (or (getf item :row) 0))
(item-x (or (getf row-xes row) x))
(item-y (+ y (* row height))))
(render-menu-item matrix label
item-x item-y
:width width :width width
:height height :height height
:selection selection :selection selection
:selected (getf item :selected)) :selected (getf item :selected))
(setf x (+ x width 1)))) (setf (getf row-xes row) (+ item-x width 1))))
items)) items))
matrix) matrix)