All features except adjustable redzone.
This commit is contained in:
parent
dcda9d8979
commit
4f1a97d731
1352
resources/public/css/re-com.css
Normal file
1352
resources/public/css/re-com.css
Normal file
File diff suppressed because it is too large
Load diff
|
@ -4,7 +4,7 @@
|
||||||
<meta charset='utf-8'>
|
<meta charset='utf-8'>
|
||||||
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css">
|
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="vendor/css/material-design-iconic-font.min.css">
|
<link rel="stylesheet" href="vendor/css/material-design-iconic-font.min.css">
|
||||||
<link rel="stylesheet" href="vendor/css/re-com.css">
|
<link rel="stylesheet" href="css/re-com.css">
|
||||||
<link rel="stylesheet" href="css/swinging-needle-meter.css">
|
<link rel="stylesheet" href="css/swinging-needle-meter.css">
|
||||||
<link href="http://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic" rel="stylesheet" type="text/css">
|
<link href="http://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic" rel="stylesheet" type="text/css">
|
||||||
<link href="http://fonts.googleapis.com/css?family=Roboto+Condensed:400,300" rel="stylesheet" type="text/css">
|
<link href="http://fonts.googleapis.com/css?family=Roboto+Condensed:400,300" rel="stylesheet" type="text/css">
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
;; Component: swinging-needle
|
;; Component: swinging-needle
|
||||||
;; ------------------------------------------------------------------------------------
|
;; ------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;;; It seems the defaults given here are just documentation; the defaults
|
||||||
|
;;; that are actually used are those given in the :or clause of the argument map.
|
||||||
(def swinging-needle-args-desc
|
(def swinging-needle-args-desc
|
||||||
[{:name :model :required true :type "double | atom"
|
[{:name :model :required true :type "double | atom"
|
||||||
:validate-fn number-or-string? :description "current value of the variable being watched. A number between 0 and 100"}
|
:validate-fn number-or-string? :description "current value of the variable being watched. A number between 0 and 100"}
|
||||||
|
@ -18,29 +20,61 @@
|
||||||
:validate-fn string? :description "a CSS width"}
|
:validate-fn string? :description "a CSS width"}
|
||||||
{:name :height :required false :type "string" :default "100%"
|
{:name :height :required false :type "string" :default "100%"
|
||||||
:validate-fn string? :description "a CSS height"}
|
:validate-fn string? :description "a CSS height"}
|
||||||
|
{:name :min-value :required false :type "double" :default 0
|
||||||
|
:validate-fn number? :description "the minimum value model can take"}
|
||||||
|
{:name :max-value :required false :type "double" :default 100
|
||||||
|
:validate-fn number? :description "the maximum value model can take"}
|
||||||
{:name :class :required false :type "string"
|
{:name :class :required false :type "string"
|
||||||
:validate-fn string? :description "CSS class names, space separated"}
|
:validate-fn string? :description "CSS class names, space separated"}
|
||||||
;; {:name :cursor-class :required false :type "string" :default "snm-cursor"
|
{:name :cursor-class :required false :type "string" :default "snm-cursor"
|
||||||
;; :validate-fn string? :description "CSS class names, space separated, for the cursor"}
|
:validate-fn string? :description "CSS class names, space separated, for the cursor"}
|
||||||
;; {:name :frame-class :required false :type "string" :default "snm-frame"
|
{:name :frame-class :required false :type "string" :default "snm-frame"
|
||||||
;; :validate-fn string? :description "CSS class names, space separated, for the frame"}
|
:validate-fn string? :description "CSS class names, space separated, for the frame"}
|
||||||
;; {:name :hub-class :required false :type "string" :default "snm-hub"
|
{:name :hub-class :required false :type "string" :default "snm-hub"
|
||||||
;; :validate-fn string? :description "CSS class names, space separated, for the hub"}
|
:validate-fn string? :description "CSS class names, space separated, for the hub"}
|
||||||
;; {:name :needle-class :required false :type "string" :default "snm-needle"
|
{:name :needle-class :required false :type "string" :default "snm-needle"
|
||||||
;; :validate-fn string? :description "CSS class names, space separated, for the needle"}
|
:validate-fn string? :description "CSS class names, space separated, for the needle"}
|
||||||
;; {:name :scale-class :required false :type "string" :default "snm-scale"
|
{:name :scale-class :required false :type "string" :default "snm-scale"
|
||||||
;; :validate-fn string? :description "CSS class names, space separated, for the scale"}
|
:validate-fn string? :description "CSS class names, space separated, for the scale"}
|
||||||
;; {:name :redzone-class :required false :type "string" :default "snm-redzone"
|
{:name :redzone-class :required false :type "string" :default "snm-redzone"
|
||||||
;; :validate-fn string? :description "CSS class names, space separated, for the redzone"}
|
:validate-fn string? :description "CSS class names, space separated, for the redzone"}
|
||||||
{:name :style :required false :type "CSS style map"
|
{:name :style :required false :type "CSS style map"
|
||||||
:validate-fn css-style? :description "CSS styles to add or override"}
|
:validate-fn css-style? :description "CSS styles to add or override"}
|
||||||
{:name :attr :required false :type "HTML attr map"
|
{:name :attr :required false :type "HTML attr map"
|
||||||
:validate-fn html-attr? :description [:span "HTML attributes, like " [:code ":on-mouse-move"] [:br] "No " [:code ":class"] " or " [:code ":style"] "allowed"]}])
|
:validate-fn html-attr? :description [:span "HTML attributes, like " [:code ":on-mouse-move"] [:br] "No " [:code ":class"] " or " [:code ":style"] "allowed"]}])
|
||||||
|
|
||||||
|
(defn abs
|
||||||
|
"Return the absolute value of the (numeric) argument."
|
||||||
|
[n] (max n (- n)))
|
||||||
|
|
||||||
|
;; the constant 140 represents the full sweep of the needle
|
||||||
|
;; from the left end of the scale to right end, in degrees.
|
||||||
|
(def full-scale-deflection 140)
|
||||||
|
|
||||||
|
(defn deflection
|
||||||
|
"Return the deflection of a needle given this `value` on the
|
||||||
|
range `min-value`...`max-value`."
|
||||||
|
[value min-value max-value]
|
||||||
|
(let [range (- max-value min-value)
|
||||||
|
deflection (/ value range)
|
||||||
|
zero-offset (/ (- 0 min-value) range)
|
||||||
|
limited (min (max (+ zero-offset deflection) 0) 1)]
|
||||||
|
(* (- limited 0.5) full-scale-deflection)))
|
||||||
|
|
||||||
|
|
||||||
(defn swinging-needle-meter
|
(defn swinging-needle-meter
|
||||||
"Render an SVG swinging needle meter"
|
"Render an SVG swinging needle meter"
|
||||||
[& {:keys [model setpoint width height class cursor-class frame-class hub-class needle-class scale-class redzone-class style attr]
|
[& {:keys [model setpoint width height min-value max-value class cursor-class frame-class hub-class needle-class scale-class redzone-class style attr]
|
||||||
:or {width "100%" height "100%"}
|
:or {width "100%"
|
||||||
|
height "100%"
|
||||||
|
min-value 0
|
||||||
|
max-value 100
|
||||||
|
cursor-class "snm-cursor"
|
||||||
|
frame-class "snm-frame"
|
||||||
|
hub-class "snm-hub"
|
||||||
|
needle-class "snm-needle"
|
||||||
|
scale-class "snm-scale"
|
||||||
|
redzone-class "snm-redzone"}
|
||||||
:as args}]
|
:as args}]
|
||||||
{:pre [(validate-args-macro swinging-needle-args-desc args "swinging-needle")]}
|
{:pre [(validate-args-macro swinging-needle-args-desc args "swinging-needle")]}
|
||||||
(let [model (deref-or-value model)
|
(let [model (deref-or-value model)
|
||||||
|
@ -66,16 +100,20 @@
|
||||||
:x "0px"
|
:x "0px"
|
||||||
:version "1.1"
|
:version "1.1"
|
||||||
:class (str "snm-meter " class)}
|
:class (str "snm-meter " class)}
|
||||||
[:path {:class "snm-scale"
|
[:path {:class scale-class
|
||||||
:d "m 11.85914,76.864488 c 0,0 14.34545,-53.795412 68.140856,-53.795412 53.795424,0 68.140864,53.795412 68.140864,53.795412"}]
|
:d "m 11.85914,76.864488 c 0,0 14.34545,-53.795412 68.140856,-53.795412 53.795424,0 68.140864,53.795412 68.140864,53.795412"}]
|
||||||
[:path {:class "snm-redzone" :d "m 137.74738,54.878869 c 0,0 3.02675,3.620416 6.3911,11.14347 3.36435,7.523055 4.20612,11.198095 4.20612,11.198095"}]
|
[:path {:class redzone-class :d "m 137.74738,54.878869 c 0,0 3.02675,3.620416 6.3911,11.14347 3.36435,7.523055 4.20612,11.198095 4.20612,11.198095"}]
|
||||||
[:rect {:class "snm-frame" :x "5" :y "5" :height "100" :width "150"}]
|
[:rect {:class frame-class :x "5" :y "5" :height "100" :width "150"}]
|
||||||
[:path {:class "snm-cursor"
|
[:path {:class cursor-class
|
||||||
:d "M 80,20 80,100"
|
:d "M 80,20 80,100"
|
||||||
:visibility (if (and (number? setpoint) (> setpoint 0)) "visible" "hidden")
|
:visibility (if (and (number? setpoint) (> setpoint min-value)) "visible" "hidden")
|
||||||
:transform (str "rotate( " (* (- setpoint 50) 1.4) ", 80, 100)")}]
|
:transform (str "rotate( " (deflection setpoint min-value max-value) ", 80, 100)")}]
|
||||||
[:path {:class "snm-needle"
|
[:path {:class needle-class
|
||||||
:d "M 80,20 80,100"
|
:d "M 80,20 80,100"
|
||||||
:transform (str "rotate( " (* (- model 50) 1.4) ", 80, 100)") }]
|
:transform (str "rotate( " (deflection model min-value max-value) ", 80, 100)") }]
|
||||||
[:circle {:class "snm-hub" :r "10" :cx "80" :cy "100"}]]
|
[:circle {:class hub-class :r "10" :cx "80" :cy "100"}]]
|
||||||
(str model "%")]]]))
|
;;; Useful for debugging:
|
||||||
|
;; (str "value: " model "; min: " min-value
|
||||||
|
;; "; max: " max-value
|
||||||
|
;; "; deflection: " (int (deflection model min-value max-value)))
|
||||||
|
]]]))
|
||||||
|
|
|
@ -27,11 +27,13 @@
|
||||||
:width "450px"
|
:width "450px"
|
||||||
:children [[title2 "Notes"]
|
:children [[title2 "Notes"]
|
||||||
[status-text "Wildly experimental"]
|
[status-text "Wildly experimental"]
|
||||||
[p "An SVG swinging needle meter. Note that the cursor will vanish if the setpoint is null or zero; this is intentional."]
|
[p "An SVG swinging needle meter."]
|
||||||
|
[p "Note that the cursor will vanish if the setpoint is null or is less than or equal to min-value; this is intentional."]
|
||||||
|
[p "Note that if the value of model is lower then min-value or greater than max-value,
|
||||||
|
it will be limited as it would be on a mechanical meter."]
|
||||||
|
[p "You can hide the redzone by setting its style to the style 'snm-scale'"]
|
||||||
[p
|
[p
|
||||||
"TODO: You can't adjust the position of the start of the red-zone; "
|
"TODO: You can't adjust the position of the start of the red-zone; "]
|
||||||
"you can't override the classes for the different elements of the meter; "
|
|
||||||
"you can't override the maximum and minimum values."]
|
|
||||||
[args-table swinging-needle-args-desc]]]
|
[args-table swinging-needle-args-desc]]]
|
||||||
[v-box
|
[v-box
|
||||||
:gap "10px"
|
:gap "10px"
|
||||||
|
|
Loading…
Reference in a new issue