mirror of
https://github.com/penpot/penpot.git
synced 2025-06-02 10:01:38 +02:00
87 lines
2.6 KiB
Clojure
87 lines
2.6 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) 2016-2019 Andrey Antukh <niwi@niwi.nz>
|
|
|
|
(ns uxbox.main.ui.shapes.group
|
|
(:require
|
|
[lentes.core :as l]
|
|
[rumext.core :as mx]
|
|
[uxbox.main.geom :as geom]
|
|
[uxbox.main.refs :as refs]
|
|
[uxbox.main.store :as st]
|
|
[uxbox.main.ui.shapes.attrs :as attrs]
|
|
[uxbox.main.ui.shapes.circle :as circle]
|
|
[uxbox.main.ui.shapes.common :as common]
|
|
[uxbox.main.ui.shapes.icon :as icon]
|
|
[uxbox.main.ui.shapes.image :as image]
|
|
[uxbox.main.ui.shapes.path :as path]
|
|
[uxbox.main.ui.shapes.rect :as rect]
|
|
[uxbox.main.ui.shapes.text :as text]
|
|
[uxbox.util.data :refer [classnames]]
|
|
[uxbox.util.geom.matrix :as gmt]))
|
|
|
|
;; --- Helpers
|
|
|
|
(declare group-component)
|
|
|
|
(defn- focus-shape
|
|
[id]
|
|
(-> (l/in [:shapes id])
|
|
(l/derive st/state)))
|
|
|
|
(defn render-component
|
|
[shape]
|
|
(case (:type shape)
|
|
:group (group-component shape)
|
|
:text (text/text-component shape)
|
|
:icon (icon/icon-component shape)
|
|
:rect (rect/rect-component shape)
|
|
:path (path/path-component shape)
|
|
:image (image/image-component shape)
|
|
:circle (circle/circle-component shape)))
|
|
|
|
(mx/defc component-container
|
|
{:mixins [mx/reactive mx/static]}
|
|
[id]
|
|
(when-let [shape (mx/react (focus-shape id))]
|
|
(when-not (:hidden shape)
|
|
(render-component shape))))
|
|
|
|
;; --- Group Component
|
|
|
|
(declare group-shape)
|
|
|
|
(mx/defc group-component
|
|
{:mixins [mx/static mx/reactive]}
|
|
[{:keys [id x y width height group] :as shape}]
|
|
(let [modifiers (mx/react (refs/selected-modifiers id))
|
|
selected (mx/react refs/selected-shapes)
|
|
selected? (contains? selected id)
|
|
on-mouse-down #(common/on-mouse-down % shape selected)
|
|
shape (assoc shape :modifiers modifiers)]
|
|
[:g.shape.group-shape
|
|
{:class (when selected? "selected")
|
|
:on-mouse-down on-mouse-down}
|
|
(group-shape shape component-container)]))
|
|
|
|
;; --- Group Shape
|
|
|
|
(mx/defc group-shape
|
|
{:mixins [mx/static mx/reactive]}
|
|
[{:keys [id items modifiers] :as shape} factory]
|
|
(let [{:keys [resize displacement]} modifiers
|
|
|
|
xfmt (cond-> (gmt/matrix)
|
|
resize (gmt/multiply resize)
|
|
displacement (gmt/multiply displacement))
|
|
|
|
moving? (boolean displacement)]
|
|
[:g {:id (str "shape-" id)
|
|
:class (classnames :move-cursor moving?)
|
|
:transform (str xfmt)}
|
|
(for [item (reverse items)]
|
|
(-> (factory item)
|
|
(mx/with-key (str item))))]))
|
|
|