(ns microtables-frontend.subs (:require [re-frame.core :as re-frame] [microtables-frontend.utils :as utils])) (re-frame/reg-sub ::controls-state (fn [db] (println "reporting state of controls") (:controls db))) (defn highlight-cells "Modify all cells in data (set :view to :highlighted) that are within the given range." [data selection] (let [c1 (get-in selection [:start :col]) r1 (get-in selection [:start :row]) c2 (get-in selection [:end :col]) r2 (get-in selection [:end :row]) cells (utils/range->list c1 r1 c2 r2)] (loop [new-data data remaining cells] (if (empty? remaining) new-data (let [cur (first remaining) highlighted (assoc-in new-data [(:col cur) (:row cur) :view] :highlighted)] (recur highlighted (rest remaining))))))) ;TODO: insert other display mode data? ("value": formula (cursor), "display" (default): evaluated, "highlighted": in a selection (just a class?)) (re-frame/reg-sub ::table-data (fn [db] (println "returning table data") (let [data (:table-data db) cursor (get-in db [:position :cursor]) selection (get-in db [:position :selection]) highlighted (if selection (highlight-cells data selection) data)] (if cursor (assoc-in highlighted [(:col cursor) (:row cursor) :view] :value) highlighted))))