0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-26 08:45:34 -05:00

Enable edition without edition mode.

This commit is contained in:
Andrey Antukh 2020-04-24 15:32:21 +02:00
parent 3d4cbe28f2
commit 0435954f32
3 changed files with 80 additions and 69 deletions

View file

@ -15,6 +15,7 @@
[goog.events :as events]
[goog.object :as gobj]
[potok.core :as ptk]
[uxbox.util.object :as obj]
[uxbox.main.fonts :as fonts]
["slate" :as slate :refer [Editor Transforms Text]]))
@ -29,10 +30,22 @@
;; --- Helpers
(defn- calculate-full-selection
[editor]
(let [children (obj/get editor "children")
paragraphs (obj/get-in children [0 "children" 0 "children"])]
#js {:anchor #js {:path #js [0 0 0]
:offset 0}
:focus #js {:path #js [0 0 (dec (alength paragraphs))]
:offset 1}}))
(defn set-nodes!
([editor props]
(set-nodes! editor props #js {}))
([editor props options]
(when (and (nil? (obj/get editor "selection"))
(nil? (obj/get options "at")))
(obj/assoc! options "at" (calculate-full-selection editor)))
(.setNodes Transforms editor props options)
editor))
@ -57,28 +70,28 @@
[editor type]
(enabled? editor true
(fn [v]
(let [val (unchecked-get v "textDecoration")]
(let [val (obj/get v "textDecoration")]
(identical? type val)))))
(defn text-transform-enabled?
[editor type]
(enabled? editor true
(fn [v]
(let [val (unchecked-get v "textTransform")]
(let [val (obj/get v "textTransform")]
(identical? type val)))))
(defn text-align-enabled?
[editor type]
(enabled? editor false
(fn [v]
(let [val (unchecked-get v "textAlign")]
(let [val (obj/get v "textAlign")]
(identical? type val)))))
(defn vertical-align-enabled?
[editor type]
(enabled? editor false
(fn [v]
(let [val (unchecked-get v "verticalAlign")]
(let [val (obj/get v "verticalAlign")]
(identical? type val)))))
;; --- Getters
@ -90,20 +103,18 @@
at]
:as opts}]
(when editor
(let [options #js {:match pred :universal universal?}
default-loc #js {:path #js [0 0] :offset 0}]
(let [options #js {:match pred :universal universal?}]
(cond
(object? at)
(unchecked-set options "at" at)
(obj/assoc! options "at" at)
(nil? (unchecked-get editor "selection"))
(unchecked-set options "at" default-loc))
(nil? (obj/get editor "selection"))
(obj/assoc! options "at" (calculate-full-selection editor)))
(let [result (.nodes Editor editor options)
match (ffirst (es6-iterator-seq result))]
(when (object? match)
(unchecked-get match attr))))))
(obj/get match attr))))))
(defn current-line-height
[editor {:keys [at default]}]
@ -168,7 +179,6 @@
;; --- Setters
(defn set-text-decoration!
[editor type]
(set-nodes! editor
@ -194,7 +204,7 @@
(set-nodes! editor
#js {:verticalAlign type}
#js {:match (fn [item]
(= "text-box" (unchecked-get item "type")))}))
(= "text-box" (obj/get item "type")))}))
(defn set-line-height!
[editor val at]

View file

@ -22,6 +22,7 @@
[uxbox.util.color :as color]
[uxbox.util.dom :as dom]
[uxbox.util.geom.shapes :as geom]
[uxbox.util.object :as obj]
[uxbox.util.geom.matrix :as gmt]
["slate" :as slate]
["slate-react" :as rslate])
@ -72,38 +73,33 @@
;; --- Text Rendering
(defn obj-assoc!
[obj attr value]
(unchecked-set obj attr value)
obj)
(defn- generate-text-box-styles
[data]
(let [valign (unchecked-get data "verticalAlign")
(let [valign (obj/get data "verticalAlign")
base #js {:height "100%"
:width "100%"
:display "flex"}]
(cond-> base
(= valign "top") (obj-assoc! "alignItems" "flex-start")
(= valign "center") (obj-assoc! "alignItems" "center")
(= valign "bottom") (obj-assoc! "alignItems" "flex-end"))))
(= valign "top") (obj/assoc! "alignItems" "flex-start")
(= valign "center") (obj/assoc! "alignItems" "center")
(= valign "bottom") (obj/assoc! "alignItems" "flex-end"))))
(mf/defc rt-text-box
{::mf/wrap-props false
::mf/wrap [mf/memo]}
[props]
(let [attrs (unchecked-get props "attributes")
childs (unchecked-get props "children")
data (unchecked-get props "element")
type (unchecked-get data "type")
(let [attrs (obj/get props "attributes")
childs (obj/get props "children")
data (obj/get props "element")
type (obj/get data "type")
style (generate-text-box-styles data)
attrs (obj-assoc! attrs "style" style)
attrs (obj-assoc! attrs "className" type)]
attrs (obj/assoc! attrs "style" style)
attrs (obj/assoc! attrs "className" type)]
[:> :div attrs childs]))
(defn- generate-text-styles
[data]
(let [valign (unchecked-get data "verticalAlign")
(let [valign (obj/get data "verticalAlign")
base #js {:display "inline-block"
:width "100%"}]
base))
@ -112,13 +108,13 @@
{::mf/wrap-props false
::mf/wrap [mf/memo]}
[props]
(let [attrs (unchecked-get props "attributes")
childs (unchecked-get props "children")
data (unchecked-get props "element")
type (unchecked-get data "type")
(let [attrs (obj/get props "attributes")
childs (obj/get props "children")
data (obj/get props "element")
type (obj/get data "type")
style (generate-text-styles data)
attrs (obj-assoc! attrs "style" style)
attrs (obj-assoc! attrs "className" type)]
attrs (obj/assoc! attrs "style" style)
attrs (obj/assoc! attrs "className" type)]
[:> :div attrs childs]))
(defn- generate-paragraph-styles
@ -126,36 +122,36 @@
(let [base #js {:fontSize "14px"
:margin "inherit"
:lineHeight "1.2"}
lh (unchecked-get data "lineHeight")
ta (unchecked-get data "textAlign")]
lh (obj/get data "lineHeight")
ta (obj/get data "textAlign")]
(cond-> base
ta (obj-assoc! "textAlign" ta)
lh (obj-assoc! "lineHeight" lh))))
ta (obj/assoc! "textAlign" ta)
lh (obj/assoc! "lineHeight" lh))))
(mf/defc rt-pharagraph
{::mf/wrap-props false
::mf/wrap [mf/memo]}
[props]
(let [attrs (unchecked-get props "attributes")
childs (unchecked-get props "children")
data (unchecked-get props "element")
(let [attrs (obj/get props "attributes")
childs (obj/get props "children")
data (obj/get props "element")
style (generate-paragraph-styles data)
attrs (obj-assoc! attrs "style" style)]
attrs (obj/assoc! attrs "style" style)]
[:> :p attrs childs]))
(defn- generate-leaf-styles
[data]
(let [letter-spacing (unchecked-get data "letterSpacing")
text-decoration (unchecked-get data "textDecoration")
text-transform (unchecked-get data "textTransform")
(let [letter-spacing (obj/get data "letterSpacing")
text-decoration (obj/get data "textDecoration")
text-transform (obj/get data "textTransform")
font-id (unchecked-get data "fontId")
font-variant-id (unchecked-get data "fontVariantId")
font-id (obj/get data "fontId")
font-variant-id (obj/get data "fontVariantId")
font-family (unchecked-get data "fontFamily")
font-size (unchecked-get data "fontSize")
fill (unchecked-get data "fill")
opacity (unchecked-get data "opacity")
font-family (obj/get data "fontFamily")
font-size (obj/get data "fontSize")
fill (obj/get data "fill")
opacity (obj/get data "opacity")
fontsdb (mf/deref fonts/fontsdb)
@ -166,27 +162,27 @@
(when (and (string? letter-spacing)
(pos? (alength letter-spacing)))
(obj-assoc! base "letterSpacing" (str letter-spacing "px")))
(obj/assoc! base "letterSpacing" (str letter-spacing "px")))
(when (and (string? font-size)
(pos? (alength font-size)))
(obj-assoc! base "fontSize" (str font-size "px")))
(obj/assoc! base "fontSize" (str font-size "px")))
(when (and (string? font-id)
(pos? (alength font-id)))
(let [font (get fontsdb font-id)]
(fonts/ensure-loaded! font-id)
(let [font-family (or (:family font)
(unchecked-get data "fontFamily"))
(obj/get data "fontFamily"))
font-variant (d/seek #(= font-variant-id (:name %))
(:variants font))
font-style (or (:style font-variant)
(unchecked-get data "fontStyle"))
(obj/get data "fontStyle"))
font-weight (or (:weight font-variant)
(unchecked-get data "fontWeight"))]
(obj-assoc! base "fontFamily" font-family)
(obj-assoc! base "fontStyle" font-style)
(obj-assoc! base "fontWeight" font-weight))))
(obj/get data "fontWeight"))]
(obj/assoc! base "fontFamily" font-family)
(obj/assoc! base "fontStyle" font-style)
(obj/assoc! base "fontWeight" font-weight))))
base))
@ -194,18 +190,18 @@
{::mf/wrap-props false
::mf/wrap [mf/memo]}
[props]
(let [attrs (unchecked-get props "attributes")
childs (unchecked-get props "children")
data (unchecked-get props "leaf")
(let [attrs (obj/get props "attributes")
childs (obj/get props "children")
data (obj/get props "leaf")
style (generate-leaf-styles data)
attrs (obj-assoc! attrs "style" style)]
attrs (obj/assoc! attrs "style" style)]
[:> :span attrs childs]))
(defn- render-element
[props]
(mf/html
(let [element (unchecked-get props "element")]
(case (unchecked-get element "type")
(let [element (obj/get props "element")]
(case (obj/get element "type")
"text-box" [:> rt-text-box props]
"text" [:> rt-text props]
"paragraph" [:> rt-pharagraph props]
@ -302,7 +298,7 @@
(dom/prevent-default event)
(dom/stop-propagation event)
;; WARN: monky patch
(unchecked-set slate/Transforms "deselect" (constantly nil)))
(obj/assoc! slate/Transforms "deselect" (constantly nil)))
:placeholder "Type some text here..."}]]]))
;; --- Text Shape Wrapper
@ -325,6 +321,12 @@
(st/emit! (dwt/assign-editor editor))
#(st/emit! (dwt/assign-editor nil))))
on-change
(mf/use-callback
(fn [val]
(let [content (js->clj val)]
(st/emit! (dw/update-shape id {:content content})))))
render-element (mf/use-callback render-element)
render-leaf (mf/use-callback render-leaf)]
@ -339,7 +341,7 @@
[:> rslate/Slate {:editor editor
:value content
:on-change (constantly nil)}
:on-change on-change}
[:> rslate/Editable {:auto-focus "false"
:read-only "true"

View file

@ -378,7 +378,6 @@
(let [id (:id shape)
editor (:editor (mf/deref refs/workspace-local))
locale (i18n/use-locale)]
[:*
[:div.element-set
[:div.element-set-title (t locale "workspace.options.fill")]