mw3/src/cljs/mw3/core.cljs
simon 3dbda68cd7 Look and feel of the rule editor page is now almost perfect. I would like
to know how to get the character entities onto the buttons...
2016-03-03 23:53:57 +00:00

141 lines
4.9 KiB
Clojure

(ns ^:figwheel-always mw3.core
(:use-macros [dommy.template :only [node deftemplate]])
(:require-macros [cljs.core.async.macros :refer [go]])
(:require
[mw3.rulesets :as rulesets]
[dommy.core :as dommy :refer-macros [sel sel1]]
[dommy.template :as temp]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Data declarations
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Tiles supplied in the standard distribution. Obviously this isn't all the states you can have.
(def tiles ["abandoned"
"black"
"camp"
"climax"
"crop"
"error"
"fire"
"forest"
"grassland"
"heath"
"house"
"ice"
"inn"
"market"
"meadow"
"pasture"
"plague"
"ploughland"
"scrub"
"snow"
"waste"
"water"
"white"])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Navigation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Tabs in the single-page app.
(def available-tabs {:#home-tab {:content :#home-content :text "Home"}
:#params-tab {:content :#params-content :text "Parameters"}
:#rules-tab {:content :#rules-content :text "Rules"}
:#world-tab {:content :#world-content :text "World"}
:#docs-tab {:content :#docs-content :text "Documentation"}})
;; page-to-page navigation
(defn tab-handler
"Handle a click event on the tab with id `tab-id`"
[e tab-id]
(.log js/console (str "You clicked '" tab-id "'"))
(doseq [key (keys available-tabs)]
(let [content-id (:content (available-tabs key))
display (if (= key tab-id) "block" "none")]
(dommy/set-style! (sel1 content-id) :display display))))
(defn tab-click-listener
"Set up a click listener on the tab with this `tab-id`"
[tab-id]
(dommy/set-text! (sel1 tab-id) (:text (tab-id available-tabs)))
(dommy/listen! (sel1 tab-id) :click (fn [e] (tab-handler e tab-id))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Params page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn rebuild-ruleset-menu
[]
(let [menu (sel1 :#params-ruleset)]
(dommy/set-html!
menu
(temp/->document-fragment (temp/node [:ul "Froboz"])))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Rules page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(deftemplate rule-editor
;; "Constructs an editor for this `rule` with this `index`
[rule index]
[:div
{:id (str "rule-editor-" index) :class "rule-editor"}
[:input {:type "text" :id (str "rule-input-" index) :class "rule-input" :value rule}]
[:div {:id (str "rule-controls-" index) :class "rule-controls"}
[:input {:type "button" :id (str "rule-ok-" index) :class "rule-ok" :value "ok"}] ;; ✔
[:input {:type "button" :id (str "rule-up-" index) :class "rule-up" :value "up"}] ;; ↑
[:input {:type "button" :id (str "rule-down-" index) :class "rule-down" :value "down"}] ;; ↓
[:input {:type "button" :id (str "rule-delete-" index) :class "rule-delete" :value "delete"}]] ;; ✘
[:pre {:id (str "rule-feedback-" index) :class "rule-feedback"}]
])
;; (deftemplate rule-editors
;; ;; Constructs, as a `div`, a set of rule editors for the rules in the ruleset with
;; ;; this `ruleset-name`.
;; [ruleset-name]
;; [:div
;; (vec
;; (map
;; #(rule-editor % %)
;; (rulesets/rulesets ruleset-name)
;; (range)))])
(defn load-ruleset
"Loads the ruleset with the specified `name` into a set of rule editors"
[name]
(let [rules-container (sel1 :#rules-container)
ruleset (rulesets/rulesets name)]
(dommy/clear! rules-container)
(doseq [[rule index] (map #(list %1 %2) ruleset (range (count ruleset)))]
(dommy/append! rules-container (rule-editor rule index)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Set up the screen on loading
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; listeners for the tab bar
(tab-click-listener :#home-tab)
(tab-click-listener :#params-tab)
(tab-click-listener :#rules-tab)
(tab-click-listener :#world-tab)
(tab-click-listener :#docs-tab)
;; hide controls which aren't needed if we're doing things client side
(doseq [to-hide (sel :.hide-if-active)]
(dommy/set-style! to-hide :display "none"))
;; hide all pages except home-tab
(tab-handler nil :#home-tab)
;; set up the rulesets menu with the rulesets we actually have.
;; (rebuild-ruleset-menu)
;; put the default ruleset into the rulesets pages
(load-ruleset "settlement")