141 lines
4.9 KiB
Clojure
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")
|
|
|