Merge branch 'qcast-pub' into dev

This commit is contained in:
minsik 2024-10-28 10:05:25 +09:00
commit c70f39ec45
4 changed files with 61 additions and 21 deletions

View File

@ -1,15 +1,13 @@
'use client' 'use client'
import { useEffect, useState } from 'react' import { useEffect } from 'react'
import '@/styles/contents.scss' import '@/styles/contents.scss'
import { useRecoilState } from 'recoil'
import { contextMenuState } from '@/store/contextMenu'
export default function QContextMenu(props) { export default function QContextMenu(props) {
const { contextRef, canvasProps } = props const { contextRef, canvasProps, handleKeyup } = props
const [contextMenu, setContextMenu] = useRecoilState(contextMenuState)
// const children = useRecoilValue(modalContent)
const [contextMenu, setContextMenu] = useState({ visible: false, x: 0, y: 0 })
const activeObject = canvasProps?.getActiveObject() // const activeObject = canvasProps?.getActiveObject() //
let contextType = '' let contextType = ''
if (activeObject) { if (activeObject) {
@ -27,7 +25,7 @@ export default function QContextMenu(props) {
const handleContextMenu = (e) => { const handleContextMenu = (e) => {
// e.preventDefault() // contextmenu // e.preventDefault() // contextmenu
setContextMenu({ visible: true, x: e.pageX, y: e.pageY }) setContextMenu({ visible: true, x: e.pageX, y: e.pageY })
// console.log(111, canvasProps) document.addEventListener('keyup', (e) => handleKeyup(e))
canvasProps?.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) // canvasProps?.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) //
} }

View File

@ -23,7 +23,7 @@ export default function CanvasFrame({ plan }) {
const { canvasLoadInit, gridInit } = useCanvasConfigInitialize() const { canvasLoadInit, gridInit } = useCanvasConfigInitialize()
const currentObject = useRecoilValue(currentObjectState) const currentObject = useRecoilValue(currentObjectState)
const currentMenu = useRecoilValue(currentMenuState) const currentMenu = useRecoilValue(currentMenuState)
const { contextMenu, handleClick } = useContextMenu() const { contextMenu, handleClick, handleKeyup } = useContextMenu()
const { checkCanvasObjectEvent, checkUnsavedCanvasPlan, resetModifiedPlans } = usePlan() const { checkCanvasObjectEvent, checkUnsavedCanvasPlan, resetModifiedPlans } = usePlan()
useEvent() useEvent()
@ -55,19 +55,11 @@ export default function CanvasFrame({ plan }) {
<div className="canvas-frame"> <div className="canvas-frame">
<canvas ref={canvasRef} id="canvas" style={{ position: 'relative' }}></canvas> <canvas ref={canvasRef} id="canvas" style={{ position: 'relative' }}></canvas>
<QContextMenu contextRef={canvasRef} canvasProps={canvas}> <QContextMenu contextRef={canvasRef} canvasProps={canvas} handleKeyup={handleKeyup}>
{contextMenu.map((menus, index) => ( {contextMenu.map((menus, index) => (
<ul key={index}> <ul key={index}>
{menus.map((menu) => ( {menus.map((menu) => (
<li <li key={menu.id} onClick={(e) => handleClick(e, menu)}>
key={menu.id}
onClick={(e) => {
if (menu.fn) {
menu.fn()
}
handleClick(e, menu)
}}
>
{menu.name} {menu.name}
</li> </li>
))} ))}

View File

@ -22,6 +22,7 @@ import LinePropertySetting from '@/components/floor-plan/modal/lineProperty/Line
import FlowDirectionSetting from '@/components/floor-plan/modal/flowDirection/FlowDirectionSetting' import FlowDirectionSetting from '@/components/floor-plan/modal/flowDirection/FlowDirectionSetting'
import { useMessage } from '@/hooks/useMessage' import { useMessage } from '@/hooks/useMessage'
import { useCanvasEvent } from '@/hooks/useCanvasEvent' import { useCanvasEvent } from '@/hooks/useCanvasEvent'
import { contextMenuState } from '@/store/contextMenu'
export function useContextMenu() { export function useContextMenu() {
const currentMenu = useRecoilValue(currentMenuState) // 현재 메뉴 const currentMenu = useRecoilValue(currentMenuState) // 현재 메뉴
@ -33,6 +34,7 @@ export function useContextMenu() {
const { addPopup } = usePopup() const { addPopup } = usePopup()
const [popupId, setPopupId] = useState(uuidv4()) const [popupId, setPopupId] = useState(uuidv4())
const [gridColor, setGridColor] = useRecoilState(gridColorState) const [gridColor, setGridColor] = useRecoilState(gridColorState)
const [qContextMenu, setQContextMenu] = useRecoilState(contextMenuState)
const { handleZoomClear } = useCanvasEvent() const { handleZoomClear } = useCanvasEvent()
const currentMenuSetting = (position) => { const currentMenuSetting = (position) => {
switch (currentMenu) { switch (currentMenu) {
@ -112,15 +114,18 @@ export function useContextMenu() {
{ {
id: 'auxiliaryMove', id: 'auxiliaryMove',
name: `${getMessage('contextmenu.auxiliary.move')}(M)`, name: `${getMessage('contextmenu.auxiliary.move')}(M)`,
shortcut: ['m', 'M'],
component: <AuxiliaryMove id={popupId} />, component: <AuxiliaryMove id={popupId} />,
}, },
{ {
id: 'auxiliaryCopy', id: 'auxiliaryCopy',
name: `${getMessage('contextmenu.auxiliary.copy')}(C)`, name: `${getMessage('contextmenu.auxiliary.copy')}(C)`,
shortcut: ['c', 'C'],
component: <AuxiliaryCopy id={popupId} />, component: <AuxiliaryCopy id={popupId} />,
}, },
{ {
id: 'auxiliaryRemove', id: 'auxiliaryRemove',
shortcut: ['d', 'D'],
name: `${getMessage('contextmenu.auxiliary.remove')}(D)`, name: `${getMessage('contextmenu.auxiliary.remove')}(D)`,
}, },
{ {
@ -152,14 +157,17 @@ export function useContextMenu() {
}, },
{ {
id: 'remove', id: 'remove',
shortcut: ['d', 'D'],
name: `${getMessage('contextmenu.remove')}(D)`, name: `${getMessage('contextmenu.remove')}(D)`,
}, },
{ {
id: 'move', id: 'move',
shortcut: ['m', 'M'],
name: `${getMessage('contextmenu.move')}(M)`, name: `${getMessage('contextmenu.move')}(M)`,
}, },
{ {
id: 'copy', id: 'copy',
shortcut: ['c', 'C'],
name: `${getMessage('contextmenu.copy')}(C)`, name: `${getMessage('contextmenu.copy')}(C)`,
}, },
], ],
@ -187,11 +195,29 @@ export function useContextMenu() {
} }
const handleClick = (e, menu) => { const handleClick = (e, menu) => {
if (menu?.fn) {
menu.fn()
}
setContextPopupPosition({ setContextPopupPosition({
x: e.clientX, x: e?.clientX,
y: e.clientY, y: e?.clientY,
}) })
setCurrentContextMenu(menu) setCurrentContextMenu(menu)
setQContextMenu({ ...qContextMenu, visible: false })
}
const handleKeyup = (e) => {
let menu = null
for (let i = 0; i < contextMenu.length; i++) {
const temp = contextMenu[i].filter((menu) => {
return menu.shortcut?.includes(e.key)
})
if (temp.length > 0) menu = temp
}
handleClick(null, menu)
} }
useEffect(() => { useEffect(() => {
@ -216,14 +242,17 @@ export function useContextMenu() {
}, },
{ {
id: 'dormerRemove', id: 'dormerRemove',
shortcut: ['d', 'D'],
name: `${getMessage('contextmenu.remove')}(D)`, name: `${getMessage('contextmenu.remove')}(D)`,
}, },
{ {
id: 'dormerMove', id: 'dormerMove',
shortcut: ['m', 'M'],
name: `${getMessage('contextmenu.move')}(M)`, name: `${getMessage('contextmenu.move')}(M)`,
}, },
{ {
id: 'dormerCopy', id: 'dormerCopy',
shortcut: ['c', 'C'],
name: `${getMessage('contextmenu.copy')}(C)`, name: `${getMessage('contextmenu.copy')}(C)`,
}, },
{ {
@ -249,14 +278,17 @@ export function useContextMenu() {
}, },
{ {
id: 'roofMaterialRemove', id: 'roofMaterialRemove',
shortcut: ['d', 'D'],
name: `${getMessage('contextmenu.remove')}(D)`, name: `${getMessage('contextmenu.remove')}(D)`,
}, },
{ {
id: 'roofMaterialMove', id: 'roofMaterialMove',
shortcut: ['m', 'M'],
name: `${getMessage('contextmenu.move')}(M)`, name: `${getMessage('contextmenu.move')}(M)`,
}, },
{ {
id: 'roofMaterialCopy', id: 'roofMaterialCopy',
shortcut: ['c', 'C'],
name: `${getMessage('contextmenu.copy')}(C)`, name: `${getMessage('contextmenu.copy')}(C)`,
}, },
], ],
@ -288,14 +320,17 @@ export function useContextMenu() {
}, },
{ {
id: 'openingRemove', id: 'openingRemove',
shortcut: ['d', 'D'],
name: `${getMessage('contextmenu.remove')}(D)`, name: `${getMessage('contextmenu.remove')}(D)`,
}, },
{ {
id: 'openingMove', id: 'openingMove',
shortcut: ['m', 'M'],
name: `${getMessage('contextmenu.move')}(M)`, name: `${getMessage('contextmenu.move')}(M)`,
}, },
{ {
id: 'openingCopy', id: 'openingCopy',
shortcut: ['c', 'C'],
name: `${getMessage('contextmenu.copy')}(C)`, name: `${getMessage('contextmenu.copy')}(C)`,
}, },
{ {
@ -413,14 +448,17 @@ export function useContextMenu() {
}, },
{ {
id: 'remove', id: 'remove',
shortcut: ['d', 'D'],
name: `${getMessage('contextmenu.remove')}(D)`, name: `${getMessage('contextmenu.remove')}(D)`,
}, },
{ {
id: 'move', id: 'move',
shortcut: ['m', 'M'],
name: `${getMessage('contextmenu.move')}(M)`, name: `${getMessage('contextmenu.move')}(M)`,
}, },
{ {
id: 'copy', id: 'copy',
shortcut: ['c', 'C'],
name: `${getMessage('contextmenu.copy')}(C)`, name: `${getMessage('contextmenu.copy')}(C)`,
}, },
], ],
@ -439,5 +477,6 @@ export function useContextMenu() {
currentContextMenu, currentContextMenu,
setCurrentContextMenu, setCurrentContextMenu,
handleClick, handleClick,
handleKeyup,
} }
} }

11
src/store/contextMenu.js Normal file
View File

@ -0,0 +1,11 @@
import { atom } from 'recoil'
export const contextMenuState = atom({
key: 'contextMenuState',
default: {
visible: false,
x: 0,
y: 0,
},
dangerouslyAllowMutability: true,
})