Add select layer to contest menu

This commit is contained in:
Eva 2022-01-24 09:59:58 +01:00 committed by Andrés Moya
parent 3482d6c303
commit 406c4063de
9 changed files with 204 additions and 105 deletions

View file

@ -4,10 +4,11 @@
### :sparkles: New features ### :sparkles: New features
- Add select layer option to context menu [Taiga #2474](https://tree.taiga.io/project/penpot/us/2474).
- Guides [Taiga #290](https://tree.taiga.io/project/penpot/us/290?milestone=307334) - Guides [Taiga #290](https://tree.taiga.io/project/penpot/us/290?milestone=307334)
- Improve file menu by adding semantically groups [Github #1203](https://github.com/penpot/penpot/issues/1203). - Improve file menu by adding semantically groups [Github #1203](https://github.com/penpot/penpot/issues/1203).
- Add update components in bulk option in context menu [Taiga #1975](https://tree.taiga.io/project/penpot/us/1975). - Add update components in bulk option in context menu [Taiga #1975](https://tree.taiga.io/project/penpot/us/1975).
- Create e2e tests for drawing basic fors [Taiga #2608](https://tree.taiga.io/project/penpot/task/2608). - Create e2e tests for drawing basic shapes [Taiga #2608](https://tree.taiga.io/project/penpot/task/2608).
- Create firsts e2e test [Taiga #2608](https://tree.taiga.io/project/penpot/task/2608). - Create firsts e2e test [Taiga #2608](https://tree.taiga.io/project/penpot/task/2608).
## 1.11.0-beta ## 1.11.0-beta

View file

@ -34,11 +34,11 @@
margin: 2px; margin: 2px;
} }
span:first-child { span {
color: $color-gray-60; color: $color-gray-60;
} }
span:last-child { span.shortcut {
color: $color-gray-20; color: $color-gray-20;
font-size: $fs12; font-size: $fs12;
} }
@ -57,6 +57,40 @@
} }
} }
} }
.sub-menu-item {
display: flex;
justify-content: flex-start;
&:hover {
background-color: $color-primary-lighter;
}
span.title {
margin-left: 5px;
}
.selected-icon {
svg {
width: 10px;
height: 10px;
}
}
.shape-icon {
margin-left: 3px;
svg {
width: 13px;
height: 13px;
}
}
.icon-wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
margin: 0;
}
}
} }
.workspace-loader { .workspace-loader {

View file

@ -152,6 +152,12 @@
(def current-hover (def current-hover
(l/derived :hover workspace-local)) (l/derived :hover workspace-local))
(def context-menu
(l/derived :context-menu workspace-local))
(def current-hover-ids
(l/derived :hover-ids context-menu))
(def editors (def editors
(l/derived :editors workspace-local)) (l/derived :editors workspace-local))

View file

@ -13,6 +13,7 @@
[app.main.data.workspace :as dw] [app.main.data.workspace :as dw]
[app.main.data.workspace.interactions :as dwi] [app.main.data.workspace.interactions :as dwi]
[app.main.data.workspace.libraries :as dwl] [app.main.data.workspace.libraries :as dwl]
[app.main.data.workspace.selection :as dws]
[app.main.data.workspace.shortcuts :as sc] [app.main.data.workspace.shortcuts :as sc]
[app.main.refs :as refs] [app.main.refs :as refs]
[app.main.store :as st] [app.main.store :as st]
@ -33,8 +34,33 @@
(dom/prevent-default event) (dom/prevent-default event)
(dom/stop-propagation event)) (dom/stop-propagation event))
(mf/defc element-icon
[{:keys [shape] :as props}]
(case (:type shape)
:frame i/artboard
:image i/image
:line i/line
:circle i/circle
:path i/curve
:rect i/box
:text i/text
:group (if (some? (:component-id shape))
i/component
(if (:masked-group? shape)
i/mask
i/folder))
:bool (case (:bool-type shape)
:difference i/bool-difference
:exclude i/bool-exclude
:intersection i/bool-intersection
#_:default i/bool-union)
:svg-raw i/file-svg
nil))
(mf/defc menu-entry (mf/defc menu-entry
[{:keys [title shortcut on-click children] :as props}] [{:keys [title shortcut on-click children selected has-icon? shape] :as props}]
(let [submenu-ref (mf/use-ref nil) (let [submenu-ref (mf/use-ref nil)
hovering? (mf/use-ref false) hovering? (mf/use-ref false)
@ -64,6 +90,17 @@
(when (and (some? dom) (some? submenu-node)) (when (and (some? dom) (some? submenu-node))
(dom/set-css-property! submenu-node "top" (str (.-offsetTop dom) "px"))))))] (dom/set-css-property! submenu-node "top" (str (.-offsetTop dom) "px"))))))]
(if has-icon?
[:li.sub-menu-item {:ref set-dom-node
:on-click on-click
:on-pointer-enter on-pointer-enter
:on-pointer-leave on-pointer-leave}
(when has-icon?
[:span.icon-wrapper
(if selected [:span.selected-icon i/tick]
[:span.selected-icon])
[:span.shape-icon (element-icon {:shape shape})]])
[:span.title title]]
[:li {:ref set-dom-node [:li {:ref set-dom-node
:on-click on-click :on-click on-click
:on-pointer-enter on-pointer-enter :on-pointer-enter on-pointer-enter
@ -79,7 +116,7 @@
{:ref submenu-ref {:ref submenu-ref
:style {:display "none" :left 250} :style {:display "none" :left 250}
:on-context-menu prevent-default} :on-context-menu prevent-default}
children])])) children])])))
(mf/defc menu-separator (mf/defc menu-separator
[] []
@ -108,12 +145,21 @@
[:& menu-separator]])) [:& menu-separator]]))
(mf/defc context-menu-layer-position (mf/defc context-menu-layer-position
[] [{:keys [hover-objs shapes]}]
(let [do-bring-forward (st/emitf (dw/vertical-order-selected :up)) (let [do-bring-forward (st/emitf (dw/vertical-order-selected :up))
do-bring-to-front (st/emitf (dw/vertical-order-selected :top)) do-bring-to-front (st/emitf (dw/vertical-order-selected :top))
do-send-backward (st/emitf (dw/vertical-order-selected :down)) do-send-backward (st/emitf (dw/vertical-order-selected :down))
do-send-to-back (st/emitf (dw/vertical-order-selected :bottom))] do-send-to-back (st/emitf (dw/vertical-order-selected :bottom))
select-shapes (fn [id] (st/emitf (dws/select-shape id)))]
[:* [:*
(when (> (count hover-objs) 1)
[:& menu-entry {:title (tr "workspace.shape.menu.select-layer")}
(for [object hover-objs]
[:& menu-entry {:title (:name object)
:selected (some #(= object %) shapes)
:on-click (select-shapes (:id object))
:has-icon? true
:shape object}])])
[:& menu-entry {:title (tr "workspace.shape.menu.forward") [:& menu-entry {:title (tr "workspace.shape.menu.forward")
:shortcut (sc/get-tooltip :bring-forward) :shortcut (sc/get-tooltip :bring-forward)
:on-click do-bring-forward}] :on-click do-bring-forward}]
@ -392,8 +438,11 @@
[{:keys [mdata] :as props}] [{:keys [mdata] :as props}]
(let [{:keys [disable-booleans? disable-flatten?]} mdata (let [{:keys [disable-booleans? disable-flatten?]} mdata
shapes (mf/deref refs/selected-objects) shapes (mf/deref refs/selected-objects)
hover-ids (mf/deref refs/current-hover-ids)
hover-objs (mf/deref (refs/objects-by-id hover-ids))
props #js {:shapes shapes props #js {:shapes shapes
:hover-objs hover-objs
:disable-booleans? disable-booleans? :disable-booleans? disable-booleans?
:disable-flatten? disable-flatten?}] :disable-flatten? disable-flatten?}]
(when-not (empty? shapes) (when-not (empty? shapes)

View file

@ -115,7 +115,7 @@
text-editing? (and edition (= :text (get-in base-objects [edition :type]))) text-editing? (and edition (= :text (get-in base-objects [edition :type])))
on-click (actions/on-click hover selected edition drawing-path? drawing-tool) on-click (actions/on-click hover selected edition drawing-path? drawing-tool)
on-context-menu (actions/on-context-menu hover) on-context-menu (actions/on-context-menu hover hover-ids)
on-double-click (actions/on-double-click hover hover-ids drawing-path? base-objects edition) on-double-click (actions/on-double-click hover hover-ids drawing-path? base-objects edition)
on-drag-enter (actions/on-drag-enter) on-drag-enter (actions/on-drag-enter)
on-drag-over (actions/on-drag-over) on-drag-over (actions/on-drag-over)

View file

@ -186,9 +186,9 @@
(dw/start-editing-selected)))))))) (dw/start-editing-selected))))))))
(defn on-context-menu (defn on-context-menu
[hover] [hover hover-ids]
(mf/use-callback (mf/use-callback
(mf/deps @hover) (mf/deps @hover @hover-ids)
(fn [event] (fn [event]
(when (or (dom/class? (dom/get-target event) "viewport-controls") (when (or (dom/class? (dom/get-target event) "viewport-controls")
(dom/class? (dom/get-target event) "viewport-selrect")) (dom/class? (dom/get-target event) "viewport-selrect"))
@ -200,18 +200,19 @@
#(st/emit! #(st/emit!
(if (some? @hover) (if (some? @hover)
(dw/show-shape-context-menu {:position position (dw/show-shape-context-menu {:position position
:shape @hover}) :shape @hover
:hover-ids @hover-ids})
(dw/show-context-menu {:position position}))))))))) (dw/show-context-menu {:position position})))))))))
(defn on-menu-selected (defn on-menu-selected
[hover hover-ids selected] [hover hover-ids selected]
(mf/use-callback (mf/use-callback
(mf/deps @hover hover-ids selected) (mf/deps @hover @hover-ids selected)
(fn [event] (fn [event]
(dom/prevent-default event) (dom/prevent-default event)
(dom/stop-propagation event) (dom/stop-propagation event)
(let [position (dom/get-client-position event)] (let [position (dom/get-client-position event)]
(st/emit! (dw/show-shape-context-menu {:position position})))))) (st/emit! (dw/show-shape-context-menu {:position position :hover-ids @hover-ids}))))))
(defn on-mouse-up (defn on-mouse-up
[disable-paste] [disable-paste]

View file

@ -3162,6 +3162,10 @@ msgstr "Flip vertical"
msgid "workspace.shape.menu.flow-start" msgid "workspace.shape.menu.flow-start"
msgstr "Flow start" msgstr "Flow start"
#: src/app/main/ui/workspace/context_menu.cljs
msgid "workspace.shape.menu.select-layer"
msgstr "Select layer"
#: src/app/main/ui/workspace/context_menu.cljs #: src/app/main/ui/workspace/context_menu.cljs
msgid "workspace.shape.menu.forward" msgid "workspace.shape.menu.forward"
msgstr "Bring forward" msgstr "Bring forward"

View file

@ -3175,6 +3175,10 @@ msgstr "Voltear vertical"
msgid "workspace.shape.menu.flow-start" msgid "workspace.shape.menu.flow-start"
msgstr "Inicio de flujo" msgstr "Inicio de flujo"
#: src/app/main/ui/workspace/context_menu.cljs
msgid "workspace.shape.menu.select-layer"
msgstr "Seleccionar capa"
#: src/app/main/ui/workspace/context_menu.cljs #: src/app/main/ui/workspace/context_menu.cljs
msgid "workspace.shape.menu.forward" msgid "workspace.shape.menu.forward"
msgstr "Mover hacia delante" msgstr "Mover hacia delante"