diff --git a/src/components/PresetPicker.vue b/src/components/PresetPicker.vue index 2af10ba..2d2f810 100644 --- a/src/components/PresetPicker.vue +++ b/src/components/PresetPicker.vue @@ -1,16 +1,25 @@ - + @@ -137,7 +143,7 @@ export default defineComponent({ + @save="savePreset" :prefix="prefix" /> diff --git a/src/main.js b/src/main.js index 3c4ee2e..51c6e74 100644 --- a/src/main.js +++ b/src/main.js @@ -1,4 +1,5 @@ import { createApp } from "vue"; +import { createPinia } from "pinia"; import App from "./App.vue"; import router from "./router"; @@ -14,8 +15,10 @@ import "./assets/main.css"; import axios from "axios"; axios.defaults.baseURL = import.meta.env.VITE_BACKEND_URL; -const app = createApp(App) +const pinia = createPinia(); +const app = createApp(App); -app.use(router) +app.use(router); +app.use(pinia); -app.mount('#app') +app.mount('#app'); diff --git a/src/stores/preset.js b/src/stores/preset.js new file mode 100644 index 0000000..1b32a56 --- /dev/null +++ b/src/stores/preset.js @@ -0,0 +1,104 @@ +import { defineStore } from "pinia"; + +import localforage from "localforage"; +import settingsData from "@/data/settings.yaml"; +import generatorSettings from "@/data/generator-settings.yaml"; +import presets from "@/data/presets.yaml"; + +function fillPreset(preset, settings) { + for (const settingName of Object.keys(settings)) { + if (preset[settingName] == undefined) { + preset[settingName] = settings[settingName].default; + } + } + return preset; +} + +export default defineStore("preset", { + state() { + return { + localPresets: {}, + }; + }, + getters: { + settings() { + const settings = {}; + for (const generator of Object.keys(generatorSettings)) { + settings[generator] = {}; + + for (const name of Object.keys(generatorSettings[generator])) { + var generatorValue = generatorSettings[generator][name]; + if (generatorValue == "all") { + settings[generator][name] = settingsData[name]; + } else if (Array.isArray(generatorValue)) { + const { values, ...newObj } = settingsData[name]; + newObj.values = {}; + for (const value of generatorValue) { + newObj.values[value] = values[value]; + } + settings[generator][name] = newObj; + } else { + settings[generator][name] = generatorValue; + } + } + } + return settings; + }, + globalPresets() { + const filledPresets = {}; + for (const generator of Object.keys(generatorSettings)) { + filledPresets[generator] = {}; + if (presets[generator]) { + for (const presetName of Object.keys(presets[generator])) { + const preset = { ...presets[generator][presetName] }; + fillPreset(preset, this.settings[generator]); + filledPresets[generator][presetName] = preset; + } + } + } + return filledPresets; + }, + }, + actions: { + async fetchLocalPresets() { + for (const generator of Object.keys(generatorSettings)) { + if (this.localPresets[generator]) { + continue; + } + + await this.cacheLocalPresets(generator); + } + }, + async cacheLocalPresets(generator) { + var generatorPresets = await localforage.getItem(`local_presets_${generator}`); + + if (!Array.isArray(generatorPresets)) { + generatorPresets = []; + } + + for (const preset of generatorPresets) { + fillPreset(preset, this.settings[generator]); + } + this.localPresets[generator] = generatorPresets; + await this.saveLocalPresets(generator); + }, + async deleteLocalPreset(generator, index) { + this.localPresets[generator].splice(index, 1); + await this.saveLocalPresets(generator); + }, + async saveLocalPreset(generator, index, preset) { + if (index == null) { + index = this.localPresets[generator].length; + this.localPresets[generator].push(preset); + } else { + this.localPresets[generator][index] = preset; + } + await this.saveLocalPresets(generator); + return index; + }, + async saveLocalPresets(generator) { + const copy = JSON.parse(JSON.stringify(this.localPresets[generator])); + await localforage.setItem(`local_presets_${generator}`, copy); + }, + }, +}); diff --git a/src/views/GenerateMulti.vue b/src/views/GenerateMulti.vue index a9026ae..f80af37 100644 --- a/src/views/GenerateMulti.vue +++ b/src/views/GenerateMulti.vue @@ -3,7 +3,7 @@ import { defineComponent } from "vue"; import axios from "axios"; import localforage from "localforage"; -import { Modal } from "bootstrap"; +import { Tab } from "bootstrap"; import SettingsPage from "@/components/SettingsPage.vue"; @@ -28,6 +28,7 @@ export default defineComponent({ for (var i = 0; i < this.worldCount; i++) { this.worlds[i].player_name = await localforage.getItem(`${this.prefix}world_${i + 1}_setting_player_name`); + new Tab(this.$refs.tabs[i]); } }, methods: { @@ -36,12 +37,17 @@ export default defineComponent({ this.worlds.push({player_name: newname}); this.worldCount++; + await this.$nextTick(); + Tab.getOrCreateInstance(this.$refs.tabs[this.worldCount - 1]).show(); + await new Promise(r => setTimeout(r, 100)); this.worlds[this.worldCount - 1].player_name = newname; }, async removeWorld() { this.worldCount--; this.worlds.pop(); + await this.$nextTick(); + Tab.getOrCreateInstance(this.$refs.tabs[this.worldCount - 1]).show(); }, async playerNameUpdated(num) { await localforage.setItem(`${this.prefix}world_${num + 1}_setting_player_name`, this.worlds[num].player_name); @@ -83,17 +89,18 @@ export default defineComponent({ + :data-bs-target="`#world_page_${n}`" type="button" role="tab" ref="tabs"> {{ worlds[idx].player_name }} {{ n }} - - - + + + + + @@ -132,3 +139,10 @@ export default defineComponent({ + +