mirror of
https://github.com/penpot/penpot.git
synced 2025-06-08 17:31:37 +02:00
Add basic icons rendering on canvas.
This commit is contained in:
parent
fc03388d70
commit
f28d54936f
4 changed files with 92 additions and 13 deletions
|
@ -6,11 +6,22 @@
|
||||||
[uxbox.time :as time]
|
[uxbox.time :as time]
|
||||||
[bouncer.validators :as v]))
|
[bouncer.validators :as v]))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Schemas
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(def ^:static +shape-props-schema+
|
||||||
|
{:x [v/required v/integer]
|
||||||
|
:y [v/required v/integer]
|
||||||
|
:width [v/required v/integer]
|
||||||
|
:height [v/required v/integer]})
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Events
|
;; Events
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(defn toggle-tool
|
(defn toggle-tool
|
||||||
|
"Toggle the enabled flag of the specified tool."
|
||||||
[toolname]
|
[toolname]
|
||||||
(reify
|
(reify
|
||||||
rs/UpdateEvent
|
rs/UpdateEvent
|
||||||
|
@ -20,9 +31,10 @@
|
||||||
|
|
||||||
IPrintWithWriter
|
IPrintWithWriter
|
||||||
(-pr-writer [mv writer _]
|
(-pr-writer [mv writer _]
|
||||||
(-write writer "#<event:u.s.p/toggle-tool>"))))
|
(-write writer "#<event:u.d.w/toggle-tool>"))))
|
||||||
|
|
||||||
(defn toggle-toolbox
|
(defn toggle-toolbox
|
||||||
|
"Toggle the visibility flag of the specified toolbox."
|
||||||
[toolname]
|
[toolname]
|
||||||
(reify
|
(reify
|
||||||
rs/UpdateEvent
|
rs/UpdateEvent
|
||||||
|
@ -36,9 +48,44 @@
|
||||||
|
|
||||||
IPrintWithWriter
|
IPrintWithWriter
|
||||||
(-pr-writer [mv writer _]
|
(-pr-writer [mv writer _]
|
||||||
(-write writer "#<event:u.s.p/toggle-toolbox>"))))
|
(-write writer "#<event:u.d.w/toggle-toolbox>"))))
|
||||||
|
|
||||||
|
(defn select-for-drawing
|
||||||
|
"Mark a shape selected for drawing in the canvas."
|
||||||
|
[shape]
|
||||||
|
(reify
|
||||||
|
rs/UpdateEvent
|
||||||
|
(-apply-update [_ state]
|
||||||
|
(println "select-for-drawing" shape)
|
||||||
|
(if shape
|
||||||
|
(assoc-in state [:workspace :drawing] shape)
|
||||||
|
(update-in state [:workspace] dissoc :drawing)))
|
||||||
|
|
||||||
|
IPrintWithWriter
|
||||||
|
(-pr-writer [mv writer _]
|
||||||
|
(-write writer "#<event:u.d.w/select-for-drawing>"))))
|
||||||
|
|
||||||
|
;; TODO: validate shape
|
||||||
|
|
||||||
|
(defn add-shape
|
||||||
|
"Mark a shape selected for drawing in the canvas."
|
||||||
|
[shape props]
|
||||||
|
(sc/validate! +shape-props-schema+ props)
|
||||||
|
(reify
|
||||||
|
rs/UpdateEvent
|
||||||
|
(-apply-update [_ state]
|
||||||
|
(println "add-shape")
|
||||||
|
(if-let [pageid (get-in state [:workspace :page])]
|
||||||
|
(update-in state [:pages-by-id pageid :shapes] conj
|
||||||
|
(merge shape props))
|
||||||
|
state))
|
||||||
|
|
||||||
|
IPrintWithWriter
|
||||||
|
(-pr-writer [mv writer _]
|
||||||
|
(-write writer "#<event:u.d.w/add-shape>"))))
|
||||||
|
|
||||||
(defn initialize
|
(defn initialize
|
||||||
|
"Initialize the workspace state."
|
||||||
[projectid pageid]
|
[projectid pageid]
|
||||||
(reify
|
(reify
|
||||||
rs/UpdateEvent
|
rs/UpdateEvent
|
||||||
|
@ -52,4 +99,5 @@
|
||||||
|
|
||||||
IPrintWithWriter
|
IPrintWithWriter
|
||||||
(-pr-writer [mv writer _]
|
(-pr-writer [mv writer _]
|
||||||
(-write writer "#<event:u.s.p/initialize>"))))
|
(-write writer "#<event:u.d.w/initialize>"))))
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,8 @@
|
||||||
}
|
}
|
||||||
(background)
|
(background)
|
||||||
[:svg.page-layout
|
[:svg.page-layout
|
||||||
#_(shape item)]
|
(for [item (:shapes page)]
|
||||||
|
(shape item))]
|
||||||
#_(apply vector :svg#page-layout (map shapes/shape->svg raw-shapes))
|
#_(apply vector :svg#page-layout (map shapes/shape->svg raw-shapes))
|
||||||
#_(when-let [shape (rum/react drawing)]
|
#_(when-let [shape (rum/react drawing)]
|
||||||
(shapes/shape->drawing-svg shape))
|
(shapes/shape->drawing-svg shape))
|
||||||
|
|
|
@ -106,16 +106,28 @@
|
||||||
;; Icons
|
;; Icons
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(defn- select-icon
|
||||||
|
[icon]
|
||||||
|
(if (= (:drawing @wb/workspace-state) icon)
|
||||||
|
(rs/emit! (dw/select-for-drawing nil))
|
||||||
|
(rs/emit! (dw/select-for-drawing icon))))
|
||||||
|
|
||||||
|
(defn- change-icon-coll
|
||||||
|
[local event]
|
||||||
|
(let [value (-> (dom/event->value event)
|
||||||
|
(read-string))]
|
||||||
|
(swap! local assoc :collid value)
|
||||||
|
(rs/emit! (dw/select-for-drawing nil))))
|
||||||
|
|
||||||
(defn icons-render
|
(defn icons-render
|
||||||
[own]
|
[own]
|
||||||
(let [local (:rum/local own)
|
(let [local (:rum/local own)
|
||||||
|
workspace (rum/react wb/workspace-state)
|
||||||
collid (:collid @local)
|
collid (:collid @local)
|
||||||
icons (get-in library/+icon-collections-by-id+ [collid :icons])
|
icons (get-in library/+icon-collections-by-id+ [collid :icons])
|
||||||
on-close #(rs/emit! (dw/toggle-toolbox :icons))
|
on-close #(rs/emit! (dw/toggle-toolbox :icons))
|
||||||
on-change (fn [e]
|
on-select #(select-icon %)
|
||||||
(let [value (dom/event->value e)
|
on-change #(change-icon-coll local %)]
|
||||||
value (read-string value)]
|
|
||||||
(swap! local assoc :collid value)))]
|
|
||||||
(html
|
(html
|
||||||
[:div#form-figures.tool-window
|
[:div#form-figures.tool-window
|
||||||
[:div.tool-window-bar
|
[:div.tool-window-bar
|
||||||
|
@ -132,9 +144,10 @@
|
||||||
[:option {:key (str "icon-coll" (:id icon-coll))
|
[:option {:key (str "icon-coll" (:id icon-coll))
|
||||||
:value (pr-str (:id icon-coll))}
|
:value (pr-str (:id icon-coll))}
|
||||||
(:name icon-coll)])]]
|
(:name icon-coll)])]]
|
||||||
(for [icon icons]
|
(for [icon icons
|
||||||
[:div.figure-btn {:class nil #_"selected"
|
:let [selected? (= (:drawing workspace) icon)]]
|
||||||
:on-click (constantly nil)}
|
[:div.figure-btn {:class (when selected? "selected")
|
||||||
|
:on-click #(on-select icon)}
|
||||||
(shapes/render icon)])]])))
|
(shapes/render icon)])]])))
|
||||||
|
|
||||||
(def ^:static icons
|
(def ^:static icons
|
||||||
|
|
|
@ -6,22 +6,39 @@
|
||||||
[uxbox.state :as s]
|
[uxbox.state :as s]
|
||||||
[uxbox.ui.mixins :as mx]
|
[uxbox.ui.mixins :as mx]
|
||||||
[uxbox.ui.util :as util]
|
[uxbox.ui.util :as util]
|
||||||
|
[uxbox.data.workspace :as dw]
|
||||||
[uxbox.ui.workspace.canvas :refer (canvas)]
|
[uxbox.ui.workspace.canvas :refer (canvas)]
|
||||||
[uxbox.ui.workspace.grid :refer (grid)]
|
[uxbox.ui.workspace.grid :refer (grid)]
|
||||||
[uxbox.ui.workspace.base :as wb]))
|
[uxbox.ui.workspace.base :as wb]))
|
||||||
|
|
||||||
|
;; TODO: implement as streams
|
||||||
|
|
||||||
|
(defn- on-click
|
||||||
|
[event wstate]
|
||||||
|
(let [mousepos @wb/mouse-position
|
||||||
|
shape (:drawing wstate)]
|
||||||
|
(when shape
|
||||||
|
(let [props {:x (first mousepos)
|
||||||
|
:y (second mousepos)
|
||||||
|
:width 100
|
||||||
|
:height 100}]
|
||||||
|
(rs/emit!
|
||||||
|
(dw/add-shape shape props)
|
||||||
|
(dw/select-for-drawing nil))))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Viewport
|
;; Viewport Component
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(defn viewport-render
|
(defn viewport-render
|
||||||
[]
|
[own]
|
||||||
(let [workspace (rum/react wb/workspace-state)
|
(let [workspace (rum/react wb/workspace-state)
|
||||||
drawing? (:drawing workspace)
|
drawing? (:drawing workspace)
|
||||||
zoom 1]
|
zoom 1]
|
||||||
(html
|
(html
|
||||||
[:svg.viewport {:width wb/viewport-height
|
[:svg.viewport {:width wb/viewport-height
|
||||||
:height wb/viewport-width
|
:height wb/viewport-width
|
||||||
|
:on-click #(on-click % workspace)
|
||||||
:class (when drawing? "drawing")}
|
:class (when drawing? "drawing")}
|
||||||
[:g.zoom {:transform (str "scale(" zoom ", " zoom ")")}
|
[:g.zoom {:transform (str "scale(" zoom ", " zoom ")")}
|
||||||
(canvas)
|
(canvas)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue