import React, { useEffect, useMemo, useState } from 'react' import * as Menubar from '@radix-ui/react-menubar' import { CheckIcon, DotFilledIcon } from '@radix-ui/react-icons' import classes from './styles.module.css' import { BodyEditor } from '../../editor' import i18n, { IsChina } from '../../i18n' import { Helper } from '../../environments/online/helper' import { uploadImage } from '../../utils/transfer' import { getCurrentTime } from '../../utils/time' import useForceUpdate from '../../hooks/useFoceUpdate' import classNames from 'classnames' import { useLanguageSelect } from '../../hooks' import { ShowContextMenu } from '../ContextMenu' import { ShowDialog } from '../Dialog' import { SetCDNBase } from '../../utils/detect' const { MenubarRoot, MenubarTrigger, MenubarContent, MenubarItem, MenubarCheckboxItem, MenubarRadioItem, MenubarItemIndicator, MenubarSeparator, RightSlot, Blue, inset, } = classes const MenubarDemo: React.FC<{ editor: BodyEditor onChangeBackground: (url: string) => void onScreenShot: (data: Record) => void style?: React.CSSProperties }> = ({ editor, onChangeBackground, onScreenShot, style }) => { const forceUpdate = useForceUpdate() const helper = useMemo(() => new Helper(editor), [editor]) const { current, changeLanguage, languagList } = useLanguageSelect() useEffect(() => { const show = (data: { mouseX: number; mouseY: number }) => { ShowContextMenu({ ...data, editor, onChangeBackground }) } editor?.ContextMenuEventManager.AddEventListener(show) return () => { editor?.ContextMenuEventManager.RemoveEventListener(show) } }, [editor]) return ( {i18n.t('File')} editor.ResetScene()} > {i18n.t('Reset Scene')} editor.LoadScene()} > {i18n.t('Load Scene')} editor.SaveScene()} > {i18n.t('Save Scene')} helper.LoadGesture()} > {i18n.t('Load Gesture')} helper.SaveGesture()} > {i18n.t('Save Gesture')} { helper.GenerateSceneURL() }} > {i18n.t('Generate Scene URL')} editor.RestoreLastSavedScene()} > {i18n.t('Restore Last Scene')} helper.DetectFromImage(onChangeBackground) } > {i18n.t('Detect From Image')} {IsChina() ? ( { SetCDNBase(false) helper.DetectFromImage(onChangeBackground) }} > {i18n.t('Detect From Image') + ' [中国]'} ) : undefined} helper.SetRandomPose()} > {i18n.t('Set Random Pose')} { const image = await uploadImage() if (image) onChangeBackground(image) }} > {i18n.t('Set Background Image')} v{__APP_VERSION__} {i18n.t('Edit')} editor.Undo()} > {i18n.t('Undo')}
⌘ Z
editor.Redo()} > {i18n.t('Redo')}
⇧ ⌘ Z
editor.CopySelectedBody()} > {i18n.t('Duplicate Skeleton')}
⇧ D
editor.RemoveBody()} > {i18n.t('Delete Skeleton')}
{i18n.t('Del')}
{i18n.t('View')} { editor.LockView() }} > {i18n.t('Lock View')} { editor.UnlockView() }} > {i18n.t('Unlock View')} { editor.RestoreView() }} > {i18n.t('Restore View')} {i18n.t('Setting')} { editor.MoveMode = !editor.MoveMode forceUpdate() }} > {i18n.t('Move Mode')} { editor.FreeMode = !editor.FreeMode forceUpdate() }} > {i18n.t('Free Mode')} { editor.OnlyHand = !editor.OnlyHand forceUpdate() }} > {i18n.t('Only Hand')} { editor.enablePreview = !editor.enablePreview forceUpdate() }} > {i18n.t('Show Preview')} { editor.EnableHelper = !editor.EnableHelper forceUpdate() }} > {i18n.t('Show Grid')} {i18n.t('Feedback')} { helper.FeedbackByGithub() }} > Github { helper.FeedbackByQQ() }} > QQ Language { changeLanguage(v) }} > {languagList.map((item) => ( {item} ))} { const image = editor.MakeImages() const result = Object.fromEntries( Object.entries(image).map(([name, imgData]) => [ name, { src: imgData, title: name + '_' + getCurrentTime(), }, ]) ) onScreenShot(result) }} > {i18n.t('Generate')}
) } export default MenubarDemo