mirror of
https://github.com/penpot/penpot.git
synced 2025-03-11 23:31:21 -05:00
Properly disable layers buttons when action is not possible.
This commit is contained in:
parent
bb0b616cb3
commit
05b6c25aa9
2 changed files with 90 additions and 45 deletions
|
@ -36,6 +36,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&.disable {
|
&.disable {
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
svg {
|
svg {
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
|
|
|
@ -86,53 +86,50 @@
|
||||||
:text i/text
|
:text i/text
|
||||||
:group i/folder))
|
:group i/folder))
|
||||||
|
|
||||||
|
|
||||||
;; --- Shape Name (Component)
|
;; --- Shape Name (Component)
|
||||||
|
|
||||||
(mx/defcs shape-name
|
(mx/defcs shape-name
|
||||||
"A generic component that displays the shape name
|
"A generic component that displays the shape name
|
||||||
if it is available and allows inline edition of it."
|
if it is available and allows inline edition of it."
|
||||||
{:mixins [mx/static (mx/local)]}
|
{:mixins [mx/static (mx/local)]}
|
||||||
[own shape]
|
[{:keys [rum/local]} shape]
|
||||||
(let [local (:rum/local own)]
|
(letfn [(on-blur [event]
|
||||||
(letfn [(on-blur [event]
|
(let [target (dom/event->target event)
|
||||||
(let [target (dom/event->target event)
|
parent (.-parentNode target)
|
||||||
parent (.-parentNode target)
|
data {:id (:id shape)
|
||||||
data {:id (:id shape)
|
:name (dom/get-value target)}]
|
||||||
:name (dom/get-value target)}]
|
(set! (.-draggable parent) true)
|
||||||
(set! (.-draggable parent) true)
|
(st/emit! (uds/update-shape data))
|
||||||
(st/emit! (uds/update-shape data))
|
(swap! local assoc :edition false)))
|
||||||
(swap! local assoc :edition false)))
|
(on-key-down [event]
|
||||||
(on-key-down [event]
|
(js/console.log event)
|
||||||
(js/console.log event)
|
(when (kbd/enter? event)
|
||||||
(when (kbd/enter? event)
|
(on-blur event)))
|
||||||
(on-blur event)))
|
(on-click [event]
|
||||||
(on-click [event]
|
(dom/prevent-default event)
|
||||||
(dom/prevent-default event)
|
(let [parent (.-parentNode (.-target event))]
|
||||||
(let [parent (.-parentNode (.-target event))]
|
(set! (.-draggable parent) false))
|
||||||
(set! (.-draggable parent) false))
|
(swap! local assoc :edition true))]
|
||||||
(swap! local assoc :edition true))]
|
(if (:edition @local)
|
||||||
(if (:edition @local)
|
[:input.element-name
|
||||||
[:input.element-name
|
{:type "text"
|
||||||
{:type "text"
|
:on-blur on-blur
|
||||||
:on-blur on-blur
|
:on-key-down on-key-down
|
||||||
:on-key-down on-key-down
|
:auto-focus true
|
||||||
:auto-focus true
|
:default-value (:name shape "")}]
|
||||||
:default-value (:name shape "")}]
|
[:span.element-name
|
||||||
[:span.element-name
|
{:on-double-click on-click}
|
||||||
{:on-double-click on-click}
|
(:name shape "")])))
|
||||||
(:name shape "")]))))
|
|
||||||
|
|
||||||
;; --- Layer Simple (Component)
|
;; --- Layer Simple (Component)
|
||||||
|
|
||||||
(mx/defcs layer-simple
|
(mx/defcs layer-simple
|
||||||
{:mixins [mx/static (mx/local)]}
|
{:mixins [mx/static (mx/local)]}
|
||||||
[own item selected]
|
[{:keys [rum/local]} item selected]
|
||||||
(let [selected? (contains? selected (:id item))
|
(let [selected? (contains? selected (:id item))
|
||||||
select #(select-shape selected item %)
|
select #(select-shape selected item %)
|
||||||
toggle-visibility #(toggle-visibility selected item %)
|
toggle-visibility #(toggle-visibility selected item %)
|
||||||
toggle-blocking #(toggle-blocking item %)
|
toggle-blocking #(toggle-blocking item %)
|
||||||
local (:rum/local own)
|
|
||||||
classes (classnames
|
classes (classnames
|
||||||
:selected selected?
|
:selected selected?
|
||||||
:drag-active (:dragging @local)
|
:drag-active (:dragging @local)
|
||||||
|
@ -197,9 +194,8 @@
|
||||||
|
|
||||||
(mx/defcs layer-group
|
(mx/defcs layer-group
|
||||||
{:mixins [mx/static mx/reactive (mx/local)]}
|
{:mixins [mx/static mx/reactive (mx/local)]}
|
||||||
[own {:keys [id] :as item} selected]
|
[{:keys [rum/local]} {:keys [id] :as item} selected]
|
||||||
(let [local (:rum/local own)
|
(let [selected? (contains? selected (:id item))
|
||||||
selected? (contains? selected (:id item))
|
|
||||||
collapsed? (:collapsed item true)
|
collapsed? (:collapsed item true)
|
||||||
shapes-map (mx/react refs/shapes-by-id)
|
shapes-map (mx/react refs/shapes-by-id)
|
||||||
classes (classnames
|
classes (classnames
|
||||||
|
@ -285,6 +281,63 @@
|
||||||
(-> (layer-simple shape selected)
|
(-> (layer-simple shape selected)
|
||||||
(mx/with-key key))))])])))
|
(mx/with-key key))))])])))
|
||||||
|
|
||||||
|
;; --- Layers Tools (Buttons Component)
|
||||||
|
|
||||||
|
(defn- allow-grouping?
|
||||||
|
"Check if the current situation allows grouping
|
||||||
|
of the currently selected shapes."
|
||||||
|
[selected shapes-map]
|
||||||
|
;; TODO: transducers
|
||||||
|
(let [xform (comp (map shapes-map)
|
||||||
|
(map :group))
|
||||||
|
groups (into #{} xform selected)]
|
||||||
|
(= 1 (count groups))))
|
||||||
|
|
||||||
|
(defn- allow-degrouping?
|
||||||
|
"Check if the current situation allows degrouping
|
||||||
|
of the currently selected shapes."
|
||||||
|
[selected shapes-map]
|
||||||
|
(let [xform (comp (map shapes-map)
|
||||||
|
(map :group))
|
||||||
|
groups (into #{} xform selected)]
|
||||||
|
(and (= 1 (count groups))
|
||||||
|
(not (nil? (first groups))))))
|
||||||
|
|
||||||
|
(mx/defc layers-tools
|
||||||
|
"Layers widget options buttons."
|
||||||
|
[selected shapes-map]
|
||||||
|
(let [duplicate #(st/emit! (uds/duplicate-selected))
|
||||||
|
group #(st/emit! (uds/group-selected))
|
||||||
|
degroup #(st/emit! (uds/degroup-selected))
|
||||||
|
delete #(st/emit! (uds/delete-selected))
|
||||||
|
|
||||||
|
allow-grouping? (allow-grouping? selected shapes-map)
|
||||||
|
allow-degrouping? (allow-degrouping? selected shapes-map)
|
||||||
|
allow-duplicate? (= 1 (count selected))
|
||||||
|
allow-deletion? (pos? (count selected))]
|
||||||
|
[:div.layers-tools
|
||||||
|
[:ul.layers-tools-content
|
||||||
|
[:li.clone-layer.tooltip.tooltip-top
|
||||||
|
{:alt "Duplicate"
|
||||||
|
:class (when-not allow-duplicate? "disable")
|
||||||
|
:on-click duplicate}
|
||||||
|
i/copy]
|
||||||
|
[:li.group-layer.tooltip.tooltip-top
|
||||||
|
{:alt "Group"
|
||||||
|
:class (when-not allow-grouping? "disable")
|
||||||
|
:on-click group}
|
||||||
|
i/folder]
|
||||||
|
[:li.degroup-layer.tooltip.tooltip-top
|
||||||
|
{:alt "Ungroup"
|
||||||
|
:class (when-not allow-degrouping? "disable")
|
||||||
|
:on-click degroup}
|
||||||
|
i/ungroup]
|
||||||
|
[:li.delete-layer.tooltip.tooltip-top
|
||||||
|
{:alt "Delete"
|
||||||
|
:class (when-not allow-deletion? "disable")
|
||||||
|
:on-click delete}
|
||||||
|
i/trash]]]))
|
||||||
|
|
||||||
;; --- Layers Toolbox (Component)
|
;; --- Layers Toolbox (Component)
|
||||||
|
|
||||||
(mx/defc layers-toolbox
|
(mx/defc layers-toolbox
|
||||||
|
@ -296,10 +349,6 @@
|
||||||
;; TODO: dont react to the whole shapes-by-id
|
;; TODO: dont react to the whole shapes-by-id
|
||||||
shapes-map (mx/react refs/shapes-by-id)
|
shapes-map (mx/react refs/shapes-by-id)
|
||||||
close #(st/emit! (udw/toggle-flag :layers))
|
close #(st/emit! (udw/toggle-flag :layers))
|
||||||
duplicate #(st/emit! (uds/duplicate-selected))
|
|
||||||
group #(st/emit! (uds/group-selected))
|
|
||||||
degroup #(st/emit! (uds/degroup-selected))
|
|
||||||
delete #(st/emit! (uds/delete-selected))
|
|
||||||
dragel (volatile! nil)]
|
dragel (volatile! nil)]
|
||||||
[:div#layers.tool-window
|
[:div#layers.tool-window
|
||||||
[:div.tool-window-bar
|
[:div.tool-window-bar
|
||||||
|
@ -315,9 +364,4 @@
|
||||||
(mx/with-key key))
|
(mx/with-key key))
|
||||||
(-> (layer-simple shape selected)
|
(-> (layer-simple shape selected)
|
||||||
(mx/with-key key))))]]
|
(mx/with-key key))))]]
|
||||||
[:div.layers-tools
|
(layers-tools selected shapes-map)]))
|
||||||
[:ul.layers-tools-content
|
|
||||||
[:li.clone-layer.tooltip.tooltip-top {:alt "Duplicate" :on-click duplicate} i/copy]
|
|
||||||
[:li.group-layer.tooltip.tooltip-top {:alt "Group" :on-click group} i/folder]
|
|
||||||
[:li.degroup-layer.tooltip.tooltip-top {:alt "Ungroup" :on-click degroup} i/ungroup]
|
|
||||||
[:li.delete-layer.tooltip.tooltip-top {:alt "Delete" :on-click delete} i/trash]]]]))
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue