From d84a515a55d1cc26e41462ff82c6d24df051dbba Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 3 Apr 2021 22:35:50 -0400 Subject: [PATCH] repl: table inspector --- editor/repl.fnl | 52 +++++++++++++++++++++++++++++++++------------ editor/replview.fnl | 1 - lib/util.fnl | 2 +- todo.txt | 6 ++++-- 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/editor/repl.fnl b/editor/repl.fnl index bc97046..8e79b1f 100644 --- a/editor/repl.fnl +++ b/editor/repl.fnl @@ -2,41 +2,65 @@ (local fennel (require :lib.fennel)) (local style (require :core.style)) (local lume (require :lib.lume)) +(local {: textbutton} (util.require :editor.imstate)) (local repl (util.hot-table ...)) (fn repl.text-height [text ?font] - (let [font (or ?font style.font) + (let [font (or ?font style.code_font) (_ newlines) (text:gsub "\n" "\n")] (* (font:get_height) (+ newlines 1)))) -(fn repl.inspect-table [tbl view x y-start w] - (var y y-start) +(fn get-state [tbl k depth state] + (when (= nil (. state k)) + (tset state k {:collapsed (= (type (. tbl k)) :table) :children {}})) + (. state k)) + +(fn repl.inspect-table [tbl view x y w depth state] + (local font style.code_font) (var h 0) (each [k v (pairs tbl)] - (let [kstr (fv k) - wk 1] - nil)) - ) -(fn repl.inspect [v view x y w] - (renderer.draw_text style.font (fv v) x y style.text) + (let [kstate (get-state tbl k depth state) + kstr (fv k) + wk (font:get_width kstr) + xoffset (+ wk style.padding.x) + toggle-collapse (textbutton view kstr x (+ y h)) + hv (if kstate.collapsed + (do (renderer.draw_text font "..." (+ x xoffset) (+ y h) style.syntax.comment) (font:get_height)) + (repl.inspect v view (+ x xoffset) (+ y h) (- w xoffset) (+ depth 1) kstate.children))] + (when toggle-collapse (tset (. state k) :collapsed (not kstate.collapsed))) + (set h (+ h hv style.padding.y)))) + h) + +(fn repl.inspect-default [v view x y w depth state] + (renderer.draw_text style.code_font (fv v) x y style.text) (repl.text-height (fv v))) -(fn repl.inspector [{: vals} view x y] +(fn repl.inspect [v view x y w depth state] + (if (> w 0) + (match (type v) + :table (repl.inspect-table v view x y w depth state) + _ (repl.inspect-default v view x y w depth state)) + 0)) + +(fn repl.inspector [{: vals : state} view x y] (var h 0) (each [i v (ipairs vals)] - (set h (+ h (repl.inspect v view x (+ y h) view.size.x)))) + (set h (+ h (repl.inspect v view x (+ y h) view.size.x 1 state)))) (+ h style.padding.y)) (fn repl.notify [listeners line] (each [_ listener (ipairs listeners)] (listener:append line))) -(fn repl.run [{: listeners}] +(fn repl.mk-result [vals] (local inspector #(repl.inspector $...)) + {:draw inspector : vals :state {}}) + +(fn repl.run [{: listeners}] (fennel.repl {:readChunk coroutine.yield - :onValues #(repl.notify listeners {:draw inspector :vals $1}) - :onError (fn [errType err luaSource] (repl.notify listeners {:draw inspector :vals [err]})) + :onValues #(repl.notify listeners (repl.mk-result $1)) + :onError (fn [errType err luaSource] (repl.notify listeners (repl.mk-result [err]))) :pp #$1 :env (lume.clone _G)})) diff --git a/editor/replview.fnl b/editor/replview.fnl index 81cf65f..f7a2e6c 100644 --- a/editor/replview.fnl +++ b/editor/replview.fnl @@ -13,7 +13,6 @@ (set self.cmd "") (set self.scrollheight math.huge) (set self.scrollable true) - (set self.pin-to-bottom-y self.scroll.to.y) (self.conn:listen self)) (fn ReplView.try_close [self do_close] diff --git a/lib/util.fnl b/lib/util.fnl index 4750016..0e87065 100644 --- a/lib/util.fnl +++ b/lib/util.fnl @@ -57,7 +57,7 @@ (local tbl {}) (fn find-table [] (let [loaded-pkg (. package.loaded modname)] - (if (= (type loaded-pkg) :table) loaded-pkg) tbl)) + (if (= (type loaded-pkg) :table) loaded-pkg tbl))) (setmetatable {:hot tbl} { :__index (fn [_ key] (. (find-table) key)) :__newindex (fn [_ key val] (tset (find-table) key val)) diff --git a/todo.txt b/todo.txt index 3d4fd56..ca9c464 100644 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,8 @@ TODO: * tile editor (geometric shapes for now?) -Repl-y thing: -appends objects to a list (inspectable?) +REIL: +* history navigation +* paren matching (minibuffer?) +* edit table values inline