diff --git a/editor/imgui.fnl b/editor/imgui.fnl index da8ac0a..43a124f 100644 --- a/editor/imgui.fnl +++ b/editor/imgui.fnl @@ -331,8 +331,37 @@ (set form.y (+ form.y form.h (or form.ypad 0)))) (table.unpack result)))) +(fn begin-group [] + (let [group {} + update-dimension + (fn [form coord-key size-key] + (let [coord-group (. group coord-key) size-group (. group size-key) + coord-form (. form coord-key) size-form (. form size-key)] + (if (= coord-group nil) ; container takes on the size of its first item + (do (tset group coord-key coord-form) + (tset group size-key size-form)) + + (> coord-group coord-form) ; we have an item that is outside the bounds to the left / up; reduce the starting point and extend the size + (do (tset group coord-key coord-form) + (tset group size-key (- (math.max (+ coord-form size-form) (+ coord-group size-group)) coord-form))) + + ; extend the size if the new item is outside the bounds to the right / down + (tset group size-key (- (math.max (+ coord-form size-form) (+ coord-group size-group)) coord-group)))))] + + (fn [viewfn-or-form ?form ...] + (if (= (type viewfn-or-form) :function) + (let [result [(viewfn-or-form ?form ...)]] + (update-dimension ?form :x :w) + (update-dimension ?form :y :h) + (table.unpack result)) + (do (set viewfn-or-form.x group.x) + (set viewfn-or-form.y group.y) + (set viewfn-or-form.w group.w) + (set viewfn-or-form.h group.h) + viewfn-or-form))))) + {: attach-imstate : cmd-predicate : postpone : mouse-inside : activate : active? : button : checkbox : textbox : textfield : textbutton : dropdown - : vert : horiz : horiz-wrapper + : vert : horiz : horiz-wrapper : begin-group : with-style : prepare-form : form-defaults} diff --git a/editor/init.fnl b/editor/init.fnl index 91edad7..e4b09f8 100644 --- a/editor/init.fnl +++ b/editor/init.fnl @@ -43,6 +43,13 @@ "graphics-editor:next-tile" #(core.active_view:select-rel 1) "graphics-editor:previous-tile" #(core.active_view:select-rel -1) }) +(command.add (cmd-predicate :editor.gfxedit2) { + "graphics-editor:save" (fn [] (core.active_view:save) (core.log "Saved")) + "graphics-editor:reload" (fn [] (core.active_view:reload) (core.log "Reloaded")) + "graphics-editor:next-tile" #(core.active_view:select-rel 1) + "graphics-editor:previous-tile" #(core.active_view:select-rel -1) +}) + (command.add (cmd-predicate :editor.tileedit) { "tileedit:copy" #(system.set_clipboard (: (core.active_view:tile) :tohex)) diff --git a/editor/tileedit/init.fnl b/editor/tileedit/init.fnl index 89a0bb5..e9baeb2 100644 --- a/editor/tileedit/init.fnl +++ b/editor/tileedit/init.fnl @@ -4,7 +4,8 @@ (local files (require :game.files)) (local util (require :lib.util)) (local lume (require :lib.lume)) -(local {: mouse-inside : activate : active? : checkbox : textfield : button : dropdown : with-style : form-defaults : vert : horiz-wrapper} (util.require :editor.imgui)) +(local {: mouse-inside : activate : active? : checkbox : textfield : button : dropdown : with-style : form-defaults + : vert : horiz-wrapper : begin-group} (util.require :editor.imgui)) (local TileView (GraphicsEditView:extend)) @@ -93,19 +94,17 @@ (fn TileView.draw-tile-preview [self form] (vert form tile-preview {} self.itile self.tilekey)) (fn tile-palette [{:view self : x : y : w &as form} pal selected-color] - (let [wrap (horiz-wrapper (with-style form))] + (let [g (begin-group) + wrap (horiz-wrapper (with-style form))] (var selected-color selected-color) (each [icolor color (ipairs pal)] (renderer.draw_rect form.x form.y pixel-size pixel-size color) (when (= icolor selected-color) (love.graphics.setColor 1 1 1 1) (love.graphics.rectangle :line (- form.x 2) (- form.y 2) (+ pixel-size 4) (+ pixel-size 4))) - (when (wrap button {:tag [:pal icolor] :w pixel-size :h pixel-size}) + (when (g wrap button {:tag [:pal icolor] :w pixel-size :h pixel-size}) (set selected-color icolor))) - (set form.w w) ;; todo: some kind of "group" combinator that does this for us - (set form.h (+ (- form.y y) pixel-size)) - (set form.x x) - (set form.y y) + (g form) selected-color)) (fn TileView.draw-tile-palette [self form]