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)
+ }
}}>
{/* 本体 */}
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
-
-
+
+
+
+
+
-
-
-
-
})
-
-
- {
- const nowTmpSheet = tmpSheet()
- return (nowTmpSheet && typeof nowTmpSheet !== 'number') ? [nowTmpSheet.sheet] : []
- })()]}
- onClickSheet={sheetClicked}
- width={imageSize().w}
- height={imageSize().h}
- />
-
-
-
+ >
+
+
+
})
+
+
+ {
+ 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
+ )
}