diff --git a/frontend/src/app/main/data/workspace/grid_layout/shortcuts.cljs b/frontend/src/app/main/data/workspace/grid_layout/shortcuts.cljs new file mode 100644 index 000000000..5cb77ac72 --- /dev/null +++ b/frontend/src/app/main/data/workspace/grid_layout/shortcuts.cljs @@ -0,0 +1,74 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.main.data.workspace.grid-layout.shortcuts + (:require + [app.main.data.shortcuts :as ds] + [app.main.data.workspace :as dw] + [app.main.data.workspace.path :as drp] + [app.main.store :as st] + [beicon.core :as rx] + [potok.core :as ptk])) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Shortcuts +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Shortcuts format https://github.com/ccampbell/mousetrap + +(defn esc-pressed [] + (ptk/reify ::esc-pressed + ptk/WatchEvent + (watch [_ state _] + ;; Not interrupt when we're editing a path + (let [edition-id (or (get-in state [:workspace-drawing :object :id]) + (get-in state [:workspace-local :edition])) + path-edit-mode (get-in state [:workspace-local :edit-path edition-id :edit-mode])] + (if-not (= :draw path-edit-mode) + (rx/of :interrupt) + (rx/empty)))))) + +(def shortcuts + { + + :escape {:tooltip (ds/esc) + :command ["escape" "enter" "v"] + :fn #(st/emit! (esc-pressed))} + + :undo {:tooltip (ds/meta "Z") + :command (ds/c-mod "z") + :fn #(st/emit! (drp/undo-path))} + + :redo {:tooltip (ds/meta "Y") + :command [(ds/c-mod "shift+z") (ds/c-mod "y")] + :fn #(st/emit! (drp/redo-path))} + + ;; ZOOM + + :increase-zoom {:tooltip "+" + :command "+" + :fn #(st/emit! (dw/increase-zoom nil))} + + :decrease-zoom {:tooltip "-" + :command "-" + :fn #(st/emit! (dw/decrease-zoom nil))} + + :reset-zoom {:tooltip (ds/shift "0") + :command "shift+0" + :fn #(st/emit! dw/reset-zoom)} + + :fit-all {:tooltip (ds/shift "1") + :command "shift+1" + :fn #(st/emit! dw/zoom-to-fit-all)} + + :zoom-selected {:tooltip (ds/shift "2") + :command "shift+2" + :fn #(st/emit! dw/zoom-to-selected-shape)} + }) + +(defn get-tooltip [shortcut] + (assert (contains? shortcuts shortcut) (str shortcut)) + (get-in shortcuts [shortcut :tooltip])) diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 08f9fdc18..34b4948d9 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -267,7 +267,7 @@ (hooks/setup-keyboard alt? mod? space? z? shift?) (hooks/setup-hover-shapes page-id move-stream base-objects transform selected mod? hover hover-ids hover-top-frame-id @hover-disabled? focus zoom show-measures?) (hooks/setup-viewport-modifiers modifiers base-objects) - (hooks/setup-shortcuts node-editing? drawing-path? text-editing?) + (hooks/setup-shortcuts node-editing? drawing-path? text-editing? grid-editing?) (hooks/setup-active-frames base-objects hover-ids selected active-frames zoom transform vbox) [:div.viewport {:style #js {"--zoom" zoom}} diff --git a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs index 8e0fa07c3..3f863cd25 100644 --- a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs @@ -17,6 +17,7 @@ [app.common.uuid :as uuid] [app.main.data.shortcuts :as dsc] [app.main.data.workspace :as dw] + [app.main.data.workspace.grid-layout.shortcuts :as gsc] [app.main.data.workspace.path.shortcuts :as psc] [app.main.data.workspace.shortcuts :as wsc] [app.main.data.workspace.text.shortcuts :as tsc] @@ -359,15 +360,19 @@ ;; this shortcuts outside the viewport? (defn setup-shortcuts - [path-editing? drawing-path? text-editing?] + [path-editing? drawing-path? text-editing? grid-editing?] (hooks/use-shortcuts ::workspace wsc/shortcuts) (mf/use-effect - (mf/deps path-editing? drawing-path?) + (mf/deps path-editing? drawing-path? grid-editing?) (fn [] (cond + grid-editing? + (do (st/emit! (dsc/push-shortcuts ::grid gsc/shortcuts)) + #(st/emit! (dsc/pop-shortcuts ::grid))) (or drawing-path? path-editing?) (do (st/emit! (dsc/push-shortcuts ::path psc/shortcuts)) #(st/emit! (dsc/pop-shortcuts ::path))) text-editing? (do (st/emit! (dsc/push-shortcuts ::text tsc/shortcuts)) #(st/emit! (dsc/pop-shortcuts ::text))))))) +