mirror of
https://github.com/penpot/penpot.git
synced 2025-06-02 11:51:38 +02:00
♻️ Reorganize and improve the shortcuts machinary.
This commit is contained in:
parent
1195777036
commit
7b23a2a2b4
4 changed files with 71 additions and 88 deletions
|
@ -11,6 +11,8 @@
|
||||||
(:require
|
(:require
|
||||||
[clojure.set :as set]
|
[clojure.set :as set]
|
||||||
[beicon.core :as rx]
|
[beicon.core :as rx]
|
||||||
|
[goog.object :as gobj]
|
||||||
|
[goog.events :as events]
|
||||||
[cljs.spec.alpha :as s]
|
[cljs.spec.alpha :as s]
|
||||||
[potok.core :as ptk]
|
[potok.core :as ptk]
|
||||||
[uxbox.common.data :as d]
|
[uxbox.common.data :as d]
|
||||||
|
@ -36,7 +38,11 @@
|
||||||
[uxbox.util.time :as dt]
|
[uxbox.util.time :as dt]
|
||||||
[uxbox.util.transit :as t]
|
[uxbox.util.transit :as t]
|
||||||
[uxbox.util.uuid :as uuid]
|
[uxbox.util.uuid :as uuid]
|
||||||
[vendor.randomcolor]))
|
[uxbox.util.webapi :as wapi]
|
||||||
|
[vendor.randomcolor])
|
||||||
|
(:import goog.events.EventType
|
||||||
|
goog.events.KeyCodes
|
||||||
|
goog.ui.KeyboardShortcutHandler))
|
||||||
|
|
||||||
;; TODO: temporal workaround
|
;; TODO: temporal workaround
|
||||||
(def clear-ruler nil)
|
(def clear-ruler nil)
|
||||||
|
@ -1097,7 +1103,6 @@
|
||||||
(rx/empty))))))
|
(rx/empty))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; --- Toggle shape's selection status (selected or deselected)
|
;; --- Toggle shape's selection status (selected or deselected)
|
||||||
|
|
||||||
(defn select-shape
|
(defn select-shape
|
||||||
|
@ -1999,3 +2004,63 @@
|
||||||
pages (vec (concat before [id] after))]
|
pages (vec (concat before [id] after))]
|
||||||
(assoc-in state [:projects (:project-id page) :pages] pages)))))
|
(assoc-in state [:projects (:project-id page) :pages] pages)))))
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Shortcuts
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(def shortcuts
|
||||||
|
{"ctrl+shift+m" #(rx/of (toggle-layout-flag :sitemap))
|
||||||
|
"ctrl+shift+f" #(rx/of (toggle-layout-flag :drawtools))
|
||||||
|
"ctrl+shift+i" #(rx/of (toggle-layout-flag :icons))
|
||||||
|
"ctrl+shift+l" #(rx/of (toggle-layout-flag :layers))
|
||||||
|
"ctrl+0" #(rx/of (reset-zoom))
|
||||||
|
"ctrl+d" #(rx/of duplicate-selected)
|
||||||
|
"ctrl+z" #(rx/of undo)
|
||||||
|
"ctrl+shift+z" #(rx/of redo)
|
||||||
|
"ctrl+y" #(rx/of redo)
|
||||||
|
"ctrl+q" #(rx/of reinitialize-undo)
|
||||||
|
"ctrl+b" #(rx/of (select-for-drawing :rect))
|
||||||
|
"ctrl+e" #(rx/of (select-for-drawing :circle))
|
||||||
|
"ctrl+t" #(rx/of (select-for-drawing :text))
|
||||||
|
"ctrl+c" #(rx/of copy-selected)
|
||||||
|
"ctrl+v" #(rx/of paste)
|
||||||
|
"esc" #(rx/of :interrupt deselect-all)
|
||||||
|
"delete" #(rx/of delete-selected)
|
||||||
|
"ctrl+up" #(rx/of (vertical-order-selected :up))
|
||||||
|
"ctrl+down" #(rx/of (vertical-order-selected :down))
|
||||||
|
"ctrl+shift+up" #(rx/of (vertical-order-selected :top))
|
||||||
|
"ctrl+shift+down" #(rx/of (vertical-order-selected :bottom))
|
||||||
|
"shift+up" #(rx/of (move-selected :up true))
|
||||||
|
"shift+down" #(rx/of (move-selected :down true))
|
||||||
|
"shift+right" #(rx/of (move-selected :right true))
|
||||||
|
"shift+left" #(rx/of (move-selected :left true))
|
||||||
|
"up" #(rx/of (move-selected :up false))
|
||||||
|
"down" #(rx/of (move-selected :down false))
|
||||||
|
"right" #(rx/of (move-selected :right false))
|
||||||
|
"left" #(rx/of (move-selected :left false))})
|
||||||
|
|
||||||
|
(def initialize-shortcuts
|
||||||
|
(letfn [(initialize [sink]
|
||||||
|
(let [handler (KeyboardShortcutHandler. js/document)]
|
||||||
|
|
||||||
|
;; Register shortcuts.
|
||||||
|
(run! #(.registerShortcut handler % %) (keys shortcuts))
|
||||||
|
|
||||||
|
;; Initialize shortcut listener.
|
||||||
|
(let [event KeyboardShortcutHandler.EventType.SHORTCUT_TRIGGERED
|
||||||
|
callback #(sink (gobj/get % "identifier"))
|
||||||
|
key (events/listen handler event callback)]
|
||||||
|
(fn []
|
||||||
|
(events/unlistenByKey key)
|
||||||
|
(.clearKeyListener handler)))))]
|
||||||
|
(ptk/reify ::initialize-shortcuts
|
||||||
|
ptk/WatchEvent
|
||||||
|
(watch [_ state stream]
|
||||||
|
(let [stoper (rx/filter #(= ::finalize-shortcuts %) stream)]
|
||||||
|
(->> (rx/create initialize)
|
||||||
|
(rx/pr-log "[debug]: shortcut:")
|
||||||
|
(rx/map #(get shortcuts %))
|
||||||
|
(rx/filter fn?)
|
||||||
|
(rx/merge-map (fn [f] (f)))
|
||||||
|
(rx/take-until stoper)))))))
|
||||||
|
|
|
@ -133,7 +133,6 @@
|
||||||
|
|
||||||
translate #(translate-to-frame % ds-modifier (gpt/point (- x) (- y)))
|
translate #(translate-to-frame % ds-modifier (gpt/point (- x) (- y)))
|
||||||
]
|
]
|
||||||
|
|
||||||
[:svg {:x x :y y :width width :height height}
|
[:svg {:x x :y y :width width :height height}
|
||||||
[:& "rect" props]
|
[:& "rect" props]
|
||||||
(for [item (reverse childs)]
|
(for [item (reverse childs)]
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
[uxbox.main.ui.workspace.header :refer [header]]
|
[uxbox.main.ui.workspace.header :refer [header]]
|
||||||
[uxbox.main.ui.workspace.rules :refer [horizontal-rule vertical-rule]]
|
[uxbox.main.ui.workspace.rules :refer [horizontal-rule vertical-rule]]
|
||||||
[uxbox.main.ui.workspace.scroll :as scroll]
|
[uxbox.main.ui.workspace.scroll :as scroll]
|
||||||
[uxbox.main.ui.workspace.shortcuts :as shortcuts]
|
|
||||||
[uxbox.main.ui.workspace.sidebar :refer [left-sidebar right-sidebar]]
|
[uxbox.main.ui.workspace.sidebar :refer [left-sidebar right-sidebar]]
|
||||||
[uxbox.main.ui.workspace.sidebar.history :refer [history-dialog]]
|
[uxbox.main.ui.workspace.sidebar.history :refer [history-dialog]]
|
||||||
[uxbox.main.ui.workspace.left-toolbar :refer [left-toolbar]]
|
[uxbox.main.ui.workspace.left-toolbar :refer [left-toolbar]]
|
||||||
|
@ -119,10 +118,11 @@
|
||||||
{:fn #(st/emit! dw/initialize-layout)})
|
{:fn #(st/emit! dw/initialize-layout)})
|
||||||
|
|
||||||
(mf/use-effect
|
(mf/use-effect
|
||||||
{:deps (mf/deps file-id page-id)
|
{:deps (mf/deps file-id)
|
||||||
:fn (fn []
|
:fn (fn []
|
||||||
(let [sub (shortcuts/init)]
|
(st/emit! dw/initialize-shortcuts)
|
||||||
#(rx/cancel! sub)))})
|
#(st/emit! ::dw/finalize-shortcuts))})
|
||||||
|
|
||||||
(let [file (mf/deref refs/workspace-file)
|
(let [file (mf/deref refs/workspace-file)
|
||||||
page (mf/deref refs/workspace-page)
|
page (mf/deref refs/workspace-page)
|
||||||
layout (mf/deref refs/workspace-layout)]
|
layout (mf/deref refs/workspace-layout)]
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
;; 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) 2015-2016 Andrey Antukh <niwi@niwi.nz>
|
|
||||||
;; Copyright (c) 2015-2016 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
|
||||||
|
|
||||||
(ns uxbox.main.ui.workspace.shortcuts
|
|
||||||
(:require [goog.events :as events]
|
|
||||||
[beicon.core :as rx]
|
|
||||||
[potok.core :as ptk]
|
|
||||||
[uxbox.main.store :as st]
|
|
||||||
[uxbox.main.data.lightbox :as dl]
|
|
||||||
[uxbox.main.data.workspace :as dw])
|
|
||||||
(:import goog.events.EventType
|
|
||||||
goog.events.KeyCodes
|
|
||||||
goog.ui.KeyboardShortcutHandler))
|
|
||||||
|
|
||||||
(declare move-selected)
|
|
||||||
|
|
||||||
;; --- Shortcuts
|
|
||||||
|
|
||||||
(defonce +shortcuts+
|
|
||||||
{
|
|
||||||
;; :shift+g #(st/emit! (dw/toggle-flag :grid))
|
|
||||||
:ctrl+shift+m #(st/emit! (dw/toggle-layout-flag :sitemap))
|
|
||||||
:ctrl+shift+f #(st/emit! (dw/toggle-layout-flag :drawtools))
|
|
||||||
:ctrl+shift+i #(st/emit! (dw/toggle-layout-flag :icons))
|
|
||||||
:ctrl+shift+l #(st/emit! (dw/toggle-layout-flag :layers))
|
|
||||||
:ctrl+0 #(st/emit! (dw/reset-zoom))
|
|
||||||
;; :ctrl+r #(st/emit! (dw/toggle-flag :ruler))
|
|
||||||
:ctrl+d #(st/emit! dw/duplicate-selected)
|
|
||||||
:ctrl+z #(st/emit! dw/undo)
|
|
||||||
:ctrl+shift+z #(st/emit! dw/redo)
|
|
||||||
:ctrl+y #(st/emit! dw/redo)
|
|
||||||
:ctrl+q #(st/emit! dw/reinitialize-undo)
|
|
||||||
:ctrl+b #(st/emit! (dw/select-for-drawing :rect))
|
|
||||||
:ctrl+e #(st/emit! (dw/select-for-drawing :circle))
|
|
||||||
:ctrl+t #(st/emit! (dw/select-for-drawing :text))
|
|
||||||
:esc #(st/emit! :interrupt dw/deselect-all)
|
|
||||||
:delete #(st/emit! dw/delete-selected)
|
|
||||||
:ctrl+up #(st/emit! (dw/vertical-order-selected :up))
|
|
||||||
:ctrl+down #(st/emit! (dw/vertical-order-selected :down))
|
|
||||||
:ctrl+shift+up #(st/emit! (dw/vertical-order-selected :top))
|
|
||||||
:ctrl+shift+down #(st/emit! (dw/vertical-order-selected :bottom))
|
|
||||||
:shift+up #(st/emit! (dw/move-selected :up true))
|
|
||||||
:shift+down #(st/emit! (dw/move-selected :down true))
|
|
||||||
:shift+right #(st/emit! (dw/move-selected :right true))
|
|
||||||
:shift+left #(st/emit! (dw/move-selected :left true))
|
|
||||||
:up #(st/emit! (dw/move-selected :up false))
|
|
||||||
:down #(st/emit! (dw/move-selected :down false))
|
|
||||||
:right #(st/emit! (dw/move-selected :right false))
|
|
||||||
:left #(st/emit! (dw/move-selected :left false))
|
|
||||||
})
|
|
||||||
|
|
||||||
;; --- Shortcuts Setup Functions
|
|
||||||
|
|
||||||
(defn- watch-shortcuts
|
|
||||||
[sink]
|
|
||||||
(let [handler (KeyboardShortcutHandler. js/document)]
|
|
||||||
|
|
||||||
;; Register shortcuts.
|
|
||||||
(doseq [item (keys +shortcuts+)]
|
|
||||||
(let [identifier (name item)]
|
|
||||||
(.registerShortcut handler identifier identifier)))
|
|
||||||
|
|
||||||
;; Initialize shortcut listener.
|
|
||||||
(let [event KeyboardShortcutHandler.EventType.SHORTCUT_TRIGGERED
|
|
||||||
callback #(sink (keyword (.-identifier %)))
|
|
||||||
key (events/listen handler event callback)]
|
|
||||||
(fn []
|
|
||||||
(events/unlistenByKey key)
|
|
||||||
(.clearKeyListener handler)))))
|
|
||||||
|
|
||||||
(defn init
|
|
||||||
[]
|
|
||||||
(let [stream (->> (rx/create watch-shortcuts)
|
|
||||||
(rx/pr-log "[debug]: shortcut:"))]
|
|
||||||
(rx/on-value stream (fn [event]
|
|
||||||
(when-let [handler (get +shortcuts+ event)]
|
|
||||||
(handler))))))
|
|
Loading…
Add table
Add a link
Reference in a new issue