support mod+shift+left-click

pull/10763/head
Mega Yu 2023-07-25 11:01:50 +08:00 committed by Tienson Qin
parent cba1150e1a
commit aaf856e803
3 changed files with 83 additions and 69 deletions

View File

@ -2156,62 +2156,66 @@
shift? (gobj/get e "shiftKey")
meta? (util/meta-key? e)
forbidden-edit? (target-forbidden-edit? target)]
(when-not forbidden-edit? (.stopPropagation e))
(if (and meta?
(not (state/get-edit-input-id))
(not (dom/has-class? target "page-ref"))
(not= "A" (gobj/get target "tagName")))
(do
(util/stop e)
(let [block-dom-element (gdom/getElement block-id)]
(if (some #(= block-dom-element %) (state/get-selection-blocks))
(state/drop-selection-block! block-dom-element)
(state/conj-selection-block! block-dom-element :down)))
(if (empty? (state/get-selection-blocks))
(state/clear-selection!)
(state/set-selection-start-block! block-id)))
(when (contains? #{1 0} button)
(when-not forbidden-edit?
(cond
(and shift? (state/get-selection-start-block-or-first))
(do
(util/stop e)
(util/clear-selection!)
(editor-handler/highlight-selection-area! block-id))
(when (and (not forbidden-edit?) (contains? #{1 0} button))
(util/stop-propagation e)
(let [selection-blocks (state/get-selection-blocks)
starting-block (state/get-selection-start-block-or-first)]
(cond
(and meta? shift?)
(when-not (empty? selection-blocks)
(util/stop e)
(editor-handler/highlight-selection-area! block-id true))
shift?
(do
(util/clear-selection!)
(state/set-selection-start-block! block-id))
meta?
(do
(util/stop e)
(let [block-dom-element (gdom/getElement block-id)]
(if (some #(= block-dom-element %) selection-blocks)
(state/drop-selection-block! block-dom-element)
(state/conj-selection-block! block-dom-element :down)))
(if (empty? (state/get-selection-blocks))
(state/clear-selection!)
(state/set-selection-start-block! block-id)))
:else
(do
(editor-handler/clear-selection!)
(editor-handler/unhighlight-blocks!)
(let [f #(let [block (or (db/pull [:block/uuid (:block/uuid block)]) block)
cursor-range (some-> (gdom/getElement block-id)
(dom/by-class "block-content-wrapper")
first
util/caret-range)
{:block/keys [content format]} block
content (->> content
(property/remove-built-in-properties format)
(drawer/remove-logbook))]
;; save current editing block
(let [{:keys [value] :as state} (editor-handler/get-state)]
(editor-handler/save-block! state value))
(state/set-editing!
edit-input-id
content
block
cursor-range
false))]
;; wait a while for the value of the caret range
(if (util/ios?)
(f)
(js/setTimeout f 5))
(and shift? starting-block)
(do
(util/stop e)
(util/clear-selection!)
(editor-handler/highlight-selection-area! block-id))
(when block-id (state/set-selection-start-block! block-id)))))))))))
shift?
(do
(util/clear-selection!)
(state/set-selection-start-block! block-id))
:else
(do
(editor-handler/clear-selection!)
(editor-handler/unhighlight-blocks!)
(let [f #(let [block (or (db/pull [:block/uuid (:block/uuid block)]) block)
cursor-range (some-> (gdom/getElement block-id)
(dom/by-class "block-content-wrapper")
first
util/caret-range)
{:block/keys [content format]} block
content (->> content
(property/remove-built-in-properties format)
(drawer/remove-logbook))]
;; save current editing block
(let [{:keys [value] :as state} (editor-handler/get-state)]
(editor-handler/save-block! state value))
(state/set-editing!
edit-input-id
content
block
cursor-range
false))]
;; wait a while for the value of the caret range
(if (util/ios?)
(f)
(js/setTimeout f 5))
(state/set-selection-start-block! block-id)))))))))
(rum/defc dnd-separator-wrapper < rum/reactive
[block block-id slide? top? block-content?]

View File

@ -1226,14 +1226,19 @@
(delete-block-aux! block true))))
(defn highlight-selection-area!
[end-block]
(when-let [start-block (state/get-selection-start-block-or-first)]
(let [blocks (util/get-nodes-between-two-nodes start-block end-block "ls-block")
direction (util/get-direction-between-two-nodes start-block end-block "ls-block")
blocks (if (= :up direction)
(reverse blocks)
blocks)]
(state/exit-editing-and-set-selected-blocks! blocks direction))))
([end-block]
(highlight-selection-area! end-block false))
([end-block append?]
(when-let [start-block (state/get-selection-start-block-or-first)]
(let [blocks (util/get-nodes-between-two-nodes start-block end-block "ls-block")
direction (util/get-direction-between-two-nodes start-block end-block "ls-block")
blocks (if (= :up direction)
(reverse blocks)
blocks)]
(if append?
(do (state/clear-edit!)
(state/conj-selection-block! blocks direction))
(state/exit-editing-and-set-selected-blocks! blocks direction))))))
(defn- select-block-up-down
[direction]

View File

@ -1042,19 +1042,24 @@ Similar to re-frame subscriptions"
(and (in-selection-mode?) (seq (get-selection-blocks))))
(defn conj-selection-block!
[block direction]
(swap! state assoc
:selection/mode true
:selection/blocks (-> (conj (vec (:selection/blocks @state)) block)
util/sort-by-height
vec)
:selection/direction direction))
[block-or-blocks direction]
(let [selection-blocks (get-selection-blocks)
blocks (-> (if (sequential? block-or-blocks)
(apply conj selection-blocks block-or-blocks)
(conj selection-blocks block-or-blocks))
distinct
util/sort-by-height
vec)]
(swap! state assoc
:selection/mode true
:selection/blocks blocks
:selection/direction direction)))
(defn drop-selection-block!
[block]
(swap! state assoc
:selection/mode true
:selection/blocks (-> (filter #(not= block %) (get-selection-blocks))
:selection/blocks (-> (remove #(= block %) (get-selection-blocks))
util/sort-by-height
vec)))