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