diff --git a/src/renderer/src/assets/icons/font_size.svg b/src/renderer/src/assets/icons/font_size.svg new file mode 100644 index 000000000..b80a6bdce --- /dev/null +++ b/src/renderer/src/assets/icons/font_size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/src/components/DiagramContextMenu.tsx b/src/renderer/src/components/DiagramContextMenu.tsx deleted file mode 100644 index cfc182aed..000000000 --- a/src/renderer/src/components/DiagramContextMenu.tsx +++ /dev/null @@ -1,167 +0,0 @@ -import React, { Fragment, useLayoutEffect, useState } from 'react'; - -import { useFloating, offset, flip, shift } from '@floating-ui/react'; -import { twMerge } from 'tailwind-merge'; - -import { ReactComponent as InitialIcon } from '@renderer/assets/icons/arrow_down_right.svg'; -import { ReactComponent as CameraIcon } from '@renderer/assets/icons/center_focus_2.svg'; -import { ReactComponent as ChoiceStateIcon } from '@renderer/assets/icons/choice_state.svg'; -import { ReactComponent as CodeAllIcon } from '@renderer/assets/icons/code_all_2.svg'; -import { ReactComponent as CopyIcon } from '@renderer/assets/icons/copy.svg'; -import { ReactComponent as DeleteIcon } from '@renderer/assets/icons/delete.svg'; -import { ReactComponent as EditIcon } from '@renderer/assets/icons/edit.svg'; -import { ReactComponent as EventIcon } from '@renderer/assets/icons/event_add.svg'; -import { ReactComponent as FinalStateIcon } from '@renderer/assets/icons/final_state.svg'; -import { ReactComponent as NoteIcon } from '@renderer/assets/icons/note.svg'; -import { ReactComponent as PasteIcon } from '@renderer/assets/icons/paste.svg'; -import { ReactComponent as StateIcon } from '@renderer/assets/icons/state_add.svg'; -import { useClickOutside } from '@renderer/hooks/useClickOutside'; -import { useDiagramContextMenu } from '@renderer/hooks/useDiagramContextMenu'; -import { getVirtualElement } from '@renderer/utils'; - -const contextData = { - copy: { - icon: , - combination: 'Ctrl+C', - }, - paste: { - icon: , - combination: 'Ctrl+V', - }, - pasteState: { - icon: , - combination: undefined, - }, - pasteFinalState: { - icon: , - combination: undefined, - }, - pasteChoiceState: { - icon: , - combination: undefined, - }, - pasteEvent: { - icon: , - combination: undefined, - }, - initialState: { - icon: , - combination: undefined, - }, - showCodeAll: { - icon: , - combination: undefined, - }, - edit: { - icon: , - combination: undefined, - }, - centerCamera: { - icon: , - combination: undefined, - }, - delete: { - icon: , - combination: 'Del', - }, - source: { - icon: undefined, - combination: undefined, - }, - target: { - icon: undefined, - combination: undefined, - }, - note: { - icon: , - combination: undefined, - }, -}; - -export const DiagramContextMenu: React.FC = () => { - const { position, items, isOpen, onClose } = useDiagramContextMenu(); - //Проверка на открытие дополнительных окон, пока реализовал таким методом, чтобы проверить и распределить данные как следует - const [openMenu, setOpenMenu] = useState(''); - - const { refs, floatingStyles } = useFloating({ - placement: 'bottom', - middleware: [offset(), flip(), shift({ padding: 5 })], - }); - - useClickOutside(refs.floating.current, onClose, !isOpen); - - // TODO(bryzZz) Два эффекта просто на синхронизацию разных состояний, нужно переделать на один источник истины - useLayoutEffect(() => { - refs.setPositionReference(getVirtualElement(position)); - }, [position, refs]); - - useLayoutEffect(() => { - setOpenMenu(''); - }, [isOpen]); - - return ( -
- {items.map(({ label, type, isFolder, children, action }, i) => ( - - - {openMenu === type && isFolder && ( - //Крайняя мера, которую я не хотел добавлять сюда, я про стили и про дублирующий код -
- {children && - children.map(({ label, action }, i) => ( - - ))} -
- )} -
- ))} -
- ); -}; diff --git a/src/renderer/src/components/DiagramContextMenu/ContextMenu.tsx b/src/renderer/src/components/DiagramContextMenu/ContextMenu.tsx new file mode 100644 index 000000000..2e19eded1 --- /dev/null +++ b/src/renderer/src/components/DiagramContextMenu/ContextMenu.tsx @@ -0,0 +1,66 @@ +import React, { ComponentProps } from 'react'; + +import { twMerge } from 'tailwind-merge'; + +import { ContextMenuContext, useContextMenuContext } from './ContextMenuContext'; + +interface ContextMenuProps { + children: React.ReactNode; + onClose: () => void; +} + +export const ContextMenu: React.FC = ({ children, onClose }) => { + return ( + +
{children}
+
+ ); +}; + +interface MenuItemProps extends ComponentProps<'div'> { + closeable?: boolean; +} +export const MenuItem: React.FC = ({ + closeable = true, + className, + onClick, + ...props +}) => { + const { onClose } = useContextMenuContext(); + + return ( +
{ + onClick?.(e); + + if (closeable) onClose(); + }} + {...props} + /> + ); +}; + +type SubMenuContainerProps = ComponentProps<'div'>; +export const SubMenuContainer: React.FC = ({ className, ...props }) => { + return
; +}; + +interface SubMenuProps extends ComponentProps<'div'> { + position: 'left' | 'right'; +} +export const SubMenu: React.FC = ({ className, position, ...props }) => { + return ( +