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 {
|
||||
pointer-events: none;
|
||||
|
||||
svg {
|
||||
cursor: auto;
|
||||
|
|
|
@ -86,15 +86,13 @@
|
|||
:text i/text
|
||||
:group i/folder))
|
||||
|
||||
|
||||
;; --- Shape Name (Component)
|
||||
|
||||
(mx/defcs shape-name
|
||||
"A generic component that displays the shape name
|
||||
if it is available and allows inline edition of it."
|
||||
{:mixins [mx/static (mx/local)]}
|
||||
[own shape]
|
||||
(let [local (:rum/local own)]
|
||||
[{:keys [rum/local]} shape]
|
||||
(letfn [(on-blur [event]
|
||||
(let [target (dom/event->target event)
|
||||
parent (.-parentNode target)
|
||||
|
@ -121,18 +119,17 @@
|
|||
:default-value (:name shape "")}]
|
||||
[:span.element-name
|
||||
{:on-double-click on-click}
|
||||
(:name shape "")]))))
|
||||
(:name shape "")])))
|
||||
|
||||
;; --- Layer Simple (Component)
|
||||
|
||||
(mx/defcs layer-simple
|
||||
{:mixins [mx/static (mx/local)]}
|
||||
[own item selected]
|
||||
[{:keys [rum/local]} item selected]
|
||||
(let [selected? (contains? selected (:id item))
|
||||
select #(select-shape selected item %)
|
||||
toggle-visibility #(toggle-visibility selected item %)
|
||||
toggle-blocking #(toggle-blocking item %)
|
||||
local (:rum/local own)
|
||||
classes (classnames
|
||||
:selected selected?
|
||||
:drag-active (:dragging @local)
|
||||
|
@ -197,9 +194,8 @@
|
|||
|
||||
(mx/defcs layer-group
|
||||
{:mixins [mx/static mx/reactive (mx/local)]}
|
||||
[own {:keys [id] :as item} selected]
|
||||
(let [local (:rum/local own)
|
||||
selected? (contains? selected (:id item))
|
||||
[{:keys [rum/local]} {:keys [id] :as item} selected]
|
||||
(let [selected? (contains? selected (:id item))
|
||||
collapsed? (:collapsed item true)
|
||||
shapes-map (mx/react refs/shapes-by-id)
|
||||
classes (classnames
|
||||
|
@ -285,6 +281,63 @@
|
|||
(-> (layer-simple shape selected)
|
||||
(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)
|
||||
|
||||
(mx/defc layers-toolbox
|
||||
|
@ -296,10 +349,6 @@
|
|||
;; TODO: dont react to the whole shapes-by-id
|
||||
shapes-map (mx/react refs/shapes-by-id)
|
||||
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)]
|
||||
[:div#layers.tool-window
|
||||
[:div.tool-window-bar
|
||||
|
@ -315,9 +364,4 @@
|
|||
(mx/with-key key))
|
||||
(-> (layer-simple shape selected)
|
||||
(mx/with-key key))))]]
|
||||
[:div.layers-tools
|
||||
[: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]]]]))
|
||||
(layers-tools selected shapes-map)]))
|
||||
|
|
Loading…
Add table
Reference in a new issue