Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 40 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -415,14 +415,14 @@ patchmap.stateManager.setState('selection', {
draggable: true,
selectUnit: 'grid',
filter: (obj) => obj.type !== 'relations',
onSelect: (obj, event) => {
onClick: (obj, event) => {
console.log('Selected:', obj);
// Assign the selected object to the transformer
if (patchmap.transformer) {
patchmap.transformer.elements = obj;
}
},
onDragSelect: (objs, event) => {
onDrag: (objs, event) => {
console.log('Drag Selected:', objs);
if (patchmap.transformer) {
patchmap.transformer.elements = objs;
Expand Down Expand Up @@ -488,30 +488,59 @@ The default state that handles user selection and drag events. It is automatical
- `'highestGroup'`: Selects the topmost parent group of the selected object.
- `'grid'`: Selects the grid to which the selected object belongs.
- `filter` (optional, function): A function to filter selectable objects based on a condition.
- `onSelect` (optional, function): A callback function invoked when an object is selected via a single click. It receives the selected object and the event object as arguments.
- `onDragSelect` (optional, function): A callback function invoked when multiple objects are selected via dragging. It receives an array of selected objects and the event object as arguments.
- `selectionBoxStyle` (optional, object): Specifies the style of the selection box displayed during drag-selection.
- `fill` (object): The fill style. Default: `{ color: '#9FD6FF', alpha: 0.2 }`.
- `stroke` (object): The stroke style. Default: `{ width: 2, color: '#1099FF' }`.

#### Event Callbacks

- `onDown` (optional, function): Callback fired immediately on `pointerdown`. Used to implement 'Select-on-Down' UX (instant selection feedback).
- `onUp` (optional, function): Callback fired on `pointerup` if it was not a drag operation.
- `onClick` (optional, function): Callback fired when a complete 'click' is detected. This will not fire if `onDoubleClick` fires.
- `onDoubleClick` (optional, function): Callback fired when a complete 'double-click' is detected. Based on `e.detail === 2`.
- `onDragStart` (optional, function): Callback fired *once* when a drag operation (for multi-selection) begins (after moving beyond a threshold).
- `onDrag` (optional, function): Callback fired repeatedly *during* a drag operation.
- `onDragEnd` (optional, function): Callback fired when the drag operation *ends* (`pointerup`).
- `onOver` (optional, function): Callback fired on `pointerover` when the pointer enters a new object (and not dragging).

```js
patchmap.stateManager.setState('selection', {
draggable: true,
selectUnit: 'grid',
filter: (obj) => obj.type !== 'relations',
onSelect: (obj, event) => {
console.log('Selected:', obj);
// Assign the selected object to the transformer

// Confirms selection on 'click' completion.
onClick: (target, event) => {
console.log('Clicked:', target?.id);
if (patchmap.transformer) {
patchmap.transformer.elements = obj;
patchmap.transformer.elements = target ? [target] : [];
}
},
onDragSelect: (objs, event) => {
console.log('Drag Selected:', objs);

// Performs another action on 'double-click'. (onClick will not be called in this case)
onDoubleClick: (target, event) => {
console.log('Double Clicked:', target?.id);
// e.g., patchmap.stateManager.setState('textEdit', target);
},

// Confirms the final selection when the drag ends.
onDragEnd: (selected, event) => {
console.log('Drag Selected:', selected.map(s => s.id));
if (patchmap.transformer) {
patchmap.transformer.elements = objs;
patchmap.transformer.elements = selected;
}
},

// onDown: (target) => {
// if (patchmap.transformer) {
// patchmap.transformer.elements = target ? [target] : [];
// }
// },
// onDragStart: () => {
// if (patchmap.transformer) {
// patchmap.transformer.elements = [];
// }
// },
});
```

Expand Down
50 changes: 39 additions & 11 deletions README_KR.md
Original file line number Diff line number Diff line change
Expand Up @@ -425,14 +425,14 @@ patchmap.stateManager.setState('selection', {
draggable: true,
selectUnit: 'grid',
filter: (obj) => obj.type !== 'relations',
onSelect: (obj, event) => {
onClick: (obj, event) => {
console.log('Selected:', obj);
// μ„ νƒλœ 객체λ₯Ό transformer에 ν• λ‹Ή
if (patchmap.transformer) {
patchmap.transformer.elements = obj;
}
},
onDragSelect: (objs, event) => {
onDrag: (objs, event) => {
console.log('Drag Selected:', objs);
if (patchmap.transformer) {
patchmap.transformer.elements = objs;
Expand Down Expand Up @@ -497,30 +497,58 @@ patchmap.stateManager.setState('custom', { message: 'Hello World' });
- `'highestGroup'`: μ„ νƒλœ κ°μ²΄μ—μ„œ κ°€μž₯ μ΅œμƒμœ„ 그룹을 μ„ νƒν•©λ‹ˆλ‹€.
- `'grid'`: μ„ νƒλœ 객체가 μ†ν•œ κ·Έλ¦¬λ“œλ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
- `filter` (optional, function): 선택 λŒ€μƒ 객체λ₯Ό 쑰건에 따라 필터링할 수 μžˆλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
- `onSelect` (optional, function): 단일 클릭으둜 객체 선택이 λ°œμƒν–ˆμ„ λ•Œ 호좜될 콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€. μ„ νƒλœ 객체와 이벀트 객체λ₯Ό 인자둜 λ°›μŠ΅λ‹ˆλ‹€.
- `onDragSelect` (optional, function): λ“œλž˜κ·Έλ₯Ό 톡해 λ‹€μˆ˜μ˜ 객체가 μ„ νƒλ˜μ—ˆμ„ λ•Œ 호좜될 콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€. μ„ νƒλœ 객체 λ°°μ—΄κ³Ό 이벀트 객체λ₯Ό 인자둜 λ°›μŠ΅λ‹ˆλ‹€.
- `selectionBoxStyle` (optional, object): λ“œλž˜κ·Έ 선택 μ‹œ ν‘œμ‹œλ˜λŠ” μ‚¬κ°ν˜•μ˜ μŠ€νƒ€μΌμ„ μ§€μ •ν•©λ‹ˆλ‹€.
- `fill` (object): μ±„μš°κΈ° μŠ€νƒ€μΌ. κΈ°λ³Έκ°’: `{ color: '#9FD6FF', alpha: 0.2 }`.
- `stroke` (object): ν…Œλ‘λ¦¬ μŠ€νƒ€μΌ. κΈ°λ³Έκ°’: `{ width: 2, color: '#1099FF' }`.

#### 이벀트 콜백
- `onDown` (optional, function): 포인터λ₯Ό λˆŒλ €μ„ λ•Œ 'μ¦‰μ‹œ' ν˜ΈμΆœλ©λ‹ˆλ‹€. 'Select-on-Down' UX(즉각적인 선택 ν”Όλ“œλ°±)λ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
- `onUp` (optional, function): λ“œλž˜κ·Έκ°€ 아닐 경우, `pointerup` μ‹œμ μ— ν˜ΈμΆœλ©λ‹ˆλ‹€.
- `onClick` (optional, function): '클릭'이 'μ™„λ£Œ'λ˜μ—ˆμ„ λ•Œ ν˜ΈμΆœλ©λ‹ˆλ‹€. 더블클릭이 아닐 λ•Œλ§Œ ν˜ΈμΆœλ©λ‹ˆλ‹€.
- `onDoubleClick` (optional, function): '더블클릭'이 'μ™„λ£Œ'λ˜μ—ˆμ„ λ•Œ ν˜ΈμΆœλ©λ‹ˆλ‹€. `e.detail === 2`λ₯Ό 기반으둜 ν˜ΈμΆœλ©λ‹ˆλ‹€.
- `onDragStart` (optional, function): λ“œλž˜κ·Έ(닀쀑 선택)κ°€ 'μ‹œμž‘'λ˜λŠ” μ‹œμ  (일정 거리 이상 이동)에 1회 ν˜ΈμΆœλ©λ‹ˆλ‹€.
- `onDrag` (optional, function): λ“œλž˜κ·Έκ°€ 'μ§„ν–‰'λ˜λŠ” λ™μ•ˆ μ‹€μ‹œκ°„μœΌλ‘œ ν˜ΈμΆœλ©λ‹ˆλ‹€.
- `onDragEnd` (optional, function): λ“œλž˜κ·Έκ°€ 'μ’…λ£Œ'λ˜μ—ˆμ„ λ•Œ (`pointerup`) ν˜ΈμΆœλ©λ‹ˆλ‹€.
- `onOver` (optional, function): 포인터가 (λ“œλž˜κ·Έ 쀑이 아닐 λ•Œ) 객체 μœ„λ‘œ μ΄λ™ν–ˆμ„ λ•Œ ν˜ΈμΆœλ©λ‹ˆλ‹€.

```js
patchmap.stateManager.setState('selection', {
draggable: true,
selectUnit: 'grid',
filter: (obj) => obj.type !== 'relations',
onSelect: (obj, event) => {
console.log('Selected:', obj);
// μ„ νƒλœ 객체λ₯Ό transformer에 ν• λ‹Ή

// '클릭' μ™„λ£Œ μ‹œ 선택을 ν™•μ •ν•©λ‹ˆλ‹€.
onClick: (target, event) => {
console.log('Clicked:', target?.id);
if (patchmap.transformer) {
patchmap.transformer.elements = obj;
patchmap.transformer.elements = target ? [target] : [];
}
},
onDragSelect: (objs, event) => {
console.log('Drag Selected:', objs);

// '더블클릭' μ‹œ λ‹€λ₯Έ λ™μž‘μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. (이 경우 onClick은 ν˜ΈμΆœλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€)
onDoubleClick: (target, event) => {
console.log('Double Clicked:', target?.id);
// 예: patchmap.stateManager.setState('textEdit', target);
},

// λ“œλž˜κ·Έκ°€ 끝났을 λ•Œ μ΅œμ’… 선택을 ν™•μ •ν•©λ‹ˆλ‹€.
onDragEnd: (selected, event) => {
console.log('Drag Selected:', selected.map(s => s.id));
if (patchmap.transformer) {
patchmap.transformer.elements = objs;
patchmap.transformer.elements = selected;
}
},

// onDown: (target) => {
// if (patchmap.transformer) {
// patchmap.transformer.elements = target ? [target] : [];
// }
// },
// onDragStart: () => {
// if (patchmap.transformer) {
// patchmap.transformer.elements = [];
// }
// },
});
```

Expand Down
12 changes: 5 additions & 7 deletions biome.json
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
"$schema": "https://biomejs.dev/schemas/2.3.5/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false,
"ignore": ["node_modules", "dist", "package-lock.json"]
"includes": ["**", "!**/node_modules", "!**/dist", "!**/package-lock.json"]
},
"formatter": {
"useEditorconfig": true,
"ignore": ["package.json"]
},
"organizeImports": {
"enabled": true
"includes": ["**", "!**/package.json"]
},
"assist": { "actions": { "source": { "organizeImports": "on" } } },
"linter": {
"enabled": true,
"ignore": ["package.json"],
"includes": ["**", "!**/package.json"],
"rules": {
"recommended": true,
"suspicious": {
Expand Down
Loading