diff --git a/src/main/index.js b/src/main/index.js index 71a493435..7455ace54 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -1,5 +1,5 @@ import { app, BrowserWindow, ipcMain, Menu } from 'electron' -import Communicator from "./communicator.js"; +import "./communicator.js"; import "./Discord"; /** diff --git a/src/renderer/components/sidebar/content/Explorer.vue b/src/renderer/components/sidebar/content/Explorer.vue index 82f44edd4..bad8b668c 100644 --- a/src/renderer/components/sidebar/content/Explorer.vue +++ b/src/renderer/components/sidebar/content/Explorer.vue @@ -214,8 +214,10 @@ }, findDefaultProject() { + if(this.$store.state.Settings.default_project === undefined) return this.items[0]; + for(let i = 0; i < this.items.length; i++) { - if(this.items[i].toLowerCase() == this.$store.state.Settings.default_project.toLowerCase()) + if(this.items[i].toLowerCase() === this.$store.state.Settings.default_project.toLowerCase()) return this.items[i]; } return this.items[0]; diff --git a/src/renderer/components/windowFactory/Window.vue b/src/renderer/components/windowFactory/Window.vue index 949436827..21857c459 100644 --- a/src/renderer/components/windowFactory/Window.vue +++ b/src/renderer/components/windowFactory/Window.vue @@ -53,7 +53,7 @@ v-if="has_sidebar" :style="` width: 59px; - border-right: 1px solid rgba(255,255,255,0.12); + border-right: 1px solid rgba(${is_dark_mode ? '255' : '0'}, ${is_dark_mode ? '255' : '0'}, ${is_dark_mode ? '255' : '0'}, 0.12); position: absolute; height: ${(is_fullscreen ? maxHeight : height) - 20}px; overflow-y: auto; @@ -157,6 +157,9 @@ export default { is_persistent() { return !this.win.options || this.win.options.is_persistent == undefined || this.win.options.is_persistent; }, + is_dark_mode() { + return this.$store.state.Appearance.is_dark_mode; + }, width() { if(!this.win.options || this.win.options.width == undefined) return 500; return this.win.options.width; diff --git a/src/renderer/components/windowFactory/WindowContent.vue b/src/renderer/components/windowFactory/WindowContent.vue index 9fbc1ffad..c32f84e48 100644 --- a/src/renderer/components/windowFactory/WindowContent.vue +++ b/src/renderer/components/windowFactory/WindowContent.vue @@ -4,7 +4,7 @@ v-if="content.type == 'text' || content.type == undefined" :class="`${pre_color} ${content.action != undefined ? 'click-action' : ''}`" @click.stop="action.default" - style="overflow-x: scroll;" + style="overflow-x: auto;" >{{ content.text }} - - - + + + { - if(document.activeElement.tagName === "BODY") { + if(document.activeElement.tagName === "BODY" || window.getSelection().toString() == "") { try { let node = TabSystem.getCurrentNavObj(); let obj = { [node.key]: node.toJSON() }; @@ -190,7 +190,7 @@ const state = { title: "Cut", shortcut: "Ctrl + X", action: () => { - if(document.activeElement.tagName === "BODY") { + if(document.activeElement.tagName === "BODY" || window.getSelection().toString() == "") { try { let node = TabSystem.getCurrentNavObj(); //HISTORY @@ -216,10 +216,12 @@ const state = { if(document.activeElement.tagName === "BODY") { try { TabSystem.getCurrentNavObj().buildFromObject(JSON.parse(clipboard.readText()), undefined, true); + TabSystem.setCurrentUnsaved(); } catch(e) { //Try again with a fix if the key was still in front try { TabSystem.getCurrentNavObj().buildFromObject(JSON.parse("{" + clipboard.readText() + "}"), undefined, true); + TabSystem.setCurrentUnsaved(); } catch(e) {} } } else { diff --git a/src/renderer/windows/AddSnippet.js b/src/renderer/windows/AddSnippet.js index 4f0793c7c..79845d9cc 100644 --- a/src/renderer/windows/AddSnippet.js +++ b/src/renderer/windows/AddSnippet.js @@ -16,7 +16,7 @@ export default class AddSnippetWindow extends ContentWindow { }, "add_snippets."); this.data = { - name: "Custom Snippet", + name: "", file_type: "entity", data_path: "minecraft:entity/components", force_scope: false @@ -67,10 +67,12 @@ export default class AddSnippetWindow extends ContentWindow { color: "success", text: "Add!", action: () => { - let data = this.getTemplate(this.data.template) - if(data === undefined) return new InformationWindow("Invalid Template", "\nThe provided template does not contain valid JSON."); + let data = this.getTemplate(this.data.template); + if(this.data.name === "") return new InformationWindow("Invalid Snippet Name", "\nYou need to provide a name for your snippet."); + if(data === undefined) return new InformationWindow("Invalid Template", "\nThe provided snippet template does not contain valid JSON."); let s = { + key: "custom_" + Math.random(), file_type: this.data.file_type, display_name: this.data.name, template: { @@ -82,7 +84,7 @@ export default class AddSnippetWindow extends ContentWindow { parent.save({ custom_snippets: parent.data.custom_snippets.concat([ s ]) }); parent.select(undefined, true); - Snippets.addSnippet(Math.random(), s); + Snippets.addSnippet(s); this.close(); } } diff --git a/src/renderer/windows/Settings.js b/src/renderer/windows/Settings.js index 12c122fb0..4a2aec8e3 100644 --- a/src/renderer/windows/Settings.js +++ b/src/renderer/windows/Settings.js @@ -5,30 +5,32 @@ import { MINECRAFT_VERSIONS, BASE_PATH } from "../scripts/constants"; import EventBus from "../scripts/EventBus"; import fs from "fs"; import AddSnippetWindow from "./AddSnippet"; +import Snippets from "./Snippets"; class ReactiveListEntry { constructor(text, parent, watch_key, index) { - this.type = "container"; - this.content = [ + this.type = "card"; + this.below_content = [ { - type: "icon", + text: text + }, + { + type: "space" + }, + { + type: "icon-button", text: "mdi-delete", color: "error", + only_icon: true, action: () => { - console.log(parent.data[watch_key].filter((e, i) => index !== i)); + Snippets.removeSnippet(parent.data[watch_key][index]); parent.save({ [watch_key]: parent.data[watch_key].filter((e, i) => index !== i) }); parent.select(undefined, true); } - }, - { - text: text - }, - { - type: "divider" } - ]; + ] } } class ReactiveList { @@ -36,10 +38,19 @@ class ReactiveList { this.parent = parent; this.watch_key = watch_key; } + get content() { + let arr = this.parent.data[this.watch_key]; + let res = []; + for(let i = 0; i < arr.length; i++) { + res.push(new ReactiveListEntry(arr[i].display_name, this.parent, this.watch_key, i)); + res.push({ text: "\n" }); + } + return res; + } get() { return { type: "container", - content: this.parent.data[this.watch_key].map((e, i) => new ReactiveListEntry(e.display_name, this.parent, this.watch_key, i)) + content: this.content }; } } @@ -176,6 +187,12 @@ export default class SettingsWindow extends TabWindow { only_icon: true, action: () => new AddSnippetWindow(this) }, + { + type: "divider" + }, + { + text: "\n" + }, () => new ReactiveList(this, "custom_snippets").get() ] }); diff --git a/src/renderer/windows/Snippets.js b/src/renderer/windows/Snippets.js index c3055d84e..0a6e97392 100644 --- a/src/renderer/windows/Snippets.js +++ b/src/renderer/windows/Snippets.js @@ -9,7 +9,8 @@ let SNIPPETS; fs.readFile(__static + "/data/snippets.json", (err, data) => { if(err) throw err; SNIPPETS = JSON.parse(data.toString()); - Store.state.Settings.custom_snippets.forEach(s => addSnippet(Math.random(), s)); + + if(Store.state.Settings.custom_snippets !== undefined) Store.state.Settings.custom_snippets.forEach(s => addSnippet(s)); }); function toArr() { @@ -39,9 +40,12 @@ function expandTemplateData(data, data_path) { } return return_data; } -function addSnippet(key, s) { +function addSnippet(s) { if(SNIPPETS[s.file_type] === undefined) SNIPPETS[s.file_type] = {}; - SNIPPETS[s.file_type]["custom_" + key] = s; + SNIPPETS[s.file_type][s.key] = s; +} +function removeSnippet(s) { + delete SNIPPETS[s.file_type][s.key]; } class SnippetWindow extends ContentWindow { @@ -113,5 +117,6 @@ export default { WIN = new SnippetWindow(); } }, - addSnippet + addSnippet, + removeSnippet } \ No newline at end of file