diff --git a/public/css/style.css b/public/css/style.css index a154f71..d72f950 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -124,7 +124,7 @@ p { margin: auto 0 auto calc(var(--sidebar-left-margin) + 6px); } -.table-icon { +.frame-icon { height: 0.8rem; margin: auto 5px auto 0; } @@ -134,7 +134,7 @@ p { margin: auto 7px auto 2px; } -.tables-header { +.frames-header { top: 0; height: var(--cell-height); width: 100%; @@ -147,7 +147,7 @@ p { border-bottom: 1px solid var(--code-margin); } -.tables-list-items { +.frames-list-items { background-image: linear-gradient(var(--code-lines) 0.7px, transparent 0.7px); background-position-y: var(--cell-height); background-size: 100% var(--cell-height); @@ -156,12 +156,12 @@ p { overflow-y: auto; } -.tables-list-item { +.frames-list-item { height: var(--cell-height); display: flex; } -.tables-list-item a { +.frames-list-item a { cursor: pointer; border-bottom: 2px solid #eee; font-family: SpaceGrotesk, sans-serif; @@ -170,16 +170,16 @@ p { margin: auto 0 auto 0; } -.make-table-form { +.make-frame-form { margin: auto 0 auto 0; } -.make-table-input { +.make-frame-input { border: 1px solid #e9e9ed; padding: 4px; } -.make-table-input:active, .make-table-input:focus { +.make-frame-input:active, .make-frame-input:focus { outline: none; /* border: 2px solid #3b5aa3; */ } diff --git a/public/img/table-icon.png b/public/img/frame-icon.png similarity index 100% rename from public/img/table-icon.png rename to public/img/frame-icon.png diff --git a/public/img/made-table-icon.png b/public/img/made-frame-icon.png similarity index 100% rename from public/img/made-table-icon.png rename to public/img/made-frame-icon.png diff --git a/src/bean/errors.cljs b/src/bean/errors.cljs index c2c3b40..c068d29 100644 --- a/src/bean/errors.cljs +++ b/src/bean/errors.cljs @@ -13,13 +13,13 @@ {:error (str "Undefined reference: \"" name "\"") :representation (str "Undefined reference: \"" name "\"")}) -(defn undefined-table-at [address] - {:error (str "No table found at " address "") - :representation (str "No table found at " address "")}) +(defn undefined-frame-at [address] + {:error (str "No frame found at " address "") + :representation (str "No frame found at " address "")}) -(defn invalid-table-args [address] - {:error (str "table() needs a cell ref, given \"" address "\"") - :representation (str "table() needs a cell ref, given \"" address "\"")}) +(defn invalid-frame-args [address] + {:error (str "frame() needs a cell ref, given \"" address "\"") + :representation (str "frame() needs a cell ref, given \"" address "\"")}) (defn label-not-found [label-name] {:error (str "label \"" label-name "\" doesn't exist") diff --git a/src/bean/tables.cljs b/src/bean/frames.cljs similarity index 50% rename from src/bean/tables.cljs rename to src/bean/frames.cljs index 7b5534b..8cc8815 100644 --- a/src/bean/tables.cljs +++ b/src/bean/frames.cljs @@ -1,72 +1,72 @@ -(ns bean.tables +(ns bean.frames (:require [bean.area :as area] [bean.util :as util] [clojure.set :as set])) -(defn make-table [sheet table-name area] +(defn make-frame [sheet frame-name area] (if (and (not (area/area-empty? area)) (not (some #(area/overlap? % area) - (vals (:tables sheet))))) - (assoc-in sheet [:tables table-name] + (vals (:frames sheet))))) + (assoc-in sheet [:frames frame-name] (merge area {:labels {} :skip-cells #{}})) sheet)) -(defn cell-table [[r c] sheet] +(defn cell-frame [[r c] sheet] (some - (fn [[table-name {:keys [start end]}]] + (fn [[frame-name {:keys [start end]}]] (let [[start-r start-c] start [end-r end-c] end] (when (and (>= r start-r) (<= r end-r) (>= c start-c) (<= c end-c)) - table-name))) - (:tables sheet))) + frame-name))) + (:frames sheet))) -(defn add-label [sheet table-name rc dirn & [color]] - (if (= (cell-table rc sheet) table-name) +(defn add-label [sheet frame-name rc dirn & [color]] + (if (= (cell-frame rc sheet) frame-name) (assoc-in sheet - [:tables table-name :labels (util/merged-or-self rc sheet)] + [:frames frame-name :labels (util/merged-or-self rc sheet)] {:dirn dirn :color color}) sheet)) -(defn add-labels [sheet table-name addresses dirn] - (reduce #(add-label %1 table-name %2 dirn (util/random-color-hex)) sheet addresses)) +(defn add-labels [sheet frame-name addresses dirn] + (reduce #(add-label %1 frame-name %2 dirn (util/random-color-hex)) sheet addresses)) -(defn remove-labels [sheet table-name addresses] - (reduce #(update-in % [:tables table-name :labels] dissoc %2) sheet addresses)) +(defn remove-labels [sheet frame-name addresses] + (reduce #(update-in % [:frames frame-name :labels] dissoc %2) sheet addresses)) -(defn get-table [sheet table-name] - (get-in sheet [:tables table-name])) +(defn get-frame [sheet frame-name] + (get-in sheet [:frames frame-name])) -(defn- get-label [sheet table-name rc & [dirn]] - (let [label (get-in sheet [:tables table-name :labels rc])] +(defn- get-label [sheet frame-name rc & [dirn]] + (let [label (get-in sheet [:frames frame-name :labels rc])] (if dirn (when (= (:dirn label) dirn) label) label))) -(defn label? [sheet table-name label-name & [dirn]] +(defn label? [sheet frame-name label-name & [dirn]] (some (fn [[label label-data]] (and (= label-name (:scalar (util/get-cell (:grid sheet) label))) (if dirn (= (:dirn label-data) dirn) true))) - (:labels (get-table sheet table-name)))) + (:labels (get-frame sheet frame-name)))) (defn merge-labels [sheet start addresses] - (if-let [table-name (cell-table start sheet)] - (let [is-label? (get-label sheet table-name start) + (if-let [frame-name (cell-frame start sheet)] + (let [is-label? (get-label sheet frame-name start) other-labels? (and (not is-label?) - (some #(get-label sheet table-name %) addresses)) + (some #(get-label sheet frame-name %) addresses)) label (or is-label? other-labels?)] (if label (-> sheet - (remove-labels table-name addresses) - (add-label table-name start (:dirn label) (:color label))) + (remove-labels frame-name addresses) + (add-label frame-name start (:dirn label) (:color label))) sheet)) sheet)) @@ -102,17 +102,17 @@ [r* c*])) (sort-by (fn [[[r _] _]] r) labels))) -(defn blocking-label [sheet table-name label] - (let [{:keys [labels] :as table} (get-table sheet table-name) - {:keys [dirn]} (get-in table [:labels label])] +(defn blocking-label [sheet frame-name label] + (let [{:keys [labels] :as frame} (get-frame sheet frame-name) + {:keys [dirn]} (get-in frame [:labels label])] (case dirn :top (top-blocking-label sheet label labels) :left (left-blocking-label sheet label labels)))) -(defn label->cells [sheet table-name label] - (let [{:keys [end] :as table} (get-table sheet table-name) - [table-end-r table-end-c] end - labels (:labels table) +(defn label->cells [sheet frame-name label] + (let [{:keys [end] :as frame} (get-frame sheet frame-name) + [frame-end-r frame-end-c] end + labels (:labels frame) merged-with-labels (mapcat #(get-in (util/get-cell (:grid sheet) %) [:style :merged-addresses]) @@ -121,54 +121,54 @@ (as-> (area/area->addresses {:start label - :end (let [[br bc] (blocking-label sheet table-name label)] + :end (let [[br bc] (blocking-label sheet frame-name label)] (case dirn - :top [(if br (dec br) table-end-r) - (min (last-col label sheet) table-end-c)] - :left [(min (last-row label sheet) table-end-r) - (if bc (dec bc) table-end-c)]))}) cells + :top [(if br (dec br) frame-end-r) + (min (last-col label sheet) frame-end-c)] + :left [(min (last-row label sheet) frame-end-r) + (if bc (dec bc) frame-end-c)]))}) cells (apply disj cells (filter #(get labels %) cells)) (apply disj cells merged-with-labels))))) -(defn skipped-cells [sheet table-name] - (let [table (get-table sheet table-name) - labels (:labels table) - skip-labels (filter #(get-in table [:skip-cells %]) (keys labels))] +(defn skipped-cells [sheet frame-name] + (let [frame (get-frame sheet frame-name) + labels (:labels frame) + skip-labels (filter #(get-in frame [:skip-cells %]) (keys labels))] (set/union - (set (mapcat #(label->cells sheet table-name %) skip-labels)) - (:skip-cells table)))) + (set (mapcat #(label->cells sheet frame-name %) skip-labels)) + (:skip-cells frame)))) -(defn label-name->cells [sheet table-name label-name & [dirn]] +(defn label-name->cells [sheet frame-name label-name & [dirn]] ;; Excludes skip labels - (->> (keys (:labels (get-table sheet table-name))) - (filter #(get-label sheet table-name % dirn)) + (->> (keys (:labels (get-frame sheet frame-name))) + (filter #(get-label sheet frame-name % dirn)) (filter #(when (= label-name (:scalar (util/get-cell (:grid sheet) %))) %)) - (map #(label->cells sheet table-name %)) + (map #(label->cells sheet frame-name %)) (apply set/union) - (#(apply disj % (skipped-cells sheet table-name))))) + (#(apply disj % (skipped-cells sheet frame-name))))) -(defn mark-skipped [sheet table-name addresses] - (update-in sheet [:tables table-name :skip-cells] #(apply conj % (set addresses)))) +(defn mark-skipped [sheet frame-name addresses] + (update-in sheet [:frames frame-name :skip-cells] #(apply conj % (set addresses)))) -(defn unmark-skipped [sheet table-name addresses] +(defn unmark-skipped [sheet frame-name addresses] (let [addresses* (set/union (set addresses) - (set (mapcat #(label->cells sheet table-name %) addresses)))] - (update-in sheet [:tables table-name :skip-cells] #(apply disj % addresses*)))) + (set (mapcat #(label->cells sheet frame-name %) addresses)))] + (update-in sheet [:frames frame-name :skip-cells] #(apply disj % addresses*)))) -(defn resize-table [sheet table-name area] - (update-in sheet [:tables table-name] merge area)) +(defn resize-frame [sheet frame-name area] + (update-in sheet [:frames frame-name] merge area)) -(defn expand-tables [sheet [updated-r updated-c]] - (if-let [at-end-of-table (some (fn [[table-name {:keys [start end]}]] +(defn expand-frames [sheet [updated-r updated-c]] + (if-let [at-end-of-frame (some (fn [[frame-name {:keys [start end]}]] (when (and (= updated-r (inc (first end))) (< updated-c (inc (second end))) (>= updated-c (second start))) - table-name)) (:tables sheet))] + frame-name)) (:frames sheet))] - (let [[end-r end-c] (:end (get-table sheet at-end-of-table))] - (resize-table sheet at-end-of-table {:end [(inc end-r) end-c]})) + (let [[end-r end-c] (:end (get-frame sheet at-end-of-frame))] + (resize-frame sheet at-end-of-frame {:end [(inc end-r) end-c]})) sheet)) diff --git a/src/bean/functions.cljs b/src/bean/functions.cljs index d6186e7..a4d5f7d 100644 --- a/src/bean/functions.cljs +++ b/src/bean/functions.cljs @@ -2,7 +2,7 @@ (:require [bean.area :as area] [bean.errors :as errors] [bean.interpreter :as interpreter] - [bean.tables :as tables] + [bean.frames :as frames] [bean.util :as util] [clojure.set :as set] [clojure.string])) @@ -19,54 +19,54 @@ (reduce str "" arg)) args)) -(defn- new-table-result [sheet table-result new-selection] +(defn- new-frame-result [sheet frame-result new-selection] (let [new-selection (set new-selection)] {:matrix (util/map-on-matrix #(if (get new-selection %) (util/get-cell (:grid sheet) %) {:scalar "" :representation ""}) (area/addresses->address-matrix new-selection)) - :table (merge table-result + :frame (merge frame-result {:selection new-selection})})) (defn bean-row [sheet args] - (let [table-result (:table (first args)) - selection (:selection table-result) - table (tables/get-table sheet (:name table-result)) - [start-r start-c] (:start table) - [end-r end-c] (:end table) + (let [frame-result (:frame (first args)) + selection (:selection frame-result) + frame (frames/get-frame sheet (:name frame-result)) + [start-r start-c] (:start frame) + [end-r end-c] (:end frame) cols (range start-c (inc end-c)) - labels (set (keys (:labels table)))] + labels (set (keys (:labels frame)))] (as-> (for [col cols] (for [[r _] selection] [r col])) rcs (mapcat identity rcs) (set rcs) (apply disj rcs labels) - (new-table-result sheet table-result rcs)))) + (new-frame-result sheet frame-result rcs)))) (defn bean-col [sheet args] - (let [table-result (:table (first args)) - selection (:selection table-result) - table (tables/get-table sheet (:name table-result)) - [start-r start-c] (:start table) - [end-r end-c] (:end table) + (let [frame-result (:frame (first args)) + selection (:selection frame-result) + frame (frames/get-frame sheet (:name frame-result)) + [start-r start-c] (:start frame) + [end-r end-c] (:end frame) rows (range start-r (inc end-r)) - labels (set (keys (:labels table)))] + labels (set (keys (:labels frame)))] (as-> (for [row rows] (for [[_ c] selection] [row c])) rcs (mapcat identity rcs) (set rcs) (apply disj rcs labels) - (new-table-result sheet table-result rcs)))) + (new-frame-result sheet frame-result rcs)))) (defn bean-reduce [sheet args] - (let [table-result (:table (first args)) + (let [frame-result (:frame (first args)) f (second args) f* #(interpreter/apply-f-args sheet f [%1 %2]) val* (first (drop 2 args)) - col* (->> (:selection table-result) + col* (->> (:selection frame-result) sort (map #(util/get-cell (:grid sheet) %)) (remove #(clojure.string/blank? (:scalar %))))] @@ -77,28 +77,28 @@ ;; This doesn't work for matrices right now ;; It should: eval-matrix should perhaps return a :selection also (defn bean-filter [sheet args] - (let [table-result (:table (first args)) + (let [frame-result (:frame (first args)) f (second args) - selection (:selection table-result)] + selection (:selection frame-result)] (->> selection (filter #(:scalar (interpreter/apply-f-args sheet f [(util/get-cell (:grid sheet) %)]))) - (new-table-result sheet table-result)))) + (new-frame-result sheet frame-result)))) (defn- bean-get* [sheet args asts & [dirn]] - (let [table-result (:table (first args)) + (let [frame-result (:frame (first args)) label (:scalar (second args)) - existing-selection (:selection table-result) - vget-cells (tables/label-name->cells + existing-selection (:selection frame-result) + vget-cells (frames/label-name->cells sheet - (:name table-result) label dirn) + (:name frame-result) label dirn) new-selection (set/intersection vget-cells existing-selection)] - (if (tables/label? sheet (:name table-result) label dirn) - (new-table-result sheet table-result new-selection) + (if (frames/label? sheet (:name frame-result) label dirn) + (new-frame-result sheet frame-result new-selection) (errors/label-not-found (:scalar (interpreter/eval-ast (second asts) sheet)))))) @@ -111,22 +111,22 @@ (defn bean-hget [sheet args asts] (bean-get* sheet args asts :left)) -(defn bean-table [sheet args asts] +(defn bean-frame [sheet args asts] (if (cell-ref? (first asts)) (let [[_ [_ a n]] (first asts) address (util/a1->rc a (js/parseInt n)) - table-name (tables/cell-table address sheet) - table (tables/get-table sheet table-name)] - (if table-name - {:matrix (interpreter/eval-matrix (:start table) - (:end table) + frame-name (frames/cell-frame address sheet) + frame (frames/get-frame sheet frame-name)] + (if frame-name + {:matrix (interpreter/eval-matrix (:start frame) + (:end frame) (:grid sheet)) - :table {:name table-name + :frame {:name frame-name :selection (area/area->addresses - (select-keys table [:start :end])) + (select-keys frame [:start :end])) :selection-dirn nil}} - (errors/undefined-table-at (str a n)))) - (errors/invalid-table-args + (errors/undefined-frame-at (str a n)))) + (errors/invalid-frame-args (str (:scalar (first args)))))) (defn bean-error [_sheet args] diff --git a/src/bean/grid.cljs b/src/bean/grid.cljs index 7805137..992c2de 100644 --- a/src/bean/grid.cljs +++ b/src/bean/grid.cljs @@ -7,7 +7,7 @@ [bean.interpreter :as interpreter] [bean.parser.parser :as parser] [bean.parser.trellis-parser :as trellis-parser] - [bean.tables :as tables] + [bean.frames :as frames] [bean.util :as util] [bean.value :as value] [clojure.set :as set] @@ -22,7 +22,7 @@ :representation "f"} "hget" {:scalar functions/bean-hget :representation "f"} - "frame" {:scalar functions/bean-table + "frame" {:scalar functions/bean-frame :representation "f"} "filter" {:scalar functions/bean-filter :representation "f"} @@ -233,7 +233,7 @@ (reduce #(eval-dep %2 %1) sheet* deps-to-reval)))) ;; Temporary hack until we figure out how to reval -;; table queries +;; frame queries (defn eval-sheet-a-few-times [sheet] (let [addresses (->> (:grid sheet) (util/map-on-matrix-addressed @@ -249,7 +249,7 @@ (defn update-cell [address sheet content] (if (= (:content (util/get-cell (:grid sheet) address)) content "") sheet - (eval-sheet-a-few-times (eval-cell address (tables/expand-tables sheet address) content)))) + (eval-sheet-a-few-times (eval-cell address (frames/expand-frames sheet address) content)))) (defn- merge-cell [sheet address merge-with] (let [sheet* (if (not= merge-with address) @@ -273,7 +273,7 @@ (-> (reduce #(merge-cell %1 %2 start) sheet addresses) (set-cell-style start :merged-until end) (set-cell-style start :merged-addresses addresses) - (tables/merge-labels start addresses)) + (frames/merge-labels start addresses)) sheet))) (defn can-unmerge? [sheet addresses] @@ -394,7 +394,7 @@ {;; Source fields :grid grid :code code - :tables tables + :frames frames ;; Evaluated fields :depgraph depgraph diff --git a/src/bean/ui/db.cljs b/src/bean/ui/db.cljs index 488ff02..0efad11 100644 --- a/src/bean/ui/db.cljs +++ b/src/bean/ui/db.cljs @@ -54,4 +54,4 @@ :ui {:help-display false :grid {:editing-cell nil :selection nil - :selected-table nil}}})) + :selected-frame nil}}})) diff --git a/src/bean/ui/events.cljs b/src/bean/ui/events.cljs index ce2a87e..07df454 100644 --- a/src/bean/ui/events.cljs +++ b/src/bean/ui/events.cljs @@ -1,6 +1,6 @@ (ns bean.ui.events (:require [bean.grid :as grid] - [bean.tables :as tables] + [bean.frames :as frames] [bean.ui.provenance :as provenance] [bean.ui.db :as db] [re-frame.core :as rf] @@ -102,41 +102,41 @@ (assoc-in db [:ui :grid :selection] selection))) (rf/reg-event-fx - ::select-table - (fn select-table [{:keys [db]} [_ table-name]] - (let [{:keys [start]} (get-in db [:sheet :tables table-name])] + ::select-frame + (fn select-frame [{:keys [db]} [_ frame-name]] + (let [{:keys [start]} (get-in db [:sheet :frames frame-name])] (merge - {:db (assoc-in db [:ui :grid :selected-table] table-name)} + {:db (assoc-in db [:ui :grid :selected-frame] frame-name)} (when start {:fx [[:dispatch [::edit-cell start]]]}))))) (rf/reg-event-fx ::make-frame (fn make-frame [{:keys [db]} [_ area]] - (let [frame-number (inc (get-in db [:sheet :last-table-number])) + (let [frame-number (inc (get-in db [:sheet :last-frame-number])) frame-name (str "Frame " frame-number)] {:db (-> db - (assoc-in [:sheet :last-table-number] frame-number) - (update-in [:sheet] #(tables/make-table % frame-name area))) - :fx [[:dispatch [::select-table frame-name]]]}))) + (assoc-in [:sheet :last-frame-number] frame-number) + (update-in [:sheet] #(frames/make-frame % frame-name area))) + :fx [[:dispatch [::select-frame frame-name]]]}))) (rf/reg-event-db ::add-labels - (fn add-labels [db [_ table-name addresses dirn]] + (fn add-labels [db [_ frame-name addresses dirn]] (update-in db [:sheet] - #(tables/add-labels % table-name addresses dirn)))) + #(frames/add-labels % frame-name addresses dirn)))) (rf/reg-event-db ::remove-labels - (fn remove-labels [db [_ table-name addresses]] + (fn remove-labels [db [_ frame-name addresses]] (-> db - (update-in [:sheet] #(tables/unmark-skipped % table-name addresses)) - (update-in [:sheet] #(tables/remove-labels % table-name addresses))))) + (update-in [:sheet] #(frames/unmark-skipped % frame-name addresses)) + (update-in [:sheet] #(frames/remove-labels % frame-name addresses))))) (rf/reg-event-db ::mark-skip-cells - (fn mark-skip-cells [db [_ table-name addresses]] + (fn mark-skip-cells [db [_ frame-name addresses]] (update-in db [:sheet] - #(tables/mark-skipped % table-name addresses)))) + #(frames/mark-skipped % frame-name addresses)))) (rf/reg-event-db ::clear-selection diff --git a/src/bean/ui/styles.cljs b/src/bean/ui/styles.cljs index bd87faa..d72efc4 100644 --- a/src/bean/ui/styles.cljs +++ b/src/bean/ui/styles.cljs @@ -11,8 +11,8 @@ :cell-error-color 0xb93333 :selection 0x888888 :selection-alpha 0.06 - :table-border 0x3b5aa3 - :table-name 0x3b5aa3}) + :frame-border 0x3b5aa3 + :frame-name 0x3b5aa3}) (def colors light) @@ -30,10 +30,10 @@ :heading-border 1 :resizer-handle 20 :selection-border 1.5 - :table-border 1 - :table-highlight 2 - :table-name-font 12 - :table-name-padding 3}) + :frame-border 1 + :frame-highlight 2 + :frame-name-font 12 + :frame-name-padding 3}) (def cell-background-colors [nil 0xcccccc 0xffc9c9 0xb2f2bb 0xa5d8ff 0xffec99]) diff --git a/src/bean/ui/subs.cljs b/src/bean/ui/subs.cljs index d29c3bc..b5f55fe 100644 --- a/src/bean/ui/subs.cljs +++ b/src/bean/ui/subs.cljs @@ -8,9 +8,9 @@ (:sheet db))) (re-frame/reg-sub - ::tables + ::frames (fn [db] - (get-in db [:sheet :tables]))) + (get-in db [:sheet :frames]))) (re-frame/reg-sub ::ui diff --git a/src/bean/ui/views/sheet.cljs b/src/bean/ui/views/sheet.cljs index 3febb42..f71b79a 100644 --- a/src/bean/ui/views/sheet.cljs +++ b/src/bean/ui/views/sheet.cljs @@ -1,9 +1,8 @@ (ns bean.ui.views.sheet (:require [bean.area :as area] [bean.grid :as grid] - [bean.tables :as tables] + [bean.frames :as frames] [bean.ui.events :as events] - [bean.ui.features :as features] [bean.ui.styles :as styles] [bean.ui.subs :as subs] [bean.ui.util :as util] @@ -94,7 +93,7 @@ (.drawRect g x y w h)))) (defn- edit-cell [rc sheet] - (rf/dispatch-sync [::events/select-table (tables/cell-table rc sheet)]) + (rf/dispatch-sync [::events/select-frame (frames/cell-frame rc sheet)]) (rf/dispatch [::events/edit-cell rc])) (defn- grid-selection-end [area pixi-app] @@ -331,13 +330,13 @@ grid) g)) -(defn- draw-table-name [^js g table-name x y] - (let [font-size (:table-name-font styles/sizes) - text-bitmap (new pixi/BitmapText table-name +(defn- draw-frame-name [^js g frame-name x y] + (let [font-size (:frame-name-font styles/sizes) + text-bitmap (new pixi/BitmapText frame-name #js {:fontName "SpaceGrotesk" - :tint (:table-name styles/colors) + :tint (:frame-name styles/colors) :fontSize font-size}) - padding (:table-name-padding styles/sizes) + padding (:frame-name-padding styles/sizes) padded #(+ (* 2 padding) %)] (.beginFill g 0xffffff 1) (.drawRect g x @@ -363,22 +362,22 @@ (.addChild g sprite) sprite) -(defn- mark-skip-cells [table-name selection] +(defn- mark-skip-cells [frame-name selection] (rf/dispatch [::events/clear-edit-cell]) - (rf/dispatch [::events/mark-skip-cells table-name + (rf/dispatch [::events/mark-skip-cells frame-name (area/area->addresses selection)])) -(defn- remove-label [table-name selection] +(defn- remove-label [frame-name selection] (rf/dispatch [::events/clear-edit-cell]) - (rf/dispatch [::events/remove-labels table-name + (rf/dispatch [::events/remove-labels frame-name (area/area->addresses selection)])) -(defn- add-label [table-name selection dirn] +(defn- add-label [frame-name selection dirn] (rf/dispatch [::events/clear-edit-cell]) - (rf/dispatch [::events/add-labels table-name + (rf/dispatch [::events/add-labels frame-name (area/area->addresses selection) dirn])) -(defn- draw-label-controls [icons table-name selection] +(defn- draw-label-controls [icons frame-name selection] (let [g (new pixi/Graphics)] (.lineStyle g 2 0xcccccc 1 0.5) (.beginFill g 0xffffff) @@ -387,16 +386,16 @@ (.on g "pointerdown" #(.stopPropagation %)) (button! (new pixi/Sprite (:add-top-label icons)) g 5 5 20 - #(add-label table-name selection :top)) + #(add-label frame-name selection :top)) (button! (new pixi/Sprite (:add-left-label icons)) g 5 30 20 - #(add-label table-name selection :left)) + #(add-label frame-name selection :left)) (button! (new pixi/Sprite (:add-skip-label icons)) g 5 55 20 - #(mark-skip-cells table-name selection)) + #(mark-skip-cells frame-name selection)) (button! (new pixi/Sprite (:trash-label icons)) g 5 80 20 - #(remove-label table-name selection)) + #(remove-label frame-name selection)) g)) (defn- draw-skipped-cells [^js g textures sheet skipped-cells row-heights col-widths xs ys] @@ -411,13 +410,13 @@ (set! (.. bg -tileScale -y) 1.7) (.addChild g bg)))) -(defn- draw-label-bounds [textures sheet table-name labels row-heights col-widths] +(defn- draw-label-bounds [textures sheet frame-name labels row-heights col-widths] (let [xs (reductions + 0 col-widths) ys (reductions + 0 row-heights) g (new pixi/Graphics)] - (let [skipped-cells (tables/skipped-cells sheet table-name)] + (let [skipped-cells (frames/skipped-cells sheet frame-name)] (doseq [[[label-r label-c :as label] {:keys [color dirn]}] labels] - (doseq [[r c] (tables/label->cells sheet table-name label)] + (doseq [[r c] (frames/label->cells sheet frame-name label)] (if (get skipped-cells [r c]) (.beginFill g color 0.2) (.beginFill g color 0.5)) @@ -439,28 +438,28 @@ (.endFill g)) g)) -(defn- draw-tables +(defn- draw-frames ([] (new pixi/Graphics)) - ([^js g textures {:keys [tables] :as sheet} {:keys [selection selected-table]} row-heights col-widths] + ([^js g textures {:keys [frames] :as sheet} {:keys [selection selected-frame]} row-heights col-widths] (-> g (.clear) (.removeChildren)) - (doseq [[table-name table-data] tables] - (let [[x y w h] (area->xywh table-data row-heights col-widths) + (doseq [[frame-name frame-data] frames] + (let [[x y w h] (area->xywh frame-data row-heights col-widths) border (new pixi/Graphics) highlight (new pixi/Graphics) - extra-hitarea-y (+ (* 2 (:table-name-padding styles/sizes)) - (:table-name-font styles/sizes))] + extra-hitarea-y (+ (* 2 (:frame-name-padding styles/sizes)) + (:frame-name-font styles/sizes))] (-> g (.addChild border) (.addChild highlight)) (set! (.-eventMode border) "static") (set! (.-hitArea border) (new pixi/Rectangle x (- y extra-hitarea-y) w (+ h extra-hitarea-y))) - (.lineStyle border (:table-border styles/sizes) (:table-border styles/colors) 0.5 0.5) + (.lineStyle border (:frame-border styles/sizes) (:frame-border styles/colors) 0.5 0.5) (.drawRect border x y w h) - (draw-table-name highlight table-name x y) - (.addChild g (draw-label-bounds textures sheet table-name (:labels table-data) row-heights col-widths)) + (draw-frame-name highlight frame-name x y) + (.addChild g (draw-label-bounds textures sheet frame-name (:labels frame-data) row-heights col-widths)) - (when (= selected-table table-name) - (let [label-controls (draw-label-controls textures table-name selection)] + (when (= selected-frame frame-name) + (let [label-controls (draw-label-controls textures frame-name selection)] (.addChild g label-controls) (set! (.-x label-controls) (+ x w 5)) (set! (.-y label-controls) y))))))) @@ -672,7 +671,7 @@ (draw-merged-cells (:merged-cells @pixi-app) sheet row-heights col-widths) (draw-cell-backgrounds (:cell-backgrounds @pixi-app) sheet row-heights col-widths) (draw-cell-text (:cell-text @pixi-app) sheet row-heights col-widths) - (draw-tables (:tables @pixi-app) (:textures @pixi-app) sheet grid-ui row-heights col-widths) + (draw-frames (:frames @pixi-app) (:textures @pixi-app) sheet grid-ui row-heights col-widths) (draw-selection (:selection @pixi-app) (:selection grid-ui) row-heights col-widths) (draw-top-heading (:top-heading @pixi-app) col-widths v) (draw-left-heading (:left-heading @pixi-app) row-heights v) @@ -688,7 +687,7 @@ spills (.addChild grid (draw-spills)) merged-cells (.addChild grid (draw-merged-cells)) cell-text (.addChild grid (draw-cell-text)) - tables (.addChild grid (draw-tables)) + frames (.addChild grid (draw-frames)) selection (.addChild grid (draw-selection)) top-heading (.addChild c (draw-top-heading v)) left-heading (.addChild c (draw-left-heading v)) @@ -699,7 +698,7 @@ :grid grid :spills spills :selection selection - :tables tables + :frames frames :merged-cells merged-cells :cell-backgrounds cell-background :cell-text cell-text diff --git a/src/bean/ui/views/sidebar.cljs b/src/bean/ui/views/sidebar.cljs index 64f6fcb..5c841e2 100644 --- a/src/bean/ui/views/sidebar.cljs +++ b/src/bean/ui/views/sidebar.cljs @@ -5,14 +5,14 @@ [re-frame.core :as rf] [bean.area :as area])) -(defn tables-list [] +(defn frames-list [] (fn [] - (let [tables @(rf/subscribe [::subs/tables]) + (let [frames @(rf/subscribe [::subs/frames]) selection @(rf/subscribe [::subs/selection])] [:div - [:div {:class :tables-header} - [:img {:src "img/table-icon.png" - :class :table-icon}] + [:div {:class :frames-header} + [:img {:src "img/frame-icon.png" + :class :frame-icon}] [:p {:style {:line-height "1.2rem"}} "Frames"] [:button {:class :controls-btn @@ -21,21 +21,21 @@ :disabled (area/area-empty? selection) :on-click #(rf/dispatch [::events/make-frame selection])} "Make frame"]] - [:div {:class :tables-list-items} + [:div {:class :frames-list-items} [:div (doall - (for [[table-name] tables] - [:div {:key table-name - :class :tables-list-item} + (for [[frame-name] frames] + [:div {:key frame-name + :class :frames-list-item} - [:a {:on-click #(rf/dispatch [::events/select-table table-name])} - [:img {:src "img/made-table-icon.png" - :class :table-icon}] - table-name]]))]]]))) + [:a {:on-click #(rf/dispatch [::events/select-frame frame-name])} + [:img {:src "img/made-frame-icon.png" + :class :frame-icon}] + frame-name]]))]]]))) (defn sidebar [] [:div {:class :sidebar} [:div {:class :logo-container} [:img {:src "img/logo.png" :class :bean-logo}]] - [tables-list] + [frames-list] [code/text-area]]) diff --git a/test/bean/frames_test.cljs b/test/bean/frames_test.cljs new file mode 100644 index 0000000..602ca64 --- /dev/null +++ b/test/bean/frames_test.cljs @@ -0,0 +1,107 @@ +(ns bean.frames-test + (:require [bean.grid :as grid] + [bean.frames :as frames] + [clojure.test :refer [deftest testing is]])) + +(defn- new-sheet [] + (grid/eval-sheet (grid/new-sheet (repeat 5 (repeat 5 "")) ""))) + +(deftest make-frame-test + (testing "Creates a frame" + (let [sheet (frames/make-frame (new-sheet) "A frame" {:start [0 0] :end [2 2]})] + (is (= (frames/get-frame sheet "A frame") {:start [0 0] :end [2 2] :labels {} :skip-cells #{}}))))) + +(deftest cell-frame-test + (testing "Gets a cell's frame name" + (let [sheet (frames/make-frame (new-sheet) "A frame" {:start [0 0] :end [2 2]})] + (is (= (frames/cell-frame [1 1] sheet) "A frame")) + (is (= (frames/cell-frame [3 3] sheet) nil))))) + +(deftest add-label-test + (testing "Adds labels to a frame" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [2 2]}) + (frames/add-label frame-name [1 1] :top) + (frames/add-label frame-name [1 2] :left 0x000000))] + (is (= (get-in sheet [:frames frame-name :labels]) {[1 1] {:dirn :top :color nil} + [1 2] {:dirn :left :color 0x000000}}))))) + +(deftest blocking-label + (testing "Top labels of the same direction block labels that exist above" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [3 3]}) + (frames/add-label frame-name [0 0] :top) + (frames/add-label frame-name [2 0] :top))] + (frames/blocking-label sheet frame-name [0 0]))) + + (testing "Top labels of the same direction and span block labels that exist above" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [3 3]}) + (frames/add-label frame-name [0 0] :top) + (grid/merge-cells {:start [0 0] :end [0 1]}) + (frames/add-label frame-name [2 0] :top) + (grid/merge-cells {:start [2 0] :end [2 1]}))] + (frames/blocking-label sheet frame-name [0 0])))) + +(deftest label->cells-test + (testing "Gets cells under a simple top label" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [2 2]}) + (frames/add-label frame-name [1 1] :top))] + (is (= (frames/label->cells sheet frame-name [1 1]) #{[2 1]})))) + + (testing "Gets cells under a simple left label" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [2 2]}) + (frames/add-label frame-name [1 1] :left))] + (is (= (frames/label->cells sheet frame-name [1 1]) #{[1 2]})))) + + (testing "Gets cells under a merged top label" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [2 2]}) + (frames/add-label frame-name [1 1] :top) + (grid/merge-cells {:start [1 1] :end [1 2]}))] + (is (= (frames/label->cells sheet frame-name [1 1]) #{[2 1] [2 2]})))) + + (testing "Doesn't include other labels in the result" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [2 2]}) + (frames/add-label frame-name [0 0] :top) + (grid/merge-cells {:start [0 0] :end [0 1]}) + (frames/add-label frame-name [1 0] :top))] + (is (nil? (get [1 0] (frames/label->cells sheet frame-name [0 0])))))) + + (testing "Includes skip cells from the result" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [2 2]}) + (frames/add-label frame-name [1 1] :top) + (frames/mark-skipped frame-name [[2 1]]))] + (is (some? (get-in sheet [:frames frame-name :skip-cells [2 1]]))) + (is (some? (get (frames/label->cells sheet frame-name [1 1]) [2 1])))))) + +(deftest label-name->cells-test + (testing "Doesn't include skip cells from the result" + (let [frame-name "A frame" + sheet (as-> (new-sheet) sheet + (frames/make-frame sheet frame-name {:start [0 0] :end [2 2]}) + (frames/add-label sheet frame-name [0 0] :top) + (grid/update-cell [0 0] sheet "A label") + (frames/mark-skipped sheet frame-name [[2 0]]))] + (is (= (frames/label-name->cells sheet frame-name "A label") #{[1 0]}))))) + +(deftest skipped-cells-test + (testing "Returns skipped cells and cells under a skip label" + (let [frame-name "A frame" + sheet (-> (new-sheet) + (frames/make-frame frame-name {:start [0 0] :end [2 2]}) + (frames/add-label frame-name [1 1] :top) + (frames/mark-skipped frame-name [[1 1]]))] + (is (some? (get (frames/skipped-cells sheet frame-name) [2 1])))))) diff --git a/test/bean/grid_test.cljs b/test/bean/grid_test.cljs index 586833b..4ed80a3 100644 --- a/test/bean/grid_test.cljs +++ b/test/bean/grid_test.cljs @@ -8,7 +8,7 @@ [bean.util :as util] [clojure.test :refer [deftest testing is]] [bean.area :as area] - [bean.tables :as tables])) + [bean.frames :as frames])) (deftest evaluator-test (testing "Basic evaluation" @@ -356,10 +356,10 @@ :merged-until [1 2]})))) (testing "Merges labels into a single label" - (let [table-name "A table" + (let [frame-name "A frame" sheet (-> (new-sheet (repeat 5 (repeat 5 "")) "") eval-sheet - (tables/make-table table-name {:start [0 0] :end [2 2]}) - (tables/add-label table-name [1 1] :top) + (frames/make-frame frame-name {:start [0 0] :end [2 2]}) + (frames/add-label frame-name [1 1] :top) (grid/merge-cells {:start [0 1] :end [1 1]}))] - (is (= (get-in sheet [:tables table-name :labels]) {[0 1] {:dirn :top :color nil}}))))) + (is (= (get-in sheet [:frames frame-name :labels]) {[0 1] {:dirn :top :color nil}}))))) diff --git a/test/bean/tables_test.cljs b/test/bean/tables_test.cljs deleted file mode 100644 index 71018dd..0000000 --- a/test/bean/tables_test.cljs +++ /dev/null @@ -1,107 +0,0 @@ -(ns bean.tables-test - (:require [bean.grid :as grid] - [bean.tables :as tables] - [clojure.test :refer [deftest testing is]])) - -(defn- new-sheet [] - (grid/eval-sheet (grid/new-sheet (repeat 5 (repeat 5 "")) ""))) - -(deftest make-table-test - (testing "Creates a table" - (let [sheet (tables/make-table (new-sheet) "A Table" {:start [0 0] :end [2 2]})] - (is (= (tables/get-table sheet "A Table") {:start [0 0] :end [2 2] :labels {} :skip-cells #{}}))))) - -(deftest cell-table-test - (testing "Gets a cell's table name" - (let [sheet (tables/make-table (new-sheet) "A Table" {:start [0 0] :end [2 2]})] - (is (= (tables/cell-table [1 1] sheet) "A Table")) - (is (= (tables/cell-table [3 3] sheet) nil))))) - -(deftest add-label-test - (testing "Adds labels to a table" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [2 2]}) - (tables/add-label table-name [1 1] :top) - (tables/add-label table-name [1 2] :left 0x000000))] - (is (= (get-in sheet [:tables table-name :labels]) {[1 1] {:dirn :top :color nil} - [1 2] {:dirn :left :color 0x000000}}))))) - -(deftest blocking-label - (testing "Top labels of the same direction block labels that exist above" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [3 3]}) - (tables/add-label table-name [0 0] :top) - (tables/add-label table-name [2 0] :top))] - (tables/blocking-label sheet table-name [0 0]))) - - (testing "Top labels of the same direction and span block labels that exist above" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [3 3]}) - (tables/add-label table-name [0 0] :top) - (grid/merge-cells {:start [0 0] :end [0 1]}) - (tables/add-label table-name [2 0] :top) - (grid/merge-cells {:start [2 0] :end [2 1]}))] - (tables/blocking-label sheet table-name [0 0])))) - -(deftest label->cells-test - (testing "Gets cells under a simple top label" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [2 2]}) - (tables/add-label table-name [1 1] :top))] - (is (= (tables/label->cells sheet table-name [1 1]) #{[2 1]})))) - - (testing "Gets cells under a simple left label" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [2 2]}) - (tables/add-label table-name [1 1] :left))] - (is (= (tables/label->cells sheet table-name [1 1]) #{[1 2]})))) - - (testing "Gets cells under a merged top label" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [2 2]}) - (tables/add-label table-name [1 1] :top) - (grid/merge-cells {:start [1 1] :end [1 2]}))] - (is (= (tables/label->cells sheet table-name [1 1]) #{[2 1] [2 2]})))) - - (testing "Doesn't include other labels in the result" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [2 2]}) - (tables/add-label table-name [0 0] :top) - (grid/merge-cells {:start [0 0] :end [0 1]}) - (tables/add-label table-name [1 0] :top))] - (is (nil? (get [1 0] (tables/label->cells sheet table-name [0 0])))))) - - (testing "Includes skip cells from the result" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [2 2]}) - (tables/add-label table-name [1 1] :top) - (tables/mark-skipped table-name [[2 1]]))] - (is (some? (get-in sheet [:tables table-name :skip-cells [2 1]]))) - (is (some? (get (tables/label->cells sheet table-name [1 1]) [2 1])))))) - -(deftest label-name->cells-test - (testing "Doesn't include skip cells from the result" - (let [table-name "A Table" - sheet (as-> (new-sheet) sheet - (tables/make-table sheet table-name {:start [0 0] :end [2 2]}) - (tables/add-label sheet table-name [0 0] :top) - (grid/update-cell [0 0] sheet "A label") - (tables/mark-skipped sheet table-name [[2 0]]))] - (is (= (tables/label-name->cells sheet table-name "A label") #{[1 0]}))))) - -(deftest skipped-cells-test - (testing "Returns skipped cells and cells under a skip label" - (let [table-name "A Table" - sheet (-> (new-sheet) - (tables/make-table table-name {:start [0 0] :end [2 2]}) - (tables/add-label table-name [1 1] :top) - (tables/mark-skipped table-name [[1 1]]))] - (is (some? (get (tables/skipped-cells sheet table-name) [2 1]))))))