슬라이더 컴포넌트 추가 및 페이지에 예제 추가

This commit is contained in:
yoosangwook 2024-07-02 14:33:54 +09:00
parent 364d32e349
commit c102c0592f
2 changed files with 174 additions and 104 deletions

View File

@ -1,14 +1,22 @@
import { useCanvas } from '@/hooks/useCanvas' import { useCanvas } from '@/hooks/useCanvas'
import { useEffect } from 'react' import { useEffect, useState } from 'react'
import { Mode, useMode } from '@/hooks/useMode' import { Mode, useMode } from '@/hooks/useMode'
import QRect from '@/components/fabric/QRect' import QRect from '@/components/fabric/QRect'
import QLine from '@/components/fabric/QLine' import QLine from '@/components/fabric/QLine'
import QPolygon from '@/components/fabric/QPolygon' import QPolygon from '@/components/fabric/QPolygon'
import RangeSlider from './ui/RangeSlider'
export default function Roof2() { export default function Roof2() {
const { canvas, handleRedo, handleUndo, setCanvasBackgroundWithDots } = const { canvas, handleRedo, handleUndo, setCanvasBackgroundWithDots } =
useCanvas('canvas') useCanvas('canvas')
//canvas
const [verticalSize, setVerticalSize] = useState(0)
//canvas
const [horizontalSize, setHorizontalSize] = useState(0)
//
const [fontSize, setFontSize] = useState(0)
const { const {
mode, mode,
changeMode, changeMode,
@ -76,109 +84,146 @@ export default function Roof2() {
return ( return (
<> <>
{canvas && ( {canvas && (
<div className="flex justify-center my-8"> <>
<button <div className="flex justify-center my-8">
className={`w-30 mx-2 p-2 rounded ${mode === Mode.DEFAULT ? 'bg-blue-500' : 'bg-gray-500'} text-white`} <button
onClick={() => changeMode(canvas, Mode.DEFAULT)} className={`w-30 mx-2 p-2 rounded ${
> mode === Mode.DEFAULT ? 'bg-blue-500' : 'bg-gray-500'
모드 DEFAULT } text-white`}
</button> onClick={() => changeMode(canvas, Mode.DEFAULT)}
<button >
className={`w-30 mx-2 p-2 rounded ${mode === Mode.DRAW_LINE ? 'bg-blue-500' : 'bg-gray-500'} text-white`} 모드 DEFAULT
onClick={() => changeMode(canvas, Mode.DRAW_LINE)} </button>
> <button
기준선 긋기 모드 className={`w-30 mx-2 p-2 rounded ${
</button> mode === Mode.DRAW_LINE ? 'bg-blue-500' : 'bg-gray-500'
<button } text-white`}
className={`w-30 mx-2 p-2 rounded ${mode === Mode.EDIT ? 'bg-blue-500' : 'bg-gray-500'} text-white`} onClick={() => changeMode(canvas, Mode.DRAW_LINE)}
onClick={() => changeMode(canvas, Mode.EDIT)} >
> 기준선 긋기 모드
에디팅모드 </button>
</button> <button
<button className={`w-30 mx-2 p-2 rounded ${
className={`w-30 mx-2 p-2 rounded ${mode === Mode.TEMPLATE ? 'bg-blue-500' : 'bg-gray-500'} text-white`} mode === Mode.EDIT ? 'bg-blue-500' : 'bg-gray-500'
onClick={() => changeMode(canvas, Mode.TEMPLATE)} } text-white`}
> onClick={() => changeMode(canvas, Mode.EDIT)}
템플릿 >
</button> 에디팅모드
<button </button>
className={`w-30 mx-2 p-2 rounded ${mode === Mode.TEXTBOX ? 'bg-blue-500' : 'bg-gray-500'} text-white`} <button
onClick={() => changeMode(canvas, Mode.TEXTBOX)} className={`w-30 mx-2 p-2 rounded ${
> mode === Mode.TEMPLATE ? 'bg-blue-500' : 'bg-gray-500'
텍스트박스 모드 } text-white`}
</button> onClick={() => changeMode(canvas, Mode.TEMPLATE)}
<button >
className={`w-30 mx-2 p-2 rounded ${mode === Mode.DRAW_RECT ? 'bg-blue-500' : 'bg-gray-500'} text-white`} 템플릿
onClick={() => changeMode(canvas, Mode.DRAW_RECT)} </button>
> <button
사각형 생성 모드 className={`w-30 mx-2 p-2 rounded ${
</button> mode === Mode.TEXTBOX ? 'bg-blue-500' : 'bg-gray-500'
<button } text-white`}
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" onClick={() => changeMode(canvas, Mode.TEXTBOX)}
onClick={handleUndo} >
> 텍스트박스 모드
Undo </button>
</button> <button
<button className={`w-30 mx-2 p-2 rounded ${
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" mode === Mode.DRAW_RECT ? 'bg-blue-500' : 'bg-gray-500'
onClick={handleRedo} } text-white`}
> onClick={() => changeMode(canvas, Mode.DRAW_RECT)}
Redo >
</button> 사각형 생성 모드
<button </button>
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" <button
onClick={handleClear} className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
> onClick={handleUndo}
clear >
</button> Undo
<button </button>
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" <button
onClick={zoomIn} className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
> onClick={handleRedo}
확대 >
</button> Redo
<button </button>
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" <button
onClick={zoomOut} className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
> onClick={handleClear}
축소 >
</button> clear
현재 : {zoom}% </button>
<button <button
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
onClick={makeRect} onClick={zoomIn}
> >
사각형만들기 확대
</button> </button>
<button <button
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
onClick={makeLine} onClick={zoomOut}
> >
추가 축소
</button> </button>
<button 현재 : {zoom}%
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" <button
onClick={makePolygon} className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
> onClick={makeRect}
다각형 추가 >
</button> 사각형만들기
<button </button>
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" <button
onClick={() => { className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
setCanvasBackgroundWithDots(canvas, 10) onClick={makeLine}
}} >
> 추가
점선 추가 </button>
</button> <button
<button className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white" onClick={makePolygon}
onClick={() => { >
setCanvasBackgroundWithDots(canvas, 20) 다각형 추가
}} </button>
> <button
점선 추가 className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
</button> onClick={() => {
</div> setCanvasBackgroundWithDots(canvas, 10)
}}
>
점선 추가
</button>
<button
className="w-30 mx-2 p-2 rounded bg-gray-500 text-white"
onClick={() => {
setCanvasBackgroundWithDots(canvas, 20)
}}
>
점선 추가
</button>
</div>
<div className="flex justify-center flex-col items-center">
<div className="m-2 p-2 w-80">
<RangeSlider
title="canvas 가로 사이즈"
initValue={verticalSize}
onchange={setVerticalSize}
/>
</div>
<div className="m-2 p-2 w-80">
<RangeSlider
title="canvas 세로 사이즈"
initValue={horizontalSize}
onchange={setHorizontalSize}
/>
</div>
<div className="m-2 p-2 w-80">
<RangeSlider
title="글자 크기"
initValue={fontSize}
onchange={setFontSize}
/>
</div>
</div>
</>
)} )}
<div <div

View File

@ -0,0 +1,25 @@
export default function RangeSlider(
props = { title: 'default title', initValue: 0, onchange: () => {} },
) {
const { title, initValue, onchange } = props
const handleChange = (e) => {
console.log(e.target.value)
onchange(e.target.value)
}
return (
<>
<label htmlFor="default-range" className="block mb-2 text-gray-900">
{title}
</label>
<input
id="default-range"
type="range"
value={initValue}
className="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer"
onChange={handleChange}
/>
</>
)
}