Merge branch 'qcast-pub' into dev
This commit is contained in:
commit
c70f39ec45
@ -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) //한번 노출 후 이벤트 삭제
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@ -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
11
src/store/contextMenu.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { atom } from 'recoil'
|
||||||
|
|
||||||
|
export const contextMenuState = atom({
|
||||||
|
key: 'contextMenuState',
|
||||||
|
default: {
|
||||||
|
visible: false,
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
},
|
||||||
|
dangerouslyAllowMutability: true,
|
||||||
|
})
|
||||||
Loading…
x
Reference in New Issue
Block a user