parent
e2971e85eb
commit
0ed5df3fcc
@ -0,0 +1,67 @@
|
|||||||
|
import {onMount, onCleanup} from "solid-js";
|
||||||
|
|
||||||
|
import styles from "./RightPane.module.css";
|
||||||
|
import input_styles from "./input/input.module.css";
|
||||||
|
|
||||||
|
import {World} from "../stackline-wasm/stackline_wasm.js";
|
||||||
|
|
||||||
|
export default function Controls(props) {
|
||||||
|
let {settings, setSettings, world, setWorld} = props;
|
||||||
|
let save_button, reload_button;
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
console.log("save");
|
||||||
|
window.localStorage.setItem("world", JSON.stringify(world().serialize()));
|
||||||
|
}
|
||||||
|
|
||||||
|
function reload() {
|
||||||
|
let new_world = window.localStorage.getItem("world");
|
||||||
|
if (!new_world) return;
|
||||||
|
|
||||||
|
new_world = JSON.parse(new_world);
|
||||||
|
new_world = World.deserialize(new_world);
|
||||||
|
|
||||||
|
setWorld(world => {
|
||||||
|
if (world.ptr) {
|
||||||
|
world.free();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_world;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function key_down(evt) {
|
||||||
|
if (evt.code === "KeyS" && evt.ctrlKey) {
|
||||||
|
evt.preventDefault();
|
||||||
|
|
||||||
|
save_button.classList.add(input_styles.active);
|
||||||
|
save();
|
||||||
|
setTimeout(() => {
|
||||||
|
save_button.classList.remove(input_styles.active);
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (evt.code === "KeyR" && evt.ctrlKey) {
|
||||||
|
evt.preventDefault();
|
||||||
|
|
||||||
|
reload_button.classList.add(input_styles.active);
|
||||||
|
reload();
|
||||||
|
setTimeout(() => {
|
||||||
|
reload_button.classList.remove(input_styles.active);
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
window.addEventListener("keydown", key_down, {capture: true});
|
||||||
|
});
|
||||||
|
|
||||||
|
onCleanup(() => {
|
||||||
|
window.removeEventListener("keydown", key_down);
|
||||||
|
});
|
||||||
|
|
||||||
|
return <div>
|
||||||
|
<button ref={save_button} class={input_styles.button} onClick={save}>Save</button>
|
||||||
|
<button ref={reload_button} class={input_styles.button} onClick={reload}>Reload</button>
|
||||||
|
</div>
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
import {createEffect, createSignal} from "solid-js";
|
||||||
|
import styles from "./Tabbed.module.css";
|
||||||
|
|
||||||
|
export default function Tabbed(props) {
|
||||||
|
let [current_tab, set_current_tab] = createSignal(0);
|
||||||
|
|
||||||
|
let children = props.children;
|
||||||
|
|
||||||
|
return <div class={styles.Tabbed}>
|
||||||
|
<ol class={styles.header}>
|
||||||
|
<For each={children.map(item => item.title)}>
|
||||||
|
{(item, index) => {
|
||||||
|
return <li
|
||||||
|
class={current_tab() == index() ? styles.active : null}
|
||||||
|
onClick={() => set_current_tab(index())}
|
||||||
|
>{item}</li>;
|
||||||
|
}}
|
||||||
|
</For>
|
||||||
|
</ol>
|
||||||
|
<ol class={styles.container}>
|
||||||
|
<For each={children}>
|
||||||
|
{(item, index) => {
|
||||||
|
return <li class={styles.body} class={current_tab() == index() ? styles.active : null}>{item}</li>
|
||||||
|
}}
|
||||||
|
</For>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
.Tabbed {
|
||||||
|
height: 25vh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: stretch;
|
||||||
|
align-items: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
flex-grow: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
background: #242830;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header > li {
|
||||||
|
box-sizing: border-box;
|
||||||
|
height: 2em;
|
||||||
|
padding: 0.5em;
|
||||||
|
color: #d0d0d0;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
border-top: 1px solid var(--border-color);
|
||||||
|
border-left: 1px solid var(--border-color);
|
||||||
|
border-right: 1px solid var(--border-color);
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
--border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header > li:hover {
|
||||||
|
color: white;
|
||||||
|
--border-color: #d0d0d0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header > li.active {
|
||||||
|
color: #f0f0f0;
|
||||||
|
background: #18181b;
|
||||||
|
--border-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header > li.active:hover {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.body:not(.active) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.body {
|
||||||
|
height: 100%;
|
||||||
|
padding: 1.5em 1em;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
Loading…
Reference in new issue