diff options
| author | Hsieh Chin Fan <pham@topo.tw> | 2024-10-28 12:23:25 +0800 |
|---|---|---|
| committer | Hsieh Chin Fan <pham@topo.tw> | 2024-10-28 19:44:05 +0800 |
| commit | 6d8400e11ac5ebb05b43a12367384e686f834d7c (patch) | |
| tree | b82e4d38d71921943dcb9882ee4333d0d0cb94c9 /src | |
| parent | 65680175fc04e71b362458745727974af73f711c (diff) | |
feat: add menu-item for edit map without editor
Diffstat (limited to 'src')
| -rw-r--r-- | src/MenuItem.mjs | 33 | ||||
| -rw-r--r-- | src/css/dumbymap.css | 7 | ||||
| -rw-r--r-- | src/dumbymap.mjs | 41 | ||||
| -rw-r--r-- | src/editor.mjs | 1 |
4 files changed, 71 insertions, 11 deletions
diff --git a/src/MenuItem.mjs b/src/MenuItem.mjs index d9645f7..eb683ea 100644 --- a/src/MenuItem.mjs +++ b/src/MenuItem.mjs | |||
| @@ -523,3 +523,36 @@ export const addMarker = ({ | |||
| 523 | callback?.(marker) | 523 | callback?.(marker) |
| 524 | }, | 524 | }, |
| 525 | }) | 525 | }) |
| 526 | |||
| 527 | /** | ||
| 528 | * editByRawText. | ||
| 529 | * | ||
| 530 | * @param {HTMLElement} ele | ||
| 531 | */ | ||
| 532 | export const editMapByRawText = (ele) => new Item({ | ||
| 533 | text: 'Edit by Raw Text', | ||
| 534 | onclick: () => { | ||
| 535 | const maps = Array.from(ele.querySelectorAll('.mapclay')) | ||
| 536 | if (!maps) return false | ||
| 537 | |||
| 538 | const rect = ele.getBoundingClientRect() | ||
| 539 | const textArea = document.createElement('textarea') | ||
| 540 | textArea.className = 'edit-map' | ||
| 541 | textArea.style.cssText = `width: ${rect.width}px; height: ${rect.height}px;` | ||
| 542 | textArea.value = maps.map(map => map.dataset.mapclay ?? '') | ||
| 543 | .join('---') | ||
| 544 | .replaceAll(',', '\n') | ||
| 545 | .replaceAll(/["{}]/g, '') | ||
| 546 | .replaceAll(/:(\w)/g, ': $1') | ||
| 547 | |||
| 548 | textArea.addEventListener('focusout', () => { | ||
| 549 | const code = document.createElement('code') | ||
| 550 | code.className = 'map' | ||
| 551 | code.textContent = textArea.value | ||
| 552 | textArea.replaceWith(code) | ||
| 553 | }) | ||
| 554 | ele.replaceChildren(textArea) | ||
| 555 | |||
| 556 | return true | ||
| 557 | }, | ||
| 558 | }) | ||
diff --git a/src/css/dumbymap.css b/src/css/dumbymap.css index d641785..f0b4575 100644 --- a/src/css/dumbymap.css +++ b/src/css/dumbymap.css | |||
| @@ -740,3 +740,10 @@ pre:has(.mapclay) { | |||
| 740 | .draggable-block:has(pre:only-child [data-placeholder]:only-child) { | 740 | .draggable-block:has(pre:only-child [data-placeholder]:only-child) { |
| 741 | display: none; | 741 | display: none; |
| 742 | } | 742 | } |
| 743 | |||
| 744 | textarea .edit-map { | ||
| 745 | text-wrap: nowrap; | ||
| 746 | |||
| 747 | font-size: 1.1rem; | ||
| 748 | line-height: 1.5; | ||
| 749 | } | ||
diff --git a/src/dumbymap.mjs b/src/dumbymap.mjs index 46a67a0..3792994 100644 --- a/src/dumbymap.mjs +++ b/src/dumbymap.mjs | |||
| @@ -551,7 +551,17 @@ export const generateMaps = (container, { | |||
| 551 | }).observe(menu, { childList: true }) | 551 | }).observe(menu, { childList: true }) |
| 552 | menu.timer = setTimeout(() => menu.remove(), 100) | 552 | menu.timer = setTimeout(() => menu.remove(), 100) |
| 553 | 553 | ||
| 554 | // Menu Items for Links | 554 | /** Menu Item for editing map */ |
| 555 | const mapEditor = e.target.closest('.edit-map') | ||
| 556 | if (mapEditor) { | ||
| 557 | menu.appendChild(new menuItem.Item({ | ||
| 558 | text: 'Finish Editig', | ||
| 559 | onclick: () => mapEditor.blur(), | ||
| 560 | })) | ||
| 561 | return | ||
| 562 | } | ||
| 563 | |||
| 564 | /** Menu Items for Links */ | ||
| 555 | const geoLink = e.target.closest('.geolink') | 565 | const geoLink = e.target.closest('.geolink') |
| 556 | if (geoLink) { | 566 | if (geoLink) { |
| 557 | if (geoLink.classList.contains('from-text')) { | 567 | if (geoLink.classList.contains('from-text')) { |
| @@ -575,22 +585,31 @@ export const generateMaps = (container, { | |||
| 575 | } | 585 | } |
| 576 | 586 | ||
| 577 | // Menu Items for map | 587 | // Menu Items for map |
| 578 | if (map?.dataset?.render === 'fulfilled') { | 588 | if (map) { |
| 579 | const rect = map.getBoundingClientRect() | 589 | const rect = map.getBoundingClientRect() |
| 580 | const [x, y] = [e.x - rect.left, e.y - rect.top] | 590 | const [x, y] = [e.x - rect.left, e.y - rect.top] |
| 581 | menu.appendChild(menuItem.toggleMapFocus(map)) | ||
| 582 | menu.appendChild(menuItem.renderResults(dumbymap, map)) | ||
| 583 | menu.appendChild(new menuItem.Folder({ | 591 | menu.appendChild(new menuItem.Folder({ |
| 584 | text: 'Actions', | 592 | text: 'Edit Map', |
| 585 | items: [ | 593 | items: [ |
| 586 | menuItem.getCoordinatesByPixels(map, [x, y]), | 594 | menuItem.editMapByRawText(map.parentElement), |
| 587 | menuItem.restoreCamera(map), | ||
| 588 | menuItem.addMarker({ | ||
| 589 | point: [e.pageX, e.pageY], | ||
| 590 | map, | ||
| 591 | }), | ||
| 592 | ], | 595 | ], |
| 593 | })) | 596 | })) |
| 597 | menu.appendChild(menuItem.renderResults(dumbymap, map)) | ||
| 598 | |||
| 599 | if (map.dataset.render === 'fulfilled') { | ||
| 600 | menu.appendChild(menuItem.toggleMapFocus(map)) | ||
| 601 | menu.appendChild(new menuItem.Folder({ | ||
| 602 | text: 'Actions', | ||
| 603 | items: [ | ||
| 604 | menuItem.getCoordinatesByPixels(map, [x, y]), | ||
| 605 | menuItem.restoreCamera(map), | ||
| 606 | menuItem.addMarker({ | ||
| 607 | point: [e.pageX, e.pageY], | ||
| 608 | map, | ||
| 609 | }), | ||
| 610 | ], | ||
| 611 | })) | ||
| 612 | } | ||
| 594 | } else { | 613 | } else { |
| 595 | // Toggle block focus | 614 | // Toggle block focus |
| 596 | if (block) { | 615 | if (block) { |
diff --git a/src/editor.mjs b/src/editor.mjs index b023d1a..f7b9c65 100644 --- a/src/editor.mjs +++ b/src/editor.mjs | |||
| @@ -901,6 +901,7 @@ cm.on('keydown', (_, e) => { | |||
| 901 | }) | 901 | }) |
| 902 | 902 | ||
| 903 | document.onkeydown = e => { | 903 | document.onkeydown = e => { |
| 904 | if (document.activeElement.matches('textarea')) return null | ||
| 904 | if (e.altKey && e.ctrlKey && e.key === 'm') { | 905 | if (e.altKey && e.ctrlKey && e.key === 'm') { |
| 905 | toggleEditing() | 906 | toggleEditing() |
| 906 | e.preventDefault() | 907 | e.preventDefault() |