mirror of
https://github.com/penpot/penpot.git
synced 2025-01-09 00:10:11 -05:00
70 lines
1.8 KiB
Clojure
70 lines
1.8 KiB
Clojure
(ns uxbox.shapes)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; 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))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Api
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(declare -render)
|
|
|
|
(defn render
|
|
([shape] (-render shape nil))
|
|
([shape attrs] (-render shape attrs)))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Implementation Api
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(defn- dispatch-by-type
|
|
[shape & params]
|
|
(:type shape))
|
|
|
|
(defmulti -render
|
|
dispatch-by-type
|
|
:hierarchy #'+hierarchy+)
|
|
|
|
(defmulti -move
|
|
dispatch-by-type
|
|
:hierarchy #'+hierarchy+)
|
|
|
|
(defmulti -resize
|
|
dispatch-by-type
|
|
:hierarchy #'+hierarchy+)
|
|
|
|
(defmulti -rotate
|
|
dispatch-by-type
|
|
:hierarchy #'+hierarchy+)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Implementation
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(defmethod -move ::shape
|
|
[shape {:keys [dx dy] :as opts}]
|
|
(assoc shape
|
|
:x (+ (:x shape) dx)
|
|
:y (+ (:y shape) dy)))
|
|
|
|
(defmethod -resize ::shape
|
|
[shape {:keys [width height] :as opts}]
|
|
(assoc shape
|
|
:width width
|
|
:height height))
|
|
|
|
(defmethod -rotate ::shape
|
|
[shape rotation]
|
|
(assoc shape :rotation rotation))
|