diff --git a/src/islands/note-x/components/notes/ImageNote/ImageNote.tsx b/src/islands/note-x/components/notes/ImageNote/ImageNote.tsx index 691eec10..37efb1d1 100644 --- a/src/islands/note-x/components/notes/ImageNote/ImageNote.tsx +++ b/src/islands/note-x/components/notes/ImageNote/ImageNote.tsx @@ -1,20 +1,12 @@ import type { NoteComponent, NoteComponentProps } from "../../notes-utils" import { type SetStoreFunction } from "solid-js/store" -import { createEditorTransaction, createTiptapEditor } from 'solid-tiptap' -import StarterKit from '@tiptap/starter-kit' import type { ImageNoteData } from "./types" -import { Match, Show, Switch, createEffect, createMemo, createSignal } from "solid-js" -import { removeIconSize } from "../../../utils/icon/removeIconSize" +import { Show, createMemo, createSignal } from "solid-js" -import IconNote from '@tabler/icons/note.svg?raw' -import IconNoteOff from '@tabler/icons/note-off.svg?raw' - -import type { Editor } from "@tiptap/core" import { Dialog } from "../../utils/Dialog" import { Controller } from "../../note-components/Controller" import { noteBookState, setNoteBookState } from "../../../store" import { ScanedImageEditor } from "./components/ScanedImageEditor" -import type { Sheets } from "./components/Sheet" import Player from "./components/Player" export interface Props extends NoteComponentProps { @@ -36,6 +28,9 @@ export const ImageNote = ((props: Props) => { const [isShowEditor, setIsShowEditor] = createSignal(false) return
{ props.focus() + if (noteBookState.isEditMode) { + setIsShowEditor(true) + } }}> { @@ -56,7 +51,7 @@ export const ImageNote = ((props: Props) => { } props.setNoteData('blobs', 'scanedImage', data.image) props.setNoteData('canToJsonData', 'sheets', data.sheets) - }} scanedImage={props.noteData.blobs.scanedImage} sheets={props.noteData.canToJsonData.sheets} /> + }} noteData={props.noteData} setNoteData={props.setNoteData} /> {/* 本体 */} diff --git a/src/islands/note-x/components/notes/ImageNote/components/EditorCoreX.tsx b/src/islands/note-x/components/notes/ImageNote/components/EditorCoreX.tsx index 62074c4e..63ca6071 100644 --- a/src/islands/note-x/components/notes/ImageNote/components/EditorCoreX.tsx +++ b/src/islands/note-x/components/notes/ImageNote/components/EditorCoreX.tsx @@ -1,4 +1,4 @@ -import { createEffect, onMount, onCleanup, createSignal } from 'solid-js' +import { createEffect, onMount, onCleanup, createSignal, Show } from 'solid-js' import Sheet, { type Sheets } from './Sheet' import IconArrowsMove from '@tabler/icons/arrows-move.svg?raw' @@ -6,17 +6,22 @@ import IconHighlight from '@tabler/icons/highlight.svg?raw' import IconEraser from '@tabler/icons/eraser.svg?raw' import { removeIconSize } from '../../../../utils/icon/removeIconSize' +import { Dialog } from '../../../utils/Dialog' export interface Props { scanedImage?: Blob | undefined - changeSheets (sheets: Sheets): void + changeSheets(sheets: Sheets): void sheets?: Sheets + + rescan (): void } export default (props: Props) => { - const [editMode, setEditMode] = createSignal<'move' | 'paint' | 'clear'>('move') + const [editMode, setEditMode] = createSignal<'move' | 'paint' | 'clear'>( + 'move' + ) const [imageUrl, setImageUrl] = createSignal() const [imageSize, setImageSize] = createSignal<{ @@ -27,10 +32,13 @@ export default (props: Props) => { h: 0, }) const [sheets, setSheets] = createSignal(props.sheets ?? []) - const [tmpSheet, setTmpSheet] = createSignal<{ - sheet: Sheets[number] - pointerId: number - } | number>() + const [tmpSheet, setTmpSheet] = createSignal< + | { + sheet: Sheets[number] + pointerId: number + } + | number + >() createEffect(() => { props.changeSheets(sheets()) @@ -44,7 +52,7 @@ export default (props: Props) => { image.onload = () => { setImageSize({ w: image.width, - h: image.height + h: image.height, }) } image.src = blobImageUrl @@ -53,11 +61,13 @@ export default (props: Props) => { const [editorPosition, setEditorPosition] = createSignal({ x: 0, y: 0, - size: 1 + size: 1, }) let editorContainer!: HTMLDivElement - const [editorContainerRect, setEditorContainerRect] = createSignal(new DOMRect()) + const [editorContainerRect, setEditorContainerRect] = createSignal( + new DOMRect() + ) onMount(() => { const observer = new ResizeObserver(() => { setEditorContainerRect(editorContainer.getBoundingClientRect()) @@ -69,22 +79,25 @@ export default (props: Props) => { const pointerXByEditor = evt.clientX - editorContainerRect().left const pointerYByEditor = evt.clientY - editorContainerRect().top - const positionX = (pointerXByEditor - editorPosition().x) / editorPosition().size - const positionY = (pointerYByEditor - editorPosition().y) / editorPosition().size - return [ - Math.floor(positionX), - Math.floor(positionY) - ] + const positionX = + (pointerXByEditor - editorPosition().x) / editorPosition().size + const positionY = + (pointerYByEditor - editorPosition().y) / editorPosition().size + return [Math.floor(positionX), Math.floor(positionY)] } - let pointersData: Record = {} + let pointersData: Record< + string, + | { + isDowned: boolean + last: PointerEvent + } + | undefined + > = {} const pointerDown = (evt: PointerEvent) => { evt.preventDefault() pointersData[evt.pointerId] = { isDowned: true, - last: evt + last: evt, } const currentEditMode = editMode() if (currentEditMode === 'paint') { @@ -99,10 +112,10 @@ export default (props: Props) => { positions: [], startPosition: { x: positionX, - y: positionY + y: positionY, }, - weight: 30 / editorPosition().size - } + weight: 30 / editorPosition().size, + }, }) } } @@ -111,13 +124,13 @@ export default (props: Props) => { if (!(evt.pointerId in pointersData)) { pointersData[evt.pointerId] = { isDowned: false, - last: evt + last: evt, } } const thisPointer = pointersData[evt.pointerId]! const currentEditMode = editMode() if (currentEditMode === 'move') { - if (Object.values(pointersData).filter(e => e?.isDowned).length === 1) { + if (Object.values(pointersData).filter((e) => e?.isDowned).length === 1) { // タッチしているポインターが一つ if (pointersData[evt.pointerId]?.isDowned) { const movementX = evt.screenX - thisPointer.last.screenX @@ -126,7 +139,7 @@ export default (props: Props) => { setEditorPosition({ x: editorPosition().x + movementX, y: editorPosition().y + movementY, - size: editorPosition().size + size: editorPosition().size, }) console.log(editorPosition()) } @@ -150,10 +163,10 @@ export default (props: Props) => { ...lastTmpSheet.sheet.positions, { x: positionX, - y: positionY - } - ] - } + y: positionY, + }, + ], + }, }) } } @@ -168,10 +181,7 @@ export default (props: Props) => { return } if (nowTmpSheet?.pointerId === evt.pointerId) { - setSheets([ - ...sheets(), - nowTmpSheet?.sheet - ]) + setSheets([...sheets(), nowTmpSheet?.sheet]) setTmpSheet() } } @@ -179,7 +189,7 @@ export default (props: Props) => { const lastEditorPosition = editorPosition() setEditorPosition({ ...lastEditorPosition, - size: lastEditorPosition.size * (evt.deltaY > 0 ? 0.9 : 1.1) + size: lastEditorPosition.size * (evt.deltaY > 0 ? 0.9 : 1.1), }) } const sheetClicked = (sheetIndex: number) => { @@ -190,79 +200,119 @@ export default (props: Props) => { setTmpSheet(Math.random()) } } - return
-
-
+ + { + if (ok) { + props.rescan() + } + setRescanConfirm(false) + }} title="Confirm"> + 本当に再スキャンしますか?このデータは失われます。 + + +
+
-
-
-
- image -
-
- { - const nowTmpSheet = tmpSheet() - return (nowTmpSheet && typeof nowTmpSheet !== 'number') ? [nowTmpSheet.sheet] : [] - })()]} - onClickSheet={sheetClicked} - width={imageSize().w} - height={imageSize().h} - /> -
-
- + > +
+
+ image +
+
+ { + const nowTmpSheet = tmpSheet() + return nowTmpSheet && typeof nowTmpSheet !== 'number' + ? [nowTmpSheet.sheet] + : [] + })(), + ]} + onClickSheet={sheetClicked} + width={imageSize().w} + height={imageSize().h} + /> +
+
+
+
+
+ + + +
+
+ +
+
-
- - - -
-
+ ) } diff --git a/src/islands/note-x/components/notes/ImageNote/components/ScanedImageEditor.tsx b/src/islands/note-x/components/notes/ImageNote/components/ScanedImageEditor.tsx index e1d78989..852248e4 100644 --- a/src/islands/note-x/components/notes/ImageNote/components/ScanedImageEditor.tsx +++ b/src/islands/note-x/components/notes/ImageNote/components/ScanedImageEditor.tsx @@ -1,70 +1,88 @@ -import { Show, createEffect, createSignal, onMount } from "solid-js" -import { Dialog, createDialog } from "../../../utils/Dialog" -import EditorCore from "./EditorCoreX" -import type { Sheets } from "./Sheet" +import { Show } from 'solid-js' +import { Dialog, createDialog } from '../../../utils/Dialog' +import EditorCore from './EditorCoreX' +import type { Sheets } from './Sheet' +import type { ImageNoteData } from '../types' +import type { SetStoreFunction } from 'solid-js/store' export interface Props { onEnd(data: ScanedImageEditedData | null): void - scanedImage?: Blob - sheets?: Sheets + noteData: ImageNoteData + setNoteData: SetStoreFunction } export interface ScanedImageEditedData { sheets: Sheets image: Blob } export const ScanedImageEditor = (props: Props) => { - const [scanedImageBlob, setScanedImageBlob] = createSignal(props.scanedImage) const dialog = createDialog() - + let scanInputRef!: HTMLInputElement const reScan = () => { scanInputRef.oninput = () => { - if (!scanInputRef.files){ + if (!scanInputRef.files) { return } const imageFile = scanInputRef.files[0] if (!imageFile) { return } - setScanedImageBlob(() => imageFile) + props.setNoteData('blobs', 'scanedImage', imageFile) } scanInputRef.click() } - const [sheets, setSheets] = createSignal(props.sheets ?? []) - return { - const nowScanedImageBlob = scanedImageBlob() - props.onEnd((result && nowScanedImageBlob) ? { - sheets: sheets(), - image: nowScanedImageBlob - } : null) - }} class="ml-5"> - -
- - - -
-
- -
- { - setSheets(sheets) - }} - sheets={sheets()} - /> -
-
- - -
-
-
-
+ +
+
+ +
+ { + props.setNoteData('canToJsonData', 'sheets', sheets) + }} + sheets={props.noteData.canToJsonData.sheets} + rescan={() => { + props.setNoteData('canToJsonData', 'sheets', []) + props.setNoteData('blobs', 'scanedImage', undefined) + }} + /> +
+
+ + +
+
+
+ + ) }