0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-02 12:28:54 -05:00
penpot/frontend/uxbox/shapes.cljs

84 lines
2.2 KiB
Text
Raw Normal View History

(ns uxbox.shapes
2015-12-26 15:18:36 +02:00
(:require [sablono.core :refer-macros [html]]
[uxbox.util.data :refer (remove-nil-vals)]))
2015-12-29 23:39:31 +02:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Types
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:static ^:private +hierarchy+
(as-> (make-hierarchy) $
(derive $ :builtin/icon ::shape)
(derive $ :builtin/icon-svg ::shape)
(derive $ :builtin/icon-group ::shape)))
(defn shape?
[type]
{:pre [(keyword? type)]}
(isa? +hierarchy+ type ::shape))
2015-12-26 15:18:36 +02:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Api
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2015-12-30 01:25:26 +02:00
(declare -render)
2015-12-26 15:18:36 +02:00
(defn render
([shape] (-render shape nil))
([shape attrs] (-render shape attrs)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2015-12-30 01:25:26 +02:00
(defn- dispatch-by-type
[shape props]
(:type shape))
(defmulti -render
dispatch-by-type
:hierarchy #'+hierarchy+)
(defmulti -move
dispatch-by-type
:hierarchy #'+hierarchy+)
2015-12-26 15:18:36 +02:00
(defn transform-attrs
[{:keys [view-box] :as data}]
(if view-box
(assoc data :view-box (apply str (interpose " " view-box)))
data))
(defn extract-attrs
"Extract predefinet attrs from shapes."
[shape]
(select-keys shape [:width :height :view-box :x :y :cx :cy]))
2015-12-26 15:18:36 +02:00
(defmethod -render :builtin/icon
[{:keys [data id] :as shape} attrs]
2015-12-26 15:18:36 +02:00
(let [attrs (as-> shape $
(extract-attrs $)
2015-12-26 15:18:36 +02:00
(remove-nil-vals $)
(merge $ attrs)
(transform-attrs $))]
(html
[:svg (merge attrs {:key (str id)})
data])))
(defmethod -render :builtin/icon-svg
[{:keys [image id] :as shape} attrs]
(let [attrs (as-> shape $
(extract-attrs $)
(remove-nil-vals $)
(merge $ attrs)
(transform-attrs $))]
(html
[:svg (merge attrs {:key (str id)})
[:image image]])))
2015-12-30 01:25:26 +02:00
(defmethod -move ::shape
[shape {:keys [dx dy] :as opts}]
(assoc shape
:x (+ (:x shape) dx)
:y (+ (:y shape) dy)))