gregory-jagermeister_Fantas.../settings/SettingsTab.ts

561 lines
22 KiB
TypeScript

import FantasyPlugin from "main";
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 {
plugin: FantasyPlugin;
constructor(app: App, plugin: FantasyPlugin) {
super(app, plugin);
this.plugin = plugin;
}
convertStringToArray(string: string, arr: string[]): void {
//const newString = string.replace(/\s/g, '');
const array = string.split(',');
array.forEach((el) => {
arr.push(el);
})
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
createSettingsBlock(containerEl: HTMLElement, textA: string, arr: any[], type: string, weights: boolean): 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) => {
text.onChange((value) => {
textA = value;
})
})
.addButton((btn) => {
btn.setCta().setButtonText("Add")
.onClick(async () => {
this.convertStringToArray(textA, arr);
this.display();
await this.plugin.saveSettings();
})
})
const foldDiv = containerEl.createEl('details', { cls: "OFCGDetails" });
foldDiv.createEl("summary", { text: type, cls: "OFCGSummary" });
for (let index = 0; index < arr.length; index++) {
new Setting(foldDiv)
.setName(weights ? JSON.stringify(arr[index]) : arr[index])
.addButton((btn) => btn
.setCta()
.setButtonText("Remove")
.onClick(async () => {
arr.splice(index, 1);
this.display();
await this.plugin.saveSettings();
})
)
}
containerEl.createEl('hr');
}
display(): void {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl('h1', { text: 'Fantasy Content Generator' });
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) => {
btn.setCta()
.setButtonText("Reset")
.onClick(async () => {
this.plugin.settings = DEFAULT_SETTINGS;
this.display();
await this.plugin.saveSettings();
})
})
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) => {
this.plugin.settings.inlineCallout = value;
await this.plugin.saveSettings();
})
})
// CURRENCEY SETTINGS //
const currencyEl = containerEl.createDiv("currencyDiv");
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) => {
toggle.setValue(this.plugin.settings.enableCurrency);
toggle.onChange(async (value) => {
this.plugin.settings.enableCurrency = value;
this.display();
await this.plugin.saveSettings();
})
})
if (this.plugin.settings.enableCurrency) {
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) => {
if (!(isNaN(+value))) {
this.plugin.settings.currencyFrequency = Number(value);
await this.plugin.saveSettings();
}
})
})
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(currencyEl)
.setName("Currency Name:")
.addText((text) => {
text.onChange((value) => {
ctext.name = value;
})
}).addDropdown((drop) => {
drop.addOption("common", "Common");
drop.addOption("uncommon", "Uncommon");
drop.addOption("rare", "Rare");
drop.addOption("rarest", "Rarest");
drop.onChange((value) => {
ctext.rarity = value;
})
})
.addButton((btn) => {
btn.setCta().setButtonText("Add")
.onClick(async () => {
this.plugin.settings.currencyTypes.push(ctext);
this.display();
await this.plugin.saveSettings();
})
})
new Setting(currencyEl).setName("Added currency").setDesc("Click Remove on a Currency you would like to Remove");
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++) {
new Setting(foldDiv)
.setName(this.plugin.settings.currencyTypes[index].name)
.addButton((btn) => btn
.setCta()
.setButtonText("Remove")
.onClick(async () => {
this.plugin.settings.currencyTypes.splice(index, 1);
this.display();
await this.plugin.saveSettings();
})
)
}
}
// END CURRENCY SETTINGS //
currencyEl.createEl('hr');
//SETTLEMENT SETTINGS//
const settlementDiv = containerEl.createDiv("settlementDiv");
new Setting(settlementDiv).setHeading().setName("Settlement Settings");
settlementDiv.createEl('br');
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);
})
});
}
const preText = "";
const sufText = "";
this.createSettingsBlock(settlementDiv, preText, this.plugin.settings.citySettings.prefixArray, "Prefixes", false);
this.createSettingsBlock(settlementDiv, sufText, this.plugin.settings.citySettings.suffixArray, "Suffixes", false);
// END SETTLEMENT SETTINGS //
// INN'S / 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 = "";
const innNounText = "";
const innDescText = "";
const innRumorText = "";
this.createSettingsBlock(innDiv, innPreText, this.plugin.settings.innSettings.prefixes, "Prefixes", false);
this.createSettingsBlock(innDiv, innTypeText, this.plugin.settings.innSettings.innType, "Type's", false);
this.createSettingsBlock(innDiv, innNounText, this.plugin.settings.innSettings.nouns, "Nouns", false);
this.createSettingsBlock(innDiv, innDescText, this.plugin.settings.innSettings.desc, "Description's", false);
this.createSettingsBlock(innDiv, innRumorText, this.plugin.settings.innSettings.rumors, "Rumors", false);
// END INN'S / TAVERN SETTINGS //
// DRINK 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 = "";
this.createSettingsBlock(drinkDiv, drinkAdjText, this.plugin.settings.drinkSettings.adj, "Adjectives", false);
this.createSettingsBlock(drinkDiv, drinkNounText, this.plugin.settings.drinkSettings.nouns, "Nouns", false);
// LOOT 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 = "";
this.createSettingsBlock(lootDiv, lootAdjText, this.plugin.settings.lootSettings.adj, "Adjectives", false);
this.createSettingsBlock(lootDiv, lootNounText, this.plugin.settings.lootSettings.items, "Items", true);
// GROUP 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 = ''
const groupNounsPlural = ''
const groupTypes = ''
const groupSingleDescriptors = ''
this.createSettingsBlock(groupDiv, groupAdjectives, this.plugin.settings.groupSettings.adj, "Adjectives", false);
this.createSettingsBlock(groupDiv, groupNouns, this.plugin.settings.groupSettings.nouns, "Nouns", false);
this.createSettingsBlock(groupDiv, groupNounsPlural, this.plugin.settings.groupSettings.nounsP, "Plural Nouns", false);
this.createSettingsBlock(groupDiv, groupTypes, this.plugin.settings.groupSettings.groupTypes, "Types", false);
this.createSettingsBlock(groupDiv, groupSingleDescriptors, this.plugin.settings.groupSettings.singleDescriptors, "Descriptors", false);
// END GROUP 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 = ''
const dungTypes = ''
const dungLocations = ''
const dungRandomDesc = ''
this.createSettingsBlock(dungDiv, dungAdjectives, this.plugin.settings.dungeonSettings.adjectives, "Adjectives", false);
this.createSettingsBlock(dungDiv, dungNouns, this.plugin.settings.groupSettings.nouns, "Nouns", false);
this.createSettingsBlock(dungDiv, dungLocations, this.plugin.settings.dungeonSettings.locations, "Locations", false);
this.createSettingsBlock(dungDiv, dungTypes, this.plugin.settings.dungeonSettings.dungeonTypes, "Types", false);
this.createSettingsBlock(dungDiv, dungRandomDesc, this.plugin.settings.dungeonSettings.randomDesc, "Descriptors", false);
}
}