diff --git a/bindings/wasm/examples/editor.css b/bindings/wasm/examples/editor.css index 1fddb7a71..b188a3906 100644 --- a/bindings/wasm/examples/editor.css +++ b/bindings/wasm/examples/editor.css @@ -133,15 +133,11 @@ model-viewer { margin: 1em; } -#file { - width: 250px; -} - .dropdown { display: none; position: absolute; z-index: 1; - width: 250px; + width: 100%; max-height: 80vh; overflow-y: auto; } @@ -150,6 +146,10 @@ model-viewer { display: block; } +.hide { + display: none; +} + .uparrow { display: inline-block; position: relative; @@ -174,6 +174,7 @@ model-viewer { position: absolute; width: 36px; top: 0px; + right: 0px; background-size: 20px; background-repeat: no-repeat; background-position: center; @@ -193,7 +194,6 @@ model-viewer { .trash { background-image: url(/icons/trash.png); - right: 0px; } .icon:hover { diff --git a/bindings/wasm/examples/editor.js b/bindings/wasm/examples/editor.js index 224965561..c79be04e0 100644 --- a/bindings/wasm/examples/editor.js +++ b/bindings/wasm/examples/editor.js @@ -26,20 +26,31 @@ let editor = undefined; // File UI ------------------------------------------------------------ const fileButton = document.querySelector('#file'); -const currentElement = document.querySelector('#current'); -const arrow = document.querySelector('.uparrow'); -const dropdown = document.querySelector('.dropdown'); +const currentFileElement = document.querySelector('#current'); +const fileArrow = document.querySelector('#file .uparrow'); +const fileDropdown = document.querySelector('#fileDropdown'); +const saveContainer = document.querySelector('#save'); +const saveDropdown = document.querySelector('#saveDropdown'); +const saveArrow = document.querySelector('#save .uparrow'); const hideDropdown = function() { - dropdown.classList.remove('show'); - arrow.classList.remove('down'); + fileDropdown.classList.remove('show'); + saveDropdown.classList.remove('show'); + fileArrow.classList.remove('down'); + saveArrow.classList.remove('down'); }; -const toggleDropdown = function(event) { +const toggleFileDropdown = function(event) { event.stopPropagation(); - dropdown.classList.toggle('show'); - arrow.classList.toggle('down'); + fileDropdown.classList.toggle('show'); + fileArrow.classList.toggle('down'); }; -fileButton.onclick = toggleDropdown; +const toggleSaveDropdown = function(event) { + event.stopPropagation(); + saveDropdown.classList.toggle('show'); + saveArrow.classList.toggle('down'); +}; +fileButton.onclick = toggleFileDropdown; +saveArrow.parentElement.onclick = toggleSaveDropdown; document.body.onclick = hideDropdown; const prefix = 'ManifoldCAD'; @@ -62,7 +73,7 @@ function nthKey(n) { function saveCurrent() { if (editor) { - const currentName = currentElement.textContent; + const currentName = currentFileElement.textContent; if (!exampleFunctions.get(currentName)) { setScript(currentName, editor.getValue()); } @@ -77,7 +88,7 @@ let isExample = true; function switchTo(scriptName) { if (editor) { switching = true; - currentElement.textContent = scriptName; + currentFileElement.textContent = scriptName; setScript('currentName', scriptName); const code = exampleFunctions.get(scriptName) ?? getScript(scriptName) ?? ''; @@ -148,8 +159,8 @@ function addEdit(button) { if (!input) return; const newName = uniqueName(input); label.textContent = newName; - if (currentElement.textContent == oldName) { - currentElement.textContent = newName; + if (currentFileElement.textContent == oldName) { + currentFileElement.textContent = newName; } removeScript(oldName); setScript(newName, code); @@ -182,7 +193,7 @@ function addEdit(button) { }, {once: true}); } else if (performance.now() - lastClick > 500) { removeScript(label.textContent); - if (currentElement.textContent == label.textContent) { + if (currentFileElement.textContent == label.textContent) { switchTo('Intro'); } const container = button.parentElement; @@ -269,10 +280,10 @@ require(['vs/editor/editor.main'], async function() { for (const [name] of exampleFunctions) { const button = createDropdownItem(name); - dropdown.appendChild(button.parentElement); + fileDropdown.appendChild(button.parentElement); } - let currentName = currentElement.textContent; + let currentName = currentFileElement.textContent; for (let i = 0; i < window.localStorage.length; i++) { const key = nthKey(i); @@ -419,7 +430,14 @@ runButton.onclick = function() { }; const glbButton = document.querySelector('#glb'); +const glbContainer = glbButton.parentElement; glbButton.onclick = function() { + const oldSave = saveContainer.firstElementChild; + if (oldSave !== glbContainer) { + saveDropdown.insertBefore(oldSave, saveDropdown.firstElementChild); + saveContainer.insertBefore(glbContainer, saveDropdown); + glbContainer.appendChild(saveArrow.parentElement); + } const link = document.createElement('a'); link.download = 'manifold.glb'; link.href = glbURL; @@ -427,7 +445,14 @@ glbButton.onclick = function() { }; const threemfButton = document.querySelector('#threemf'); +const threemfContainer = threemfButton.parentElement; threemfButton.onclick = function() { + const oldSave = saveContainer.firstElementChild; + if (oldSave !== threemfContainer) { + saveDropdown.insertBefore(oldSave, saveDropdown.firstElementChild); + saveContainer.insertBefore(threemfContainer, saveDropdown); + threemfContainer.appendChild(saveArrow.parentElement); + } const link = document.createElement('a'); link.download = 'manifold.3mf'; link.href = threeMFURL; diff --git a/bindings/wasm/examples/index.html b/bindings/wasm/examples/index.html index 74037e1db..0c025d35f 100644 --- a/bindings/wasm/examples/index.html +++ b/bindings/wasm/examples/index.html @@ -40,16 +40,25 @@

ManifoldCAD

-
- - - - +
+
+ + +
+ +
@@ -75,4 +84,4 @@ - + \ No newline at end of file