From 51c4fcfe1462e0c82b0ff1c33422d3e886e88e1c Mon Sep 17 00:00:00 2001 From: minsik Date: Fri, 1 Nov 2024 18:10:27 +0900 Subject: [PATCH 1/3] =?UTF-8?q?canvas=20menu=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20zoom=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasMenu.jsx | 12 ++++++++---- src/hooks/useCanvasEvent.js | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 63f1840d..c77e1870 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -49,7 +49,7 @@ export default function CanvasMenu(props) { const sessionState = useRecoilValue(sessionStore) const globalLocale = useRecoilValue(globalLocaleStore) const canvas = useRecoilValue(canvasState) - const { handleZoomClear } = useCanvasEvent() + const { handleZoomClear, handleZoom } = useCanvasEvent() const { handleMenu } = useMenu() const { getMessage } = useMessage() @@ -201,14 +201,18 @@ export default function CanvasMenu(props) { {canvasZoom}% - +
-
diff --git a/src/hooks/useCanvasEvent.js b/src/hooks/useCanvasEvent.js index ad3e8e75..4bab1fd6 100644 --- a/src/hooks/useCanvasEvent.js +++ b/src/hooks/useCanvasEvent.js @@ -1,4 +1,4 @@ -import { useState } from 'react' +import { useEffect, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { v4 as uuidv4 } from 'uuid' import { canvasSizeState, canvasState, canvasZoomState, currentObjectState, fontFamilyState, fontSizeState } from '@/store/canvasAtom' @@ -18,6 +18,10 @@ export function useCanvasEvent() { const lengthTextOption = useRecoilValue(fontSelector('lengthText')) const { modifiedPlanFlag, setModifiedPlanFlag } = usePlan() + useEffect(() => { + canvas?.setZoom(canvasZoom / 100) + }, [canvasZoom]) + // 기본적인 이벤트 필요시 추가 const attachDefaultEventOnCanvas = () => { removeEventOnCanvas() @@ -365,6 +369,14 @@ export function useCanvasEvent() { }) } + const handleZoom = (isZoom) => { + if (isZoom) { + setCanvasZoom(canvasZoom + 10) + } else { + setCanvasZoom(canvasZoom - 10) + } + } + const handleZoomClear = () => { setCanvasZoom(100) canvas.set({ zoom: 1 }) @@ -376,5 +388,6 @@ export function useCanvasEvent() { setCanvasForEvent, attachDefaultEventOnCanvas, handleZoomClear, + handleZoom, } } From ea8b4a3e36570f2b26a4c0aaeafb73ec2c8a0aff Mon Sep 17 00:00:00 2001 From: minsik Date: Fri, 1 Nov 2024 18:10:42 +0900 Subject: [PATCH 2/3] =?UTF-8?q?contextmenu=20modal=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/context-menu/QContextMenu.jsx | 3 +++ src/hooks/useContextMenu.js | 13 +++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index f710485f..9d3eb4f3 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -3,12 +3,14 @@ import { useEffect } from 'react' import '@/styles/contents.scss' import { useRecoilState } from 'recoil' import { contextMenuListState, contextMenuState } from '@/store/contextMenu' +import { useTempGrid } from '@/hooks/useTempGrid' export default function QContextMenu(props) { const { contextRef, canvasProps, handleKeyup } = props const [contextMenu, setContextMenu] = useRecoilState(contextMenuState) const [contextMenuList, setContextMenuList] = useRecoilState(contextMenuListState) const activeObject = canvasProps?.getActiveObject() //액티브된 객체를 가져옴 + const { tempGridMode, setTempGridMode } = useTempGrid() let contextType = '' @@ -32,6 +34,7 @@ export default function QContextMenu(props) { const handleContextMenu = (e) => { // e.preventDefault() //기존 contextmenu 막고 + if (tempGridMode) return const position = { x: window.innerWidth / 2 < e.pageX ? e.pageX - 240 : e.pageX, y: window.innerHeight / 2 < e.pageY ? getYPosition(e) : e.pageY, diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 8a6226a1..ccc8b8d8 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -43,12 +43,11 @@ export function useContextMenu() { const { addPopup } = usePopup() const [popupId, setPopupId] = useState(uuidv4()) const [gridColor, setGridColor] = useRecoilState(gridColorState) - const { deleteObject, moveObject, copyObject, editText, changeDimensionExtendLine } = useCommonUtils() + const { deleteObject, moveObject, copyObject, editText, changeDimensionExtendLine, deleteOuterLineObject } = useCommonUtils() const [qContextMenu, setQContextMenu] = useRecoilState(contextMenuState) const [cell, setCell] = useState(null) const [column, setColumn] = useState(null) const { handleZoomClear } = useCanvasEvent() - const currentMenuSetting = () => { switch (currentMenu) { case MENU.PLAN_DRAWING: @@ -172,6 +171,7 @@ export function useContextMenu() { { id: 'sizeEdit', name: getMessage('contextmenu.size.edit'), + component: , }, { id: 'remove', @@ -207,6 +207,7 @@ export function useContextMenu() { { id: 'flowDirectionEdit', name: getMessage('contextmenu.flow.direction.edit'), + component: , }, ], ]) @@ -241,7 +242,7 @@ export function useContextMenu() { if (temp.length > 0) menu = temp } - handleClick(null, menu) + if (menu) handleClick(null, menu) } useEffect(() => { @@ -342,6 +343,7 @@ export function useContextMenu() { { id: 'sizeEdit', name: getMessage('contextmenu.size.edit'), + component: , }, { id: 'openingRemove', @@ -419,19 +421,23 @@ export function useContextMenu() { ]) break case 'lineGrid': + case 'tempGrid': setContextMenu([ [ { id: 'gridMove', name: getMessage('modal.grid.move'), + component: , }, { id: 'gridCopy', name: getMessage('modal.grid.copy'), + component: , }, { id: 'gridColorEdit', name: getMessage('contextmenu.grid.color.edit'), + component: , }, { id: 'remove', @@ -561,7 +567,6 @@ export function useContextMenu() { ]) break case 'module': - case 'dimensionLineText': setContextMenu([ [ { From 1838320606ed938b761744932738da60c56695b2 Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 4 Nov 2024 16:11:58 +0900 Subject: [PATCH 3/3] =?UTF-8?q?modal=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/font/FontSetting.jsx | 4 +- .../common/popupManager/PopupManager.jsx | 6 +- src/components/floor-plan/CanvasMenu.jsx | 2 +- .../floor-plan/modal/setting01/GridOption.jsx | 4 +- .../modal/setting01/SecondOption.jsx | 21 ++++-- .../modal/setting01/SettingModal01.jsx | 4 +- .../dimensionLine/DimensionLineSetting.jsx | 7 +- .../setting01/planSize/PlanSizeSetting.jsx | 4 +- src/hooks/useContextMenu.js | 2 +- src/hooks/usePopup.js | 75 +++++++++++++++---- src/store/popupAtom.js | 3 +- 11 files changed, 94 insertions(+), 38 deletions(-) diff --git a/src/components/common/font/FontSetting.jsx b/src/components/common/font/FontSetting.jsx index 60181021..54b22b3b 100644 --- a/src/components/common/font/FontSetting.jsx +++ b/src/components/common/font/FontSetting.jsx @@ -47,7 +47,7 @@ const fontColors = [ ] export default function FontSetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) - const { id, setIsShow, pos = contextPopupPosition, type } = props + const { id, setIsShow, pos = contextPopupPosition, type, isConfig = false } = props const { getMessage } = useMessage() const { closePopup } = usePopup() const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) @@ -83,7 +83,7 @@ export default function FontSetting(props) { className="modal-close" onClick={() => { if (setIsShow) setIsShow(false) - closePopup(id) + closePopup(id, isConfig) }} > 닫기 diff --git a/src/components/common/popupManager/PopupManager.jsx b/src/components/common/popupManager/PopupManager.jsx index aa4b6cae..f24a8526 100644 --- a/src/components/common/popupManager/PopupManager.jsx +++ b/src/components/common/popupManager/PopupManager.jsx @@ -5,5 +5,9 @@ import { Fragment } from 'react' export default function PopupManager() { const [popup, setPopup] = useRecoilState(popupState) - return popup.children?.map((child) => {child.component}) + + return [ + ...popup?.config.map((child) => {child.component}), + ...popup?.other.map((child) => {child.component}), + ] } diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index adcd34b3..22ac4131 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -129,7 +129,7 @@ export default function CanvasMenu(props) { const handlePopup = () => { const id = uuidv4() - addPopup(id, 0, ) + addPopup(id, 1, , true) } useEffect(() => { diff --git a/src/components/floor-plan/modal/setting01/GridOption.jsx b/src/components/floor-plan/modal/setting01/GridOption.jsx index 5edb2167..8ef1095f 100644 --- a/src/components/floor-plan/modal/setting01/GridOption.jsx +++ b/src/components/floor-plan/modal/setting01/GridOption.jsx @@ -78,14 +78,14 @@ export default function GridOption() { // 점 선 그리드 설정 모달 setShowDotLineGridModal(selectedOption.selected) - addPopup(dotLineId, 2, ) + addPopup(dotLineId, 2, , true) } else if (selectedOption.id === 3) { // 흡착점 모드 setAdsorptionPointAddMode(selectedOption.selected) } else if (selectedOption.id === 4) { // 그리드 색 설정 모달 setShowColorPickerModal(selectedOption.selected) - addPopup(colorId, 2, ) + addPopup(colorId, 2, , true) } setGridOptions(newGridOptions) diff --git a/src/components/floor-plan/modal/setting01/SecondOption.jsx b/src/components/floor-plan/modal/setting01/SecondOption.jsx index c09dfdc1..385c7bef 100644 --- a/src/components/floor-plan/modal/setting01/SecondOption.jsx +++ b/src/components/floor-plan/modal/setting01/SecondOption.jsx @@ -1,4 +1,4 @@ -import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' +import { useRecoilValue } from 'recoil' import { useMessage } from '@/hooks/useMessage' import React, { useEffect, useState } from 'react' import DimensionLineSetting from '@/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting' @@ -67,6 +67,7 @@ export default function SecondOption() { id: fontId, pos: { x: 745, y: 180 }, setIsShow: setShowFontSettingModal, + isConfig: true, } const planSizeProps = { id: planSizeId, @@ -86,36 +87,41 @@ export default function SecondOption() { case 'font1': { //문자 글꼴변경 setShowFontSettingModal(true) + setShowDimensionLineSettingModal(false) fontProps.type = 'commonText' fontProps.id = fontId + 1 - addPopup(fontId + 1, 2, ) + addPopup(fontId + 1, 2, , true) break } case 'font2': { //흐름 방향 글꼴 변경 setShowFontSettingModal(true) + setShowDimensionLineSettingModal(false) fontProps.type = 'flowText' fontProps.id = fontId + 2 - addPopup(fontId + 2, 2, ) + addPopup(fontId + 2, 2, , true) break } case 'font3': { //치수 글꼴변경 setShowFontSettingModal(true) + + setShowDimensionLineSettingModal(false) fontProps.type = 'lengthText' fontProps.id = fontId + 3 - addPopup(fontId + 3, 2, ) + addPopup(fontId + 3, 2, , true) break } case 'font4': { //회로번호 글꼴변경 setShowFontSettingModal(true) + setShowDimensionLineSettingModal(false) fontProps.type = 'circuitNumberText' fontProps.id = fontId - addPopup(fontId, 2, ) + addPopup(fontId, 2, , true) break } @@ -123,7 +129,7 @@ export default function SecondOption() { //치수선 설정 if (!showDimensionLineSettingModal) { setShowDimensionLineSettingModal(true) - addPopup(dimensionId, 2, ) + addPopup(dimensionId, 2, , true) } else { setShowDimensionLineSettingModal(false) closePopup(dimensionId) @@ -134,7 +140,8 @@ export default function SecondOption() { case 'planSize': { //도면크기 설정 setShowPlanSizeSettingModal(true) - addPopup(planSizeId, 2, ) + setShowDimensionLineSettingModal(false) + addPopup(planSizeId, 2, , true) break } } diff --git a/src/components/floor-plan/modal/setting01/SettingModal01.jsx b/src/components/floor-plan/modal/setting01/SettingModal01.jsx index 8570555e..e1bef1f0 100644 --- a/src/components/floor-plan/modal/setting01/SettingModal01.jsx +++ b/src/components/floor-plan/modal/setting01/SettingModal01.jsx @@ -11,7 +11,7 @@ import { useRecoilValue } from 'recoil' import { usePopup } from '@/hooks/usePopup' export default function SettingModal01(props) { - const { setShowDotLineGridModal, setShowFontSettingModal, id } = props + const { setShowDotLineGridModal, setShowFontSettingModal, id, isConfig } = props console.log(props) const [buttonAct, setButtonAct] = useState(1) const { getMessage } = useMessage() @@ -27,7 +27,7 @@ export default function SettingModal01(props) {

{getMessage('modal.canvas.setting')}

-
diff --git a/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx b/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx index 2afbd184..1aa39e74 100644 --- a/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx +++ b/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx @@ -87,6 +87,7 @@ export default function DimensionLineSetting(props) { setFontColor: setOriginFontColor, fontSize: originFontSize, setFontSize: setOriginFontSize, + isConfig: true, id: fontModalId, pos: { x: 455, @@ -97,17 +98,17 @@ export default function DimensionLineSetting(props) { const popupHandle = (type) => { switch (type) { case 'color': - addPopup(colorModalId, 3, ) + addPopup(colorModalId, 3, , true) break case 'font': - addPopup(fontModalId, 3, ) + addPopup(fontModalId, 3, , true) break } } return ( -
+

{getMessage('modal.canvas.setting.font.plan.absorption.dimension.line')}