From c9df27e40f2627b87549488a0a5ac076b8fc0989 Mon Sep 17 00:00:00 2001 From: Daniel Stirba Date: Sun, 19 Feb 2023 21:18:34 +1100 Subject: [PATCH] Added Import/Export To Json Files. --- README.md | 1 + esbuild.config.mjs | 2 +- package.json | 2 +- prod.esbuild.config.mjs | 49 ++++ settings/Datatypes.ts | 36 ++- settings/SettingsTab.ts | 497 ++++++++++++++++++++++++++++------------ styles.css | 9 +- 7 files changed, 439 insertions(+), 157 deletions(-) create mode 100644 prod.esbuild.config.mjs diff --git a/README.md b/README.md index 623ab89..9f271f2 100644 --- a/README.md +++ b/README.md @@ -67,3 +67,4 @@ Below is a table for all the settings in this plugin - ~~Randomization within a note.~~ - Possibly more Generation type. - Better UI +- JSON Import And Export diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 96df176..08e2bcd 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -38,7 +38,7 @@ const context = await esbuild.context({ logLevel: "info", sourcemap: prod ? false : "inline", treeShaking: true, - outfile: "fantasy-content-generator/main.js", + outfile: "main.js", }); if (prod) { diff --git a/package.json b/package.json index 6e8427d..d70db25 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "main.js", "scripts": { "dev": "node esbuild.config.mjs", - "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production && copy manifest.json fantasy-content-generator && copy styles.css fantasy-content-generator && zip-build fantasy-content-generator builds", + "build": "tsc -noEmit -skipLibCheck && node prod.esbuild.config.mjs production && copy manifest.json fantasy-content-generator && copy styles.css fantasy-content-generator && zip-build fantasy-content-generator builds", "version": "node version-bump.mjs && git add manifest.json versions.json" }, "keywords": [], diff --git a/prod.esbuild.config.mjs b/prod.esbuild.config.mjs new file mode 100644 index 0000000..96df176 --- /dev/null +++ b/prod.esbuild.config.mjs @@ -0,0 +1,49 @@ +import esbuild from "esbuild"; +import process from "process"; +import builtins from "builtin-modules"; + +const banner = +`/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ +`; + +const prod = (process.argv[2] === "production"); + +const context = await esbuild.context({ + banner: { + js: banner, + }, + entryPoints: ["main.ts"], + bundle: true, + external: [ + "obsidian", + "electron", + "@codemirror/autocomplete", + "@codemirror/collab", + "@codemirror/commands", + "@codemirror/language", + "@codemirror/lint", + "@codemirror/search", + "@codemirror/state", + "@codemirror/view", + "@lezer/common", + "@lezer/highlight", + "@lezer/lr", + ...builtins, + ], + format: "cjs", + target: "es2018", + logLevel: "info", + sourcemap: prod ? false : "inline", + treeShaking: true, + outfile: "fantasy-content-generator/main.js", +}); + +if (prod) { + await context.rebuild(); + process.exit(0); +} else { + await context.watch(); +} \ No newline at end of file diff --git a/settings/Datatypes.ts b/settings/Datatypes.ts index 4689e52..c7a6ba9 100644 --- a/settings/Datatypes.ts +++ b/settings/Datatypes.ts @@ -1,3 +1,7 @@ + +import * as fs from 'fs'; +import { Notice } from 'obsidian'; + // The possible Options that could be selected durring inline generation export const possibleOptions = [ 'Gen-ElfMale', @@ -161,6 +165,10 @@ export type innGeneratorSettings = { rumors: string[] } +export interface FileWithPath extends File { + path: string +} + // the interface that uses all export interface FantasyPluginSettings { enableCurrency: boolean; @@ -173,4 +181,30 @@ export interface FantasyPluginSettings { groupSettings: groupGenSettings; dungeonSettings: dungeonGenSettings; inlineCallout: string; -} \ No newline at end of file +} + +export function importJSON(path: string, callback: (data: object) => void): void { + fs.readFile(path, 'utf8', (error, data) => { + if (error) { + new Notice("Error Importing: " + error); + return; + } + const jsonData = JSON.parse(data); + new Notice("Data Successfully Imported!"); + callback(jsonData); + }); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function exportJSON(data: any) { + const json = JSON.stringify(data); + const blob = new Blob([json], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + + const a = document.createElement('a'); + a.download = 'data.json'; + a.href = url; + a.click(); + + new Notice("Data Exporting!"); +} diff --git a/settings/SettingsTab.ts b/settings/SettingsTab.ts index 35ff503..f106da8 100644 --- a/settings/SettingsTab.ts +++ b/settings/SettingsTab.ts @@ -1,5 +1,6 @@ import FantasyPlugin from "main"; -import { PluginSettingTab, App, Setting } from "obsidian"; +import { PluginSettingTab, App, Setting, Platform } from "obsidian"; +import { cityGeneratorSetting, currency, drinkGeneratorSettings, dungeonGenSettings, exportJSON, FileWithPath, groupGenSettings, importJSON, innGeneratorSettings, lootTables } from "./Datatypes"; import { DEFAULT_SETTINGS } from "./DefaultSetting"; export class SettingTab extends PluginSettingTab { @@ -20,6 +21,7 @@ export class SettingTab extends PluginSettingTab { // eslint-disable-next-line @typescript-eslint/no-explicit-any createSettingsBlock(containerEl: HTMLElement, textA: string, arr: any[], type: string): void { + new Setting(containerEl).setName(type + " being used").setDesc("Click 'remove' for any item you want removed from the Array"); new Setting(containerEl) .setName("New Addition:") .addTextArea((text) => { @@ -36,9 +38,6 @@ export class SettingTab extends PluginSettingTab { }) }) - - containerEl.createEl("p", { text: "Click 'remove' on a prefix you would like to removed" }); - const foldDiv = containerEl.createEl('details', { cls: "OFCGDetails" }); foldDiv.createEl("summary", { text: type, cls: "OFCGSummary" }); @@ -56,7 +55,6 @@ export class SettingTab extends PluginSettingTab { ) } - containerEl.createEl('hr'); } @@ -66,8 +64,8 @@ export class SettingTab extends PluginSettingTab { containerEl.empty(); containerEl.createEl('h1', { text: 'Fantasy Content Generator' }); - - new Setting(containerEl) + const generalSettings = containerEl.createDiv("general") + new Setting(generalSettings) .setName('Reset To Defaults') .setDesc('Click if you would like to use the default settings again') .addButton((btn) => { @@ -80,7 +78,7 @@ export class SettingTab extends PluginSettingTab { }) }) - new Setting(containerEl).setName("Inline Generator Callout").setDesc("Set callout character to activate the inline Generator.") + new Setting(generalSettings).setName("Inline Generator Callout").setDesc("Set callout character to activate the inline Generator.") .addText((text) => { text.setValue(String(this.plugin.settings.inlineCallout)); text.onChange(async (value) => { @@ -91,9 +89,11 @@ export class SettingTab extends PluginSettingTab { // CURRENCEY SETTINGS // - containerEl.createEl("h2", { text: "Currency Settings" }); + const currencyEl = containerEl.createDiv("currencyDiv"); - new Setting(containerEl) + new Setting(currencyEl).setHeading().setName("Currency Settings"); + + new Setting(currencyEl) .setName('Enable Currency for Loot Generation.') .setDesc('If you have Currency in your World or game consider Activating this') .addToggle((toggle) => { @@ -107,7 +107,7 @@ export class SettingTab extends PluginSettingTab { if (this.plugin.settings.enableCurrency) { - new Setting(containerEl).setName("Occurance Rate:").setDesc("Set How Frequently Loot generates currency as a percentage of 100") + new Setting(currencyEl).setName("Occurance Rate:").setDesc("Set How Frequently Loot generates currency as a percentage of 100") .addText((text) => { text.setValue(String(this.plugin.settings.currencyFrequency)); text.onChange(async (value) => { @@ -119,11 +119,53 @@ export class SettingTab extends PluginSettingTab { }) }) + if (Platform.isDesktopApp) { + const importExportFile = new Setting(currencyEl) + .setName("Import | Export") + .setDesc("Import A Json File With Supported information"); + + const inputAppfile = createEl("input", { + attr: { + type: "file", + name: "currency", + accept: ".json", + multiple: false + } + }); + + inputAppfile.onchange = async () => { + const { files } = inputAppfile; + if (files === null || !files.length) return; + try { + const file = files[0] as FileWithPath; + importJSON(file.path, async (data) => { + this.plugin.settings.currencyTypes = data as currency[]; + this.display(); + await this.plugin.saveSettings(); + }); + + } catch (e) { /* empty */ } + } + + importExportFile.addButton((b) => { + b.setButtonText("Choose Import File").setTooltip( + "Import Json File for the Generator" + ).buttonEl.appendChild(inputAppfile) + b.buttonEl.addClass("FCGInput"); + b.onClick(() => inputAppfile.click()); + }).addButton((b) => { + b.setButtonText("Export Section To File").setCta() + .onClick(() => { + exportJSON(this.plugin.settings.currencyTypes); + }) + }); + } + const ctext = { name: '', rarity: 'common' } - new Setting(containerEl) + new Setting(currencyEl) .setName("Currency Name:") .addText((text) => { text.onChange((value) => { @@ -147,10 +189,9 @@ export class SettingTab extends PluginSettingTab { }) }) - containerEl.createEl("h4", { text: "Added Currency" }); - containerEl.createEl("p", { text: "Click remove on a currency you would like to removed" }); + new Setting(currencyEl).setName("Added currency").setDesc("Click Remove on a Currency you would like to Remove"); - const foldDiv = containerEl.createEl('details', { cls: "OFCGDetails" }); + const foldDiv = currencyEl.createEl('details', { cls: "OFCGDetails" }); foldDiv.createEl("summary", { text: "Currency", cls: "OFCGSummary" }); for (let index = 0; index < this.plugin.settings.currencyTypes.length; index++) { @@ -171,99 +212,108 @@ export class SettingTab extends PluginSettingTab { } // END CURRENCY SETTINGS // - - containerEl.createEl('hr'); - + currencyEl.createEl('hr'); //SETTLEMENT SETTINGS// - containerEl.createEl("h2", { text: "Settlement Settings" }); + const settlementDiv = containerEl.createDiv("settlementDiv"); + new Setting(settlementDiv).setHeading().setName("Settlement Settings"); + settlementDiv.createEl('br'); - let preText = ""; - let sufText = ""; - containerEl.createEl("h4", { text: "Prefixes being used" }); - new Setting(containerEl) - .setName("New Prefix:") - .addTextArea((text) => { - text.onChange((value) => { - preText = value; - }) - }) - .addButton((btn) => { - btn.setCta().setButtonText("Add") - .onClick(async () => { - this.convertStringToArray(preText, this.plugin.settings.citySettings.prefixArray); + if (Platform.isDesktopApp) { + const importExportFile = new Setting(settlementDiv) + .setName("Import | Export") + .setDesc("Import A Json File With Supported information"); + + const inputAppfile = createEl("input", { + attr: { + type: "file", + name: "settlement", + accept: ".json", + multiple: false + } + }); + + inputAppfile.onchange = async () => { + const { files } = inputAppfile; + if (files === null || !files.length) return; + try { + const file = files[0] as FileWithPath; + importJSON(file.path, async (data) => { + this.plugin.settings.citySettings = data as cityGeneratorSetting; this.display(); await this.plugin.saveSettings(); + }); + + } catch (e) { /* empty */ } + } + + importExportFile.addButton((b) => { + b.setButtonText("Choose Import File").setTooltip( + "Import Json File for the Generator" + ).buttonEl.appendChild(inputAppfile) + b.buttonEl.addClass("FCGInput"); + b.onClick(() => inputAppfile.click()); + }).addButton((b) => { + b.setButtonText("Export Section To File").setCta() + .onClick(() => { + exportJSON(this.plugin.settings.citySettings); }) - }) - - - containerEl.createEl("p", { text: "Click 'remove' on a prefix you would like to removed" }); - - const foldDiv = containerEl.createEl('details', { cls: "OFCGDetails" }); - foldDiv.createEl("summary", { text: "Prefixes", cls: "OFCGSummary" }); - - for (let index = 0; index < this.plugin.settings.citySettings.prefixArray.length; index++) { - new Setting(foldDiv) - .setName(this.plugin.settings.citySettings.prefixArray[index]) - .addButton((btn) => btn - .setCta() - .setButtonText("Remove") - .onClick(async () => { - this.plugin.settings.citySettings.prefixArray.splice(index, 1); - this.display(); - await this.plugin.saveSettings(); - }) - ) - + }); } - containerEl.createEl('hr'); - - containerEl.createEl("h4", { text: "Suffixes being used" }); - new Setting(containerEl) - .setName("New Suffix:") - .addTextArea((text) => { - text.onChange((value) => { - sufText = value; - }) - }) - .addButton((btn) => { - btn.setCta().setButtonText("Add") - .onClick(async () => { - this.convertStringToArray(sufText, this.plugin.settings.citySettings.suffixArray); - this.display(); - await this.plugin.saveSettings(); - }) - }) - - - containerEl.createEl("p", { text: "Click 'remove' on a suffix you would like to removed" }); - - const foldDiv2 = containerEl.createEl('details', { cls: "OFCGDetails" }); - foldDiv2.createEl("summary", { text: "Suffixes", cls: "OFCGSummary" }); - - for (let index = 0; index < this.plugin.settings.citySettings.suffixArray.length; index++) { - new Setting(foldDiv2) - .setName(this.plugin.settings.citySettings.suffixArray[index]) - .addButton((btn) => btn - .setCta() - .setButtonText("Remove") - .onClick(async () => { - this.plugin.settings.citySettings.suffixArray.splice(index, 1); - this.display(); - await this.plugin.saveSettings(); - }) - ) - - } + const preText = ""; + const sufText = ""; + this.createSettingsBlock(settlementDiv, preText, this.plugin.settings.citySettings.prefixArray, "Prefixes"); + this.createSettingsBlock(settlementDiv, sufText, this.plugin.settings.citySettings.suffixArray, "Suffixes"); // END SETTLEMENT SETTINGS // - containerEl.createEl('hr'); - // INN'S / TAVERN SETTINGS // - containerEl.createEl("h2", { text: "Inn & Tavern Settings" }); + const innDiv = containerEl.createDiv("innDiv"); + new Setting(innDiv).setHeading().setName("Inn Settings"); + innDiv.createEl('br'); + + if (Platform.isDesktopApp) { + const importExportFile = new Setting(innDiv) + .setName("Import | Export") + .setDesc("Import A Json File With Supported information"); + + const inputAppfile = createEl("input", { + attr: { + type: "file", + name: "inn", + accept: ".json", + multiple: false + } + }); + + inputAppfile.onchange = async () => { + const { files } = inputAppfile; + if (files === null || !files.length) return; + try { + const file = files[0] as FileWithPath; + importJSON(file.path, async (data) => { + this.plugin.settings.innSettings = data as innGeneratorSettings; + this.display(); + await this.plugin.saveSettings(); + }); + + } catch (e) { /* empty */ } + } + + importExportFile.addButton((b) => { + b.setButtonText("Choose Import File").setTooltip( + "Import Json File for the Generator" + ).buttonEl.appendChild(inputAppfile) + b.buttonEl.addClass("FCGInput"); + b.onClick(() => inputAppfile.click()); + }).addButton((b) => { + b.setButtonText("Export Section To File").setCta() + .onClick(() => { + exportJSON(this.plugin.settings.innSettings); + }) + }); + } const innPreText = ""; const innTypeText = ""; @@ -271,52 +321,169 @@ export class SettingTab extends PluginSettingTab { const innDescText = ""; const innRumorText = ""; - containerEl.createEl("h4", { text: "Prefixes being used" }); - this.createSettingsBlock(containerEl, innPreText, this.plugin.settings.innSettings.prefixes, "Prefixes"); - - containerEl.createEl("h4", { text: "Type's being used" }); - this.createSettingsBlock(containerEl, innTypeText, this.plugin.settings.innSettings.innType, "Type's"); - - containerEl.createEl("h4", { text: "Nouns being used" }); - this.createSettingsBlock(containerEl, innNounText, this.plugin.settings.innSettings.nouns, "Nouns"); - - containerEl.createEl("h4", { text: "Description's being used" }); - this.createSettingsBlock(containerEl, innDescText, this.plugin.settings.innSettings.desc, "Description's"); - - containerEl.createEl("h4", { text: "Rumors being used" }); - this.createSettingsBlock(containerEl, innRumorText, this.plugin.settings.innSettings.rumors, "Rumors"); + this.createSettingsBlock(innDiv, innPreText, this.plugin.settings.innSettings.prefixes, "Prefixes"); + this.createSettingsBlock(innDiv, innTypeText, this.plugin.settings.innSettings.innType, "Type's"); + this.createSettingsBlock(innDiv, innNounText, this.plugin.settings.innSettings.nouns, "Nouns"); + this.createSettingsBlock(innDiv, innDescText, this.plugin.settings.innSettings.desc, "Description's"); + this.createSettingsBlock(innDiv, innRumorText, this.plugin.settings.innSettings.rumors, "Rumors"); // END INN'S / TAVERN SETTINGS // // DRINK SETTINGS // - containerEl.createEl("h2", { text: "Drink Generator Settings" }); + const drinkDiv = containerEl.createDiv("drinkDiv"); + new Setting(drinkDiv).setHeading().setName("Drink Settings"); + drinkDiv.createEl('br'); + + if (Platform.isDesktopApp) { + const importExportFile = new Setting(drinkDiv) + .setName("Import | Export") + .setDesc("Import A Json File With Supported information"); + + const inputAppfile = createEl("input", { + attr: { + type: "file", + name: "drink", + accept: ".json", + multiple: false + } + }); + + inputAppfile.onchange = async () => { + const { files } = inputAppfile; + if (files === null || !files.length) return; + try { + const file = files[0] as FileWithPath; + importJSON(file.path, async (data) => { + this.plugin.settings.drinkSettings = data as drinkGeneratorSettings; + this.display(); + await this.plugin.saveSettings(); + }); + + } catch (e) { /* empty */ } + } + + importExportFile.addButton((b) => { + b.setButtonText("Choose Import File").setTooltip( + "Import Json File for the Generator" + ).buttonEl.appendChild(inputAppfile) + b.buttonEl.addClass("FCGInput"); + b.onClick(() => inputAppfile.click()); + }).addButton((b) => { + b.setButtonText("Export Section To File").setCta() + .onClick(() => { + exportJSON(this.plugin.settings.drinkSettings); + }) + }); + } const drinkNounText = ""; const drinkAdjText = ""; - containerEl.createEl("h4", { text: "Adjectives being used" }); - this.createSettingsBlock(containerEl, drinkAdjText, this.plugin.settings.drinkSettings.adj, "Adjectives"); - - containerEl.createEl("h4", { text: "Nouns being used" }); - this.createSettingsBlock(containerEl, drinkNounText, this.plugin.settings.drinkSettings.nouns, "Nouns"); + this.createSettingsBlock(drinkDiv, drinkAdjText, this.plugin.settings.drinkSettings.adj, "Adjectives"); + this.createSettingsBlock(drinkDiv, drinkNounText, this.plugin.settings.drinkSettings.nouns, "Nouns"); // LOOT SETTINGS // - containerEl.createEl("h2", { text: "Loot Generator Settings" }); + const lootDiv = containerEl.createDiv("lootDiv"); + new Setting(lootDiv).setHeading().setName("Loot Settings"); + lootDiv.createEl('br'); + + if (Platform.isDesktopApp) { + const importExportFile = new Setting(lootDiv) + .setName("Import | Export") + .setDesc("Import A Json File With Supported information"); + + const inputAppfile = createEl("input", { + attr: { + type: "file", + name: "loot", + accept: ".json", + multiple: false + } + }); + + inputAppfile.onchange = async () => { + const { files } = inputAppfile; + if (files === null || !files.length) return; + try { + const file = files[0] as FileWithPath; + importJSON(file.path, async (data) => { + this.plugin.settings.lootSettings = data as lootTables; + this.display(); + await this.plugin.saveSettings(); + }); + + } catch (e) { /* empty */ } + } + + importExportFile.addButton((b) => { + b.setButtonText("Choose Import File").setTooltip( + "Import Json File for the Generator" + ).buttonEl.appendChild(inputAppfile) + b.buttonEl.addClass("FCGInput"); + b.onClick(() => inputAppfile.click()); + }).addButton((b) => { + b.setButtonText("Export Section To File").setCta() + .onClick(() => { + exportJSON(this.plugin.settings.lootSettings); + }) + }); + } const lootNounText = ""; const lootAdjText = ""; - containerEl.createEl("h4", { text: "Adjectives being used" }); - this.createSettingsBlock(containerEl, lootAdjText, this.plugin.settings.drinkSettings.adj, "Adjectives"); - - containerEl.createEl("h4", { text: "Nouns being used" }); - this.createSettingsBlock(containerEl, lootNounText, this.plugin.settings.drinkSettings.nouns, "Nouns"); + this.createSettingsBlock(lootDiv, lootAdjText, this.plugin.settings.drinkSettings.adj, "Adjectives"); + this.createSettingsBlock(lootDiv, lootNounText, this.plugin.settings.drinkSettings.nouns, "Nouns"); // GROUP SETTINGS // - containerEl.createEl("h2", { text: "Group Generator Settings" }); + const groupDiv = containerEl.createDiv("groupDiv"); + new Setting(groupDiv).setHeading().setName("Group Settings"); + groupDiv.createEl('br'); + + if (Platform.isDesktopApp) { + const importExportFile = new Setting(groupDiv) + .setName("Import | Export") + .setDesc("Import A Json File With Supported information"); + + const inputAppfile = createEl("input", { + attr: { + type: "file", + name: "group", + accept: ".json", + multiple: false + } + }); + + inputAppfile.onchange = async () => { + const { files } = inputAppfile; + if (files === null || !files.length) return; + try { + const file = files[0] as FileWithPath; + importJSON(file.path, async (data) => { + this.plugin.settings.groupSettings = data as groupGenSettings; + this.display(); + await this.plugin.saveSettings(); + }); + + } catch (e) { /* empty */ } + } + + importExportFile.addButton((b) => { + b.setButtonText("Choose Import File").setTooltip( + "Import Json File for the Generator" + ).buttonEl.appendChild(inputAppfile) + b.buttonEl.addClass("FCGInput"); + b.onClick(() => inputAppfile.click()); + }).addButton((b) => { + b.setButtonText("Export Section To File").setCta() + .onClick(() => { + exportJSON(this.plugin.settings.groupSettings); + }) + }); + } const groupAdjectives = '' const groupNouns = '' @@ -324,24 +491,59 @@ export class SettingTab extends PluginSettingTab { const groupTypes = '' const groupSingleDescriptors = '' - containerEl.createEl("h4", { text: "Adjectives being used" }); - this.createSettingsBlock(containerEl, groupAdjectives, this.plugin.settings.groupSettings.adj, "Adjectives"); - - containerEl.createEl("h4", { text: "Nouns being used" }); - this.createSettingsBlock(containerEl, groupNouns, this.plugin.settings.groupSettings.nouns, "Nouns"); - - containerEl.createEl("h4", { text: "Plural Nouns being used" }); - this.createSettingsBlock(containerEl, groupNounsPlural, this.plugin.settings.groupSettings.nounsP, "Plural Nouns"); - - containerEl.createEl("h4", { text: "Group Types being used" }); - this.createSettingsBlock(containerEl, groupTypes, this.plugin.settings.groupSettings.groupTypes, "Types"); - - containerEl.createEl("h4", { text: "Single Descriptors being used" }); - this.createSettingsBlock(containerEl, groupSingleDescriptors, this.plugin.settings.groupSettings.singleDescriptors, "Descriptors"); + this.createSettingsBlock(groupDiv, groupAdjectives, this.plugin.settings.groupSettings.adj, "Adjectives"); + this.createSettingsBlock(groupDiv, groupNouns, this.plugin.settings.groupSettings.nouns, "Nouns"); + this.createSettingsBlock(groupDiv, groupNounsPlural, this.plugin.settings.groupSettings.nounsP, "Plural Nouns"); + this.createSettingsBlock(groupDiv, groupTypes, this.plugin.settings.groupSettings.groupTypes, "Types"); + this.createSettingsBlock(groupDiv, groupSingleDescriptors, this.plugin.settings.groupSettings.singleDescriptors, "Descriptors"); // END GROUP SETTINGS // - containerEl.createEl("h2", { text: "Dungeon Generator Settings" }); + const dungDiv = containerEl.createDiv("dungDiv"); + new Setting(dungDiv).setHeading().setName("Dungeon Settings"); + dungDiv.createEl('br'); + + if (Platform.isDesktopApp) { + const importExportFile = new Setting(dungDiv) + .setName("Import | Export") + .setDesc("Import A Json File With Supported information"); + + const inputAppfile = createEl("input", { + attr: { + type: "file", + name: "dungeon", + accept: ".json", + multiple: false + } + }); + + inputAppfile.onchange = async () => { + const { files } = inputAppfile; + if (files === null || !files.length) return; + try { + const file = files[0] as FileWithPath; + importJSON(file.path, async (data) => { + this.plugin.settings.dungeonSettings = data as dungeonGenSettings; + this.display(); + await this.plugin.saveSettings(); + }); + + } catch (e) { /* empty */ } + } + + importExportFile.addButton((b) => { + b.setButtonText("Choose Import File").setTooltip( + "Import Json File for the Generator" + ).buttonEl.appendChild(inputAppfile) + b.buttonEl.addClass("FCGInput"); + b.onClick(() => inputAppfile.click()); + }).addButton((b) => { + b.setButtonText("Export Section To File").setCta() + .onClick(() => { + exportJSON(this.plugin.settings.dungeonSettings); + }) + }); + } const dungAdjectives = '' const dungNouns = '' @@ -349,20 +551,11 @@ export class SettingTab extends PluginSettingTab { const dungLocations = '' const dungRandomDesc = '' - containerEl.createEl("h4", { text: "Adjectives being used" }); - this.createSettingsBlock(containerEl, dungAdjectives, this.plugin.settings.dungeonSettings.adjectives, "Adjectives"); - - containerEl.createEl("h4", { text: "Nouns being used" }); - this.createSettingsBlock(containerEl, dungNouns, this.plugin.settings.groupSettings.nouns, "Nouns"); - - containerEl.createEl("h4", { text: "Locations being used" }); - this.createSettingsBlock(containerEl, dungLocations, this.plugin.settings.dungeonSettings.locations, "Locations"); - - containerEl.createEl("h4", { text: "Dungeon Types being used" }); - this.createSettingsBlock(containerEl, dungTypes, this.plugin.settings.dungeonSettings.dungeonTypes, "Types"); - - containerEl.createEl("h4", { text: "Random Descriptions being used" }); - this.createSettingsBlock(containerEl, dungRandomDesc, this.plugin.settings.dungeonSettings.randomDesc, "Descriptors"); + this.createSettingsBlock(dungDiv, dungAdjectives, this.plugin.settings.dungeonSettings.adjectives, "Adjectives"); + this.createSettingsBlock(dungDiv, dungNouns, this.plugin.settings.groupSettings.nouns, "Nouns"); + this.createSettingsBlock(dungDiv, dungLocations, this.plugin.settings.dungeonSettings.locations, "Locations"); + this.createSettingsBlock(dungDiv, dungTypes, this.plugin.settings.dungeonSettings.dungeonTypes, "Types"); + this.createSettingsBlock(dungDiv, dungRandomDesc, this.plugin.settings.dungeonSettings.randomDesc, "Descriptors"); } } diff --git a/styles.css b/styles.css index 2acd5c4..218b9c7 100644 --- a/styles.css +++ b/styles.css @@ -1,7 +1,9 @@ .OFCGDetails { - border: 1px solid #aaa; - border-radius: 4px; + border: 1px solid #272727; + box-shadow: 0px 12px 0px 0px rgba(0, 0, 0, 0.37); + background-color: #313131; padding: 0.5em 0.5em 0.5em; + margin: 1em; } .OFCGSSummary { @@ -17,4 +19,7 @@ .OFCGDetails[open] summary { border-bottom: 1px solid #aaa; margin-bottom: 0.5em; +} +.FCGInput>input[type="file"] { + display: none; } \ No newline at end of file