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

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,39 +84,52 @@ export default function Roof2() {
return ( return (
<> <>
{canvas && ( {canvas && (
<>
<div className="flex justify-center my-8"> <div className="flex justify-center my-8">
<button <button
className={`w-30 mx-2 p-2 rounded ${mode === Mode.DEFAULT ? 'bg-blue-500' : 'bg-gray-500'} text-white`} className={`w-30 mx-2 p-2 rounded ${
mode === Mode.DEFAULT ? 'bg-blue-500' : 'bg-gray-500'
} text-white`}
onClick={() => changeMode(canvas, Mode.DEFAULT)} onClick={() => changeMode(canvas, Mode.DEFAULT)}
> >
모드 DEFAULT 모드 DEFAULT
</button> </button>
<button <button
className={`w-30 mx-2 p-2 rounded ${mode === Mode.DRAW_LINE ? 'bg-blue-500' : 'bg-gray-500'} text-white`} className={`w-30 mx-2 p-2 rounded ${
mode === Mode.DRAW_LINE ? 'bg-blue-500' : 'bg-gray-500'
} text-white`}
onClick={() => changeMode(canvas, Mode.DRAW_LINE)} onClick={() => changeMode(canvas, Mode.DRAW_LINE)}
> >
기준선 긋기 모드 기준선 긋기 모드
</button> </button>
<button <button
className={`w-30 mx-2 p-2 rounded ${mode === Mode.EDIT ? 'bg-blue-500' : 'bg-gray-500'} 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.EDIT)} onClick={() => changeMode(canvas, Mode.EDIT)}
> >
에디팅모드 에디팅모드
</button> </button>
<button <button
className={`w-30 mx-2 p-2 rounded ${mode === Mode.TEMPLATE ? 'bg-blue-500' : 'bg-gray-500'} text-white`} className={`w-30 mx-2 p-2 rounded ${
mode === Mode.TEMPLATE ? 'bg-blue-500' : 'bg-gray-500'
} text-white`}
onClick={() => changeMode(canvas, Mode.TEMPLATE)} onClick={() => changeMode(canvas, Mode.TEMPLATE)}
> >
템플릿 템플릿
</button> </button>
<button <button
className={`w-30 mx-2 p-2 rounded ${mode === Mode.TEXTBOX ? 'bg-blue-500' : 'bg-gray-500'} text-white`} className={`w-30 mx-2 p-2 rounded ${
mode === Mode.TEXTBOX ? 'bg-blue-500' : 'bg-gray-500'
} text-white`}
onClick={() => changeMode(canvas, Mode.TEXTBOX)} onClick={() => changeMode(canvas, Mode.TEXTBOX)}
> >
텍스트박스 모드 텍스트박스 모드
</button> </button>
<button <button
className={`w-30 mx-2 p-2 rounded ${mode === Mode.DRAW_RECT ? 'bg-blue-500' : 'bg-gray-500'} text-white`} 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)} onClick={() => changeMode(canvas, Mode.DRAW_RECT)}
> >
사각형 생성 모드 사각형 생성 모드
@ -179,6 +200,30 @@ export default function Roof2() {
점선 추가 점선 추가
</button> </button>
</div> </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}
/>
</>
)
}