Merge branch 'qcast-pub' into dev

This commit is contained in:
minsik 2024-11-06 16:12:35 +09:00
commit 6bcc81a088
9 changed files with 39 additions and 28 deletions

View File

@ -52,7 +52,7 @@ export default function ColorPickerModal(props) {
closePopup(id, isConfig) closePopup(id, isConfig)
}} }}
> >
{getMessage('common.message.save')} {getMessage('modal.common.save')}
</button> </button>
</div> </div>
</div> </div>

View File

@ -1,16 +1,20 @@
'use client' 'use client'
import { useEffect } from 'react' import { useEffect } from 'react'
import '@/styles/contents.scss' import '@/styles/contents.scss'
import { useRecoilState } from 'recoil' import { useRecoilState, useRecoilValue } from 'recoil'
import { contextMenuListState, contextMenuState } from '@/store/contextMenu' import { contextMenuListState, contextMenuState } from '@/store/contextMenu'
import { useTempGrid } from '@/hooks/useTempGrid' import { useTempGrid } from '@/hooks/useTempGrid'
import { useContextMenu } from '@/hooks/useContextMenu'
import { useEvent } from '@/hooks/useEvent'
export default function QContextMenu(props) { export default function QContextMenu(props) {
const { contextRef, canvasProps, handleKeyup } = props const { contextRef, canvasProps } = props
const [contextMenu, setContextMenu] = useRecoilState(contextMenuState) const [contextMenu, setContextMenu] = useRecoilState(contextMenuState)
const [contextMenuList, setContextMenuList] = useRecoilState(contextMenuListState) const contextMenuList = useRecoilValue(contextMenuListState)
const activeObject = canvasProps?.getActiveObject() // const activeObject = canvasProps?.getActiveObject() //
const { tempGridMode, setTempGridMode } = useTempGrid() const { tempGridMode, setTempGridMode } = useTempGrid()
const { handleKeyup } = useContextMenu()
const { addDocumentEventListener, removeDocumentEvent } = useEvent()
let contextType = '' let contextType = ''
@ -22,13 +26,13 @@ export default function QContextMenu(props) {
} }
} }
} }
const getYPosition = (e) => { const getYPosition = (e) => {
const contextLength = contextMenuList.reduce((acc, cur, index) => { const contextLength = contextMenuList.reduce((acc, cur, index) => {
return acc + cur.length return acc + cur.length
}, 0) }, 0)
return e?.clientY - (contextLength * 25 + contextMenuList.length * 2 * 17) return e?.clientY - (contextLength * 25 + contextMenuList.length * 2 * 17)
} }
useEffect(() => { useEffect(() => {
if (!contextRef.current) return if (!contextRef.current) return
@ -40,7 +44,7 @@ export default function QContextMenu(props) {
y: window.innerHeight / 2 < e.pageY ? getYPosition(e) : e.pageY, y: window.innerHeight / 2 < e.pageY ? getYPosition(e) : e.pageY,
} }
setContextMenu({ visible: true, ...position }) setContextMenu({ visible: true, ...position })
document.addEventListener('keyup', (e) => handleKeyup(e)) addDocumentEventListener('keyup', document, handleKeyup)
canvasProps?.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) // canvasProps?.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) //
} }
@ -51,8 +55,9 @@ export default function QContextMenu(props) {
const handleOutsideClick = (e) => { const handleOutsideClick = (e) => {
// e.preventDefault() // e.preventDefault()
if (contextMenu.visible && !ref.current.contains(e.target)) { if (contextMenu.visible) {
setContextMenu({ ...contextMenu, visible: false }) setContextMenu({ ...contextMenu, visible: false })
removeDocumentEvent('keyup')
} }
} }
@ -61,10 +66,11 @@ export default function QContextMenu(props) {
document.addEventListener('click', handleOutsideClick) document.addEventListener('click', handleOutsideClick)
return () => { return () => {
removeDocumentEvent('keyup')
document.removeEventListener('click', handleClick) document.removeEventListener('click', handleClick)
document.removeEventListener('click', handleOutsideClick) document.removeEventListener('click', handleOutsideClick)
} }
}, [contextRef, contextMenu]) }, [contextRef, contextMenuList])
const handleObjectMove = () => { const handleObjectMove = () => {
activeObject.set({ activeObject.set({

View File

@ -1,18 +1,18 @@
'use client' 'use client'
import { useEffect, useState } from 'react' import { useState } from 'react'
import Draggable from 'react-draggable' import Draggable from 'react-draggable'
export default function WithDraggable({ isShow, children, pos, handle = '' }) { export default function WithDraggable({ isShow, children, pos = { x: 0, y: 0 }, handle = '' }) {
const [position, setPosition] = useState({ x: 0, y: 0 }) const [position, setPosition] = useState(pos)
const handleOnDrag = (e, data) => { const handleOnDrag = (e, data) => {
e.stopPropagation() e.stopPropagation()
setPosition({ x: data.x, y: data.y }) setPosition({ x: data.x, y: data.y })
} }
useEffect(() => { // useEffect(() => {
setPosition({ ...pos }) // setPosition({ ...pos })
}, []) // }, [])
return ( return (
<> <>

View File

@ -1,10 +1,10 @@
'use client' 'use client'
import { useRecoilState } from 'recoil' import { useRecoilValue } from 'recoil'
import { popupState } from '@/store/popupAtom' import { popupState } from '@/store/popupAtom'
import { Fragment } from 'react' import { Fragment } from 'react'
export default function PopupManager() { export default function PopupManager() {
const [popup, setPopup] = useRecoilState(popupState) const popup = useRecoilValue(popupState)
return [ return [
...popup?.config.map((child) => <Fragment key={child.id}>{child.component}</Fragment>), ...popup?.config.map((child) => <Fragment key={child.id}>{child.component}</Fragment>),

View File

@ -19,7 +19,7 @@ export default function CanvasFrame() {
const { canvas } = useCanvas('canvas') const { canvas } = useCanvas('canvas')
const { canvasLoadInit, gridInit } = useCanvasConfigInitialize() const { canvasLoadInit, gridInit } = useCanvasConfigInitialize()
const currentMenu = useRecoilValue(currentMenuState) const currentMenu = useRecoilValue(currentMenuState)
const { contextMenu, handleClick, handleKeyup } = useContextMenu() const { contextMenu, handleClick } = useContextMenu()
const { selectedPlan, modifiedPlanFlag, checkCanvasObjectEvent, resetModifiedPlans } = usePlan() const { selectedPlan, modifiedPlanFlag, checkCanvasObjectEvent, resetModifiedPlans } = usePlan()
useEvent() useEvent()
@ -57,7 +57,7 @@ export default function CanvasFrame() {
<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} handleKeyup={handleKeyup}> <QContextMenu contextRef={canvasRef} canvasProps={canvas}>
{contextMenu?.map((menus, index) => ( {contextMenu?.map((menus, index) => (
<ul key={index}> <ul key={index}>
{menus.map((menu) => ( {menus.map((menu) => (

View File

@ -240,7 +240,7 @@ export default function PlacementSurfaceSetting({ id, pos = { x: 50, y: 230 } })
}, []) }, [])
return ( return (
<WithDraggable isShow={true} pos={{ x: 50, y: 230 }}> <WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap lr-2`}> <div className={`modal-pop-wrap lr-2`}>
<div className="modal-head"> <div className="modal-head">
<h1 className="title">{getMessage('plan.menu.placement.surface.arrangement')} </h1> <h1 className="title">{getMessage('plan.menu.placement.surface.arrangement')} </h1>

View File

@ -11,12 +11,12 @@ import { useRecoilValue } from 'recoil'
import { usePopup } from '@/hooks/usePopup' import { usePopup } from '@/hooks/usePopup'
export default function SettingModal01(props) { export default function SettingModal01(props) {
const { setShowDotLineGridModal, setShowFontSettingModal, id, isConfig } = props const { id } = props
console.log(props)
const [buttonAct, setButtonAct] = useState(1) const [buttonAct, setButtonAct] = useState(1)
const { getMessage } = useMessage() const { getMessage } = useMessage()
const canGridOptionSeletorValue = useRecoilValue(canGridOptionSeletor) const canGridOptionSeletorValue = useRecoilValue(canGridOptionSeletor)
const { addPopup, closePopup } = usePopup() const { closePopup } = usePopup()
const handleBtnClick = (num) => { const handleBtnClick = (num) => {
setButtonAct(num) setButtonAct(num)
} }

View File

@ -231,12 +231,12 @@ export function useContextMenu() {
y: 180, y: 180,
}) })
setCurrentContextMenu(menu) setCurrentContextMenu(menu)
currentMenuSetting()
setQContextMenu({ ...qContextMenu, visible: false }) setQContextMenu({ ...qContextMenu, visible: false })
} }
const handleKeyup = (e) => { const handleKeyup = (e) => {
let menu = null let menu = null
for (let i = 0; i < contextMenu.length; i++) { for (let i = 0; i < contextMenu.length; i++) {
const temp = contextMenu[i].filter((menu) => { const temp = contextMenu[i].filter((menu) => {
return menu.shortcut?.includes(e.key) return menu.shortcut?.includes(e.key)
@ -259,7 +259,6 @@ export function useContextMenu() {
useEffect(() => { useEffect(() => {
console.log('currentObject', currentObject) console.log('currentObject', currentObject)
if (currentObject?.name) { if (currentObject?.name) {
console.log(currentObject?.name)
switch (currentObject.name) { switch (currentObject.name) {
case 'triangleDormer': case 'triangleDormer':
case 'pentagonDormer': case 'pentagonDormer':

View File

@ -1,12 +1,11 @@
import { useEffect, useRef } from 'react' import { useEffect, useRef } from 'react'
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' import { useRecoilValue, useSetRecoilState } from 'recoil'
import { canvasState, canvasZoomState, currentMenuState, textModeState } from '@/store/canvasAtom' import { canvasState, canvasZoomState, currentMenuState, textModeState } from '@/store/canvasAtom'
import { fabric } from 'fabric' import { fabric } from 'fabric'
import { calculateDistance, calculateIntersection, distanceBetweenPoints, findClosestPoint, polygonToTurfPolygon } from '@/util/canvas-util' import { calculateDistance, calculateIntersection, distanceBetweenPoints, findClosestPoint } from '@/util/canvas-util'
import { useAdsorptionPoint } from '@/hooks/useAdsorptionPoint' import { useAdsorptionPoint } from '@/hooks/useAdsorptionPoint'
import { useDotLineGrid } from '@/hooks/useDotLineGrid' import { useDotLineGrid } from '@/hooks/useDotLineGrid'
import { useTempGrid } from '@/hooks/useTempGrid' import { useTempGrid } from '@/hooks/useTempGrid'
import { gridDisplaySelector } from '@/store/settingAtom'
export function useEvent() { export function useEvent() {
const canvas = useRecoilValue(canvasState) const canvas = useRecoilValue(canvasState)
@ -100,7 +99,13 @@ export function useEvent() {
const distance = calculateDistance(pointer, closestLine) const distance = calculateDistance(pointer, closestLine)
if (distance < adsorptionRange) { if (distance < adsorptionRange) {
arrivalPoint = closestLine.direction === 'vertical' ? { x: closestLine.x1, y: pointer.y } : { x: pointer.x, y: closestLine.y1 } arrivalPoint =
closestLine.direction === 'vertical'
? { x: closestLine.x1, y: pointer.y }
: {
x: pointer.x,
y: closestLine.y1,
}
} }
} }
} }
@ -261,6 +266,7 @@ export function useEvent() {
addCanvasMouseEventListener, addCanvasMouseEventListener,
removeAllMouseEventListeners, removeAllMouseEventListeners,
removeAllDocumentEventListeners, removeAllDocumentEventListeners,
removeDocumentEvent,
removeMouseEvent, removeMouseEvent,
removeMouseLine, removeMouseLine,
initEvent, initEvent,