implement dropdowns
This commit is contained in:
parent
b7637e5747
commit
415f179bd1
|
@ -23,6 +23,10 @@
|
||||||
(fn view.draw [self]
|
(fn view.draw [self]
|
||||||
(set self.cursor nil)
|
(set self.cursor nil)
|
||||||
(self.__index.draw self)
|
(self.__index.draw self)
|
||||||
|
(when self.imstate.postponed
|
||||||
|
(each [_ action (ipairs self.imstate.postponed)]
|
||||||
|
(action))
|
||||||
|
(set self.imstate.postponed nil))
|
||||||
(when (= self.cursor nil) (set self.cursor :arrow))
|
(when (= self.cursor nil) (set self.cursor :arrow))
|
||||||
(set self.imstate.keys nil)
|
(set self.imstate.keys nil)
|
||||||
(set self.imstate.text nil)
|
(set self.imstate.text nil)
|
||||||
|
@ -57,6 +61,11 @@
|
||||||
(fn [] (when (= (-?> core.active_view.imstate (. :focus)) nil)
|
(fn [] (when (= (-?> core.active_view.imstate (. :focus)) nil)
|
||||||
(p-fn))))
|
(p-fn))))
|
||||||
|
|
||||||
|
(fn postpone [view f]
|
||||||
|
(when (= view.imstate.postponed nil)
|
||||||
|
(set view.imstate.postponed []))
|
||||||
|
(table.insert view.imstate.postponed f))
|
||||||
|
|
||||||
(fn make-tag [tag]
|
(fn make-tag [tag]
|
||||||
(match (type tag)
|
(match (type tag)
|
||||||
:string tag
|
:string tag
|
||||||
|
@ -78,9 +87,9 @@
|
||||||
(and (active? view tag) (= view.imstate.left :released) (mouse-inside x y w h)))
|
(and (active? view tag) (= view.imstate.left :released) (mouse-inside x y w h)))
|
||||||
|
|
||||||
(fn textbutton [view label x y]
|
(fn textbutton [view label x y]
|
||||||
(local (w h) (values (+ (style.font:get_width label) 8) 24))
|
(local (w h) (values (+ (style.font:get_width label) style.padding.x) (+ (style.font:get_height) style.padding.y)))
|
||||||
(renderer.draw_rect x y w h style.selection)
|
(renderer.draw_rect x y w h style.selection)
|
||||||
(renderer.draw_text style.font label (+ x 4) (+ y 4) style.text)
|
(renderer.draw_text style.font label (+ x (/ style.padding.x 2)) (+ y (/ style.padding.y 2)) style.text)
|
||||||
(values (button view label x y w h) (+ y h)))
|
(values (button view label x y w h) (+ y h)))
|
||||||
|
|
||||||
(fn checkbox [view name isset x y ?tag]
|
(fn checkbox [view name isset x y ?tag]
|
||||||
|
@ -89,14 +98,14 @@
|
||||||
(love.graphics.setColor 1 1 1 1)
|
(love.graphics.setColor 1 1 1 1)
|
||||||
(button view (or ?tag name) x y (- xEnd x) 12))
|
(button view (or ?tag name) x y (- xEnd x) 12))
|
||||||
|
|
||||||
(fn focused? [view tag] (= tag (-?> view.imstate.focus (. :tag))))
|
(fn focused? [view tag] (= (make-tag tag) (-?> view.imstate.focus (. :tag))))
|
||||||
(fn focus [view tag x y w h opts]
|
(fn focus [view tag x y w h opts]
|
||||||
(if (activate view tag x y w h)
|
(if (activate view tag x y w h)
|
||||||
(set view.imstate.focus
|
(set view.imstate.focus
|
||||||
(doto (lume.clone (or opts {}))
|
(doto (lume.clone (or opts {}))
|
||||||
(tset :tag tag)))
|
(tset :tag (make-tag tag))))
|
||||||
|
|
||||||
(and (= view.imstate.left :released) (focused? view tag) (not (active? view tag)))
|
(and (= view.imstate.left :released) (focused? view tag) (not (mouse-inside x y w h)))
|
||||||
(set view.imstate.focus nil))
|
(set view.imstate.focus nil))
|
||||||
(focused? view tag))
|
(focused? view tag))
|
||||||
|
|
||||||
|
@ -214,4 +223,29 @@
|
||||||
(renderer.draw_text style.font label x y style.text)
|
(renderer.draw_text style.font label x y style.text)
|
||||||
(textbox view label text (+ x wLabel) y wText))
|
(textbox view label text (+ x wLabel) y wText))
|
||||||
|
|
||||||
{: attach-imstate : cmd-predicate : mouse-inside : activate : active? : button : checkbox : textbox : textfield : textbutton}
|
(fn dropdown [view tag selection options x y w]
|
||||||
|
(local row-h (+ (style.font:get_height) style.padding.y))
|
||||||
|
(local new-selection (and (focused? view tag) view.imstate.focus.selection))
|
||||||
|
(local focused-h (if (focused? view tag) (* row-h (+ (length options) 1)) row-h))
|
||||||
|
(print new-selection (focused? view tag) focused-h view.imstate.active)
|
||||||
|
(when new-selection (set view.imstate.focus nil))
|
||||||
|
|
||||||
|
(renderer.draw_rect x y w row-h style.selection)
|
||||||
|
(renderer.draw_text style.font selection (+ x style.padding.x) (+ y (/ style.padding.y 2)) style.text)
|
||||||
|
(renderer.draw_text style.icon_font "-" (+ x w (- style.padding.x)) (+ y (/ style.padding.y 2)) style.text)
|
||||||
|
|
||||||
|
(postpone view
|
||||||
|
#(when (focus view tag x y w focused-h)
|
||||||
|
(var row-y (+ y row-h))
|
||||||
|
(each [i option (ipairs options)]
|
||||||
|
(renderer.draw_rect x row-y w row-h style.selection)
|
||||||
|
(renderer.draw_text style.font option (+ x style.padding.x) (+ row-y (/ style.padding.y 2)) style.text)
|
||||||
|
(when (button view [(make-tag tag) i] x row-y w row-h)
|
||||||
|
(print "selected" option)
|
||||||
|
(set view.imstate.focus.selection option))
|
||||||
|
(set row-y (+ row-y row-h)))))
|
||||||
|
|
||||||
|
(or new-selection selection))
|
||||||
|
|
||||||
|
{: attach-imstate : cmd-predicate : postpone : mouse-inside : activate : active?
|
||||||
|
: button : checkbox : textbox : textfield : textbutton : dropdown}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
(local style (require :core.style))
|
(local style (require :core.style))
|
||||||
(local util (require :lib.util))
|
(local util (require :lib.util))
|
||||||
(local lume (require :lib.lume))
|
(local lume (require :lib.lume))
|
||||||
(local {: mouse-inside : activate : active? : checkbox : textfield : textbutton} (util.require :editor.imstate))
|
(local {: mouse-inside : activate : active? : checkbox : textfield : textbutton : dropdown} (util.require :editor.imstate))
|
||||||
(local {: tilestrip-to-sprite} (util.require :editor.tiledraw))
|
(local {: tilestrip-to-sprite} (util.require :editor.tiledraw))
|
||||||
(local {: encode-yx : encode-itile : decode-itile} (util.require :game.tiles))
|
(local {: encode-yx : encode-itile : decode-itile} (util.require :game.tiles))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue