From 5e6f177132eb7ab1b62e54c680a6ec606e533f84 Mon Sep 17 00:00:00 2001 From: codetypes Date: Sat, 27 Apr 2024 13:20:15 +0800 Subject: [PATCH] key enter to trigger next result --- src/components/editor.tsx | 205 ++++++++++++++++++++------------------ 1 file changed, 106 insertions(+), 99 deletions(-) diff --git a/src/components/editor.tsx b/src/components/editor.tsx index ed02aad..a23df25 100644 --- a/src/components/editor.tsx +++ b/src/components/editor.tsx @@ -8,6 +8,7 @@ import { import { NodeModel, TreeGraphData, TreeModel } from "@/misc/b3type"; import * as b3util from "@/misc/b3util"; import { message } from "@/misc/hooks"; +import i18n from "@/misc/i18n"; import { Hotkey, isHotkeyPressed, isMacos, useHotkeys } from "@/misc/keys"; import Path from "@/misc/path"; import { ArrowDownOutlined, ArrowUpOutlined, CloseOutlined } from "@ant-design/icons"; @@ -21,8 +22,7 @@ import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from "re import { useTranslation } from "react-i18next"; import { FiDelete } from "react-icons/fi"; import { IoMdReturnLeft } from "react-icons/io"; -import { PiCubeFocus } from "react-icons/pi"; -import { RiFocus3Fill, RiFocus3Line } from "react-icons/ri"; +import { RiFocus3Line } from "react-icons/ri"; import { VscCaseSensitive } from "react-icons/vsc"; import { mergeRefs } from "react-merge-refs"; import { useDebounceCallback } from "usehooks-ts"; @@ -33,6 +33,86 @@ export interface EditorProps extends React.HTMLAttributes { onUpdate: () => void; } +const createMenu = () => { + const t = i18n.t; + const MenuItem: FC = (itemProps) => { + return ( + + ); + }; + + const arr: MenuProps["items"] = [ + { + label: ( + +
{t("copy")}
+
{isMacos ? "⌘ C" : "Ctrl+C"}
+
+ ), + key: "copy", + }, + { + label: ( + +
{t("paste")}
+
{isMacos ? "⌘ V" : "Ctrl+V"}
+
+ ), + key: "paste", + }, + { + label: ( + +
{t("replace")}
+
{isMacos ? "⇧ ⌘ V" : "Ctrl+Shift+V"}
+
+ ), + key: "replace", + }, + { + label: ( + +
{t("insertNode")}
+
{isMacos ? : "Enter"}
+
+ ), + key: "insert", + }, + { + label: ( + +
{t("deleteNode")}
+
{isMacos ? : "Backspace"}
+
+ ), + key: "delete", + }, + { + label: ( + +
{t("editSubtree")}
+
+
+ ), + key: "editSubtree", + }, + { + label: ( + +
{t("saveAsSubtree")}
+
+
+ ), + key: "saveAsSubtree", + }, + ]; + return arr; +}; + export const Editor: FC = ({ onUpdate: updateState, data: editor, ...props }) => { const workspace = { editing: useWorkspace((state) => state.editing), @@ -48,6 +128,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const sizeRef = useRef(null); const editorSize = useSize(sizeRef); const { t } = useTranslation(); + const menuItems = useMemo(() => createMenu(), [t]); const onSearchChange = useDebounceCallback((filter: string) => { const ids = filterNodes(filter, findDataById("1")); @@ -465,7 +546,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . message.warning(t("node.noNodeSelected")); return; } - const d1 = findDataById(editor.selectedId); + const data = findSubtree(findDataById(editor.selectedId)); if (data?.path) { const path = `${workspace.workdir}/${data.path}`; @@ -901,85 +982,6 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . } }, [workspace.editing]); - const menuItems = useMemo(() => { - const MenuItem: FC = (itemProps) => { - return ( - - ); - }; - - const arr: MenuProps["items"] = [ - { - label: ( - -
{t("copy")}
-
{isMacos ? "⌘ C" : "Ctrl+C"}
-
- ), - key: "copy", - }, - { - label: ( - -
{t("paste")}
-
{isMacos ? "⌘ V" : "Ctrl+V"}
-
- ), - key: "paste", - }, - { - label: ( - -
{t("replace")}
-
{isMacos ? "⇧ ⌘ V" : "Ctrl+Shift+V"}
-
- ), - key: "replace", - }, - { - label: ( - -
{t("insertNode")}
-
{isMacos ? : "Enter"}
-
- ), - key: "insert", - }, - { - label: ( - -
{t("deleteNode")}
-
{isMacos ? : "Backspace"}
-
- ), - key: "delete", - }, - { - label: ( - -
{t("editSubtree")}
-
-
- ), - key: "editSubtree", - }, - { - label: ( - -
{t("saveAsSubtree")}
-
-
- ), - key: "saveAsSubtree", - }, - ]; - return arr; - }, [t]); - useEffect(() => { if (editor.graph) { editor.graph.changeData(editor.data); @@ -993,6 +995,25 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . editor.dispatch(info.key as EditEvent); }, []); + const nextResult = () => { + if (results.length > 0) { + const idx = (resultIndex + 1) % results.length; + setResultIndex(idx); + editor.graph.focusItem(results[idx]); + selectNode(results[idx]); + } + }; + + const prevResult = () => { + if (results.length > 0) { + const idx = (resultIndex + results.length - 1) % results.length; + setResultIndex(idx); + console.log(idx, results[idx]); + editor.graph.focusItem(results[idx]); + selectNode(results[idx]); + } + }; + return (
= ({ onUpdate: updateState, data: editor, . paddingRight: "2px", }} onChange={(e) => onSearchChange(e.currentTarget.value)} + onKeyDown={(e) => e.code === Hotkey.Enter && nextResult()} suffix={