--divider-size: 4px;
--left-half-width: 70%;
--top-half-height: 30%;
+ --folder-width: 10%;
--tab-line-height: 24px;
}
cursor: pointer;
}
+#folder-view {
+ width: calc(var(--folder-width) - var(--divider-size));
+ float: left;
+}
+
+#code-container {
+ width: calc(100% - var(--folder-width));
+ float: left;
+}
+
.left-half, .right-half {
height: calc(100vh - var(--menu-bar-height));
float: left;
}
.left-half {
- width: calc(var(--left-half-width) - var(--divider-size) / 2);
+ width: var(--left-half-width);
}
.right-half {
- width: calc((100vw - var(--left-half-width)) - var(--divider-size) / 2);
+ width: calc(100% - var(--left-half-width) - var(--divider-size));
}
.top-half, .bottom-half {
color: #f55;
}
-#horizontal-divider {
+#code-horizontal-divider, #main-horizontal-divider {
min-width: var(--divider-size);
height: calc(100vh - var(--menu-bar-height));
background-color: #777;
display: inline-block;
float: left;
+ z-index: 1000;
}
#vertical-divider {
::-webkit-scrollbar-thumb {
background-color: var(--active-color);
- outline: 1px solid: var(--background-color);
+ outline: 1px solid var(--background-color);
+}
+
+.folder-item {
+ user-select: none;
+ position: relative;
+ cursor: pointer;
+ transition: all 200ms;
+ /* border-left: 2px solid var(--active-color); */
+ padding-left: 4px;
+}
+
+.folder-item:hover {
+ background-color: var(--light-background-color);
+}
+
+.folder {
+ position: relative;
+ left: 32px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.folder.root {
+ left: 0px !important;
+ overflow-y: auto;
+ overflow-x: hidden;
+ height: 100%;
+ max-height: calc(100vh - var(--menu-bar-height) - var(--tab-line-height)); /* subtract the padding */
+}
+
+.folder.root > .folder-item {
+ border-left: none !important;
+}
+
+.hidden {
+ display: none !important;
}
\ No newline at end of file
function load_split_sizes() {
let $root = $(":root");
+ $root.css("--folder-width", localStorage.getItem("folder-width"));
$root.css("--top-half-height", localStorage.getItem("top-half-height"));
$root.css("--left-half-width", localStorage.getItem("left-half-width"));
}
function save_split_sizes() {
let $root = $(":root");
+ localStorage.setItem("folder-width", $root.css("--folder-width"));
localStorage.setItem("top-half-height", $root.css("--top-half-height"));
localStorage.setItem("left-half-width", $root.css("--left-half-width"));
}
-
window.onload = () => {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register("/playground/static/src/service-worker.js", {
populate_examples();
load_settings();
+ // build_folder_view();
+
+ make_resizer("main-horizontal-divider", "--folder-width", "", (e) => {
+ save_split_sizes();
+ });
- make_resizer("horizontal-divider", "--left-half-width", "", (e) => {
+ make_resizer("code-horizontal-divider", "--left-half-width", "", (e) => {
editor.resize(true);
save_split_sizes();
});
$("#save-filename").on('keyup', (ev) => { if (ev.keyCode === 13) save_to_local_storage() });
$("#load-filename").on('keyup', (ev) => { if (ev.keyCode === 13) load_from_local_storage() });
};
+
+// Experimental Folder System
+/*
+let folders = [
+ {
+ "name": "Examples",
+ "type": "dir",
+ "state": "open",
+ "elems": [
+ {
+ "name": "example 1",
+ "type": "file",
+ },
+ {
+ "name": "example 2",
+ "type": "file",
+ },
+ {
+ "name": "example 3",
+ "type": "file",
+ },
+ {
+ "name": "Built ins",
+ "type": "dir",
+ "state": "open",
+ "elems": [
+ {
+ "name": "example 1",
+ "type": "file",
+ },
+ {
+ "name": "example 2",
+ "type": "file",
+ },
+ {
+ "name": "example 3",
+ "type": "file",
+ },
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Built ins",
+ "type": "dir",
+ "state": "open",
+ "elems": [
+ {
+ "name": "example 1",
+ "type": "file",
+ },
+ {
+ "name": "example 2",
+ "type": "file",
+ },
+ {
+ "name": "example 3",
+ "type": "file",
+ },
+ ],
+ },
+]
+
+function build_folder_view() {
+ let $root = $(".folder.root");
+
+ let build = (t) => {
+ let output = "";
+ switch (t.type) {
+ case "dir": {
+ output += `<div class="folder-item directory ${t.state}">
+ <i class="fa ${t.state == "open" ? "fa-folder-open" : "fa-folder"}"></i>
+ ${t.name}</div>`;
+
+ if (t.state == "open") {
+ output += `<div class="folder">`;
+ for (let i of t.elems) {
+ output += build(i);
+ }
+ output += `</div>`;
+ }
+
+ break;
+ }
+
+ case "file": {
+ output += `<div class="folder-item file">${t.name}</div>`;
+ break;
+ }
+ }
+
+ return output;
+ }
+
+ let root_html = "";
+ for (let elem of folders) {
+ root_html += build(elem);
+ }
+
+ $root.html(root_html);
+ $(".folder-item").click(folder_item_click);
+}
+
+function folder_item_click(e) {
+ let $target = $(e.target);
+ console.log($target);
+
+ if ($target.hasClass("file")) {
+ }
+
+ if ($target.hasClass("directory")) {
+ if ($target.hasClass("open")) {
+ $target.removeClass("open").addClass("closed");
+ $target.children("i").removeClass("fa-folder-open").addClass("fa-folder");
+ $target.next().addClass("hidden");
+ } else {
+ $target.removeClass("closed").addClass("open");
+ $target.children("i").removeClass("fa-folder").addClass("fa-folder-open");
+ $target.next().removeClass("hidden");
+ }
+ }
+}
+*/
\ No newline at end of file
<option value="none">---</option>
</select>
</div>
+
+ <!--
+ <div id="folder-view" class="hidden">
+ <div class="tab-line"><span>Storage</span></div>
- <div class="left-half">
- <div class="tab-line"><span>Code</span></div>
- <pre id="code-editor" ondragover="handle_dragover(event);" ondrop="handle_drop(event);">{{ code_body }}</pre>
+ <div class="folder root">
+ </div>
</div>
- <div id="horizontal-divider" class="divider"></div>
+ <div id="main-horizontal-divider" class="divider hidden"></div>
+ -->
+
+ <div id="code-container">
+ <div class="left-half">
+ <div class="tab-line"><span>Code</span></div>
+ <pre id="code-editor" ondragover="handle_dragover(event);" ondrop="handle_drop(event);">{{ code_body }}</pre>
+ </div>
+
+ <div id="code-horizontal-divider" class="divider"></div>
- <div class="right-half">
- <div class="tab-line"><span>Canvas</span></div>
- <canvas id="render-target"></canvas>
+ <div class="right-half">
+ <div class="tab-line"><span>Canvas</span></div>
+ <canvas id="render-target"></canvas>
- <div id="vertical-divider" class="divider"></div>
+ <div id="vertical-divider" class="divider"></div>
- <div class="tab-line"><span>Output</span></div>
- <pre id="code-result"></pre>
- <input type="textbox" id="input-bar" placeholder="Input" />
- <!--<input type="button" id="input-submit" value="Enter" onclick="submit_input()" /> -->
+ <div class="tab-line"><span>Output</span></div>
+ <pre id="code-result"></pre>
+ <input type="textbox" id="input-bar" placeholder="Input" />
+ <!--<input type="button" id="input-submit" value="Enter" onclick="submit_input()" /> -->
+ </div>
</div>
+
<div id="settings-modal" class="modal">
<h2>Settings</h2>