Skip to content

Commit

Permalink
fix: Updates how default layouts are stored in the data file to reduc…
Browse files Browse the repository at this point in the history
…e data file operations
  • Loading branch information
valentine195 committed May 1, 2024
1 parent 1602e6c commit e1eb126
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 79 deletions.
2 changes: 1 addition & 1 deletion index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ export interface Trait {

export interface StatblockData {
monsters: Array<[string, Monster]>;
defaultLayouts: DefaultLayout[];
defaultLayouts: Record<string, DefaultLayout>;
layouts: Layout[];
default: string;
useDice: boolean;
Expand Down
23 changes: 12 additions & 11 deletions src/layouts/manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
ThemeMode,
CSSProperties
} from "./layout.css";
import { DefaultLayouts } from ".";

export default class LayoutManager {
public initialize(settings: StatblockData) {
Expand Down Expand Up @@ -114,7 +115,7 @@ export default class LayoutManager {
*/
public updateDefaultLayout(old: string, layout: DefaultLayout) {
this.#defaults.delete(old);
this.setDefaultLayouts([layout]);
this.setDefaultLayouts({ [layout.id]: layout });
this.addStyleSheet(layout);
}
/**
Expand All @@ -124,19 +125,16 @@ export default class LayoutManager {
this.#defaults.delete(layout);
this.removeStyleSheet(layout);
}
/**
* @param layout Layout to be added.
*/
public addDefaultLayout(layout: DefaultLayout) {
this.setDefaultLayouts([layout]);
}

public setDefaultLayouts(layouts: DefaultLayout[]) {
for (const layout of layouts) {
this.#defaults.set(layout.id, layout);
public setDefaultLayouts(layouts: Record<string, DefaultLayout>) {
for (const layout of DefaultLayouts) {
this.#defaults.set(
layout.id,
layout.id in layouts ? layouts[layout.id] : layout
);
}
setTimeout(() => {
for (const layout of layouts) {
for (const layout of this.#defaults.values()) {
this.#unwrapLayout(layout);
}
}, 0);
Expand Down Expand Up @@ -168,6 +166,9 @@ export default class LayoutManager {
(f) => !("removed" in f) || !(f as DefaultLayout).removed
);
}
public getAllDefaultLayouts(): DefaultLayout[] {
return [...this.#defaults.values()];
}
public getLayout(id: string): Layout | null {
return this.#layouts.get(id) ?? this.#defaults.get(id) ?? null;
}
Expand Down
70 changes: 22 additions & 48 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ import StatblockSettingTab from "./settings/settings";
import fastCopy from "fast-copy";

import type { HomebrewCreature } from "obsidian-overload";
import type { Layout, StatblockItem } from "./layouts/layout.types";
import type {
DefaultLayout,
Layout,
StatblockItem
} from "./layouts/layout.types";
import { Layout5e } from "./layouts/basic 5e/basic5e";
import { StatblockSuggester } from "./suggest";
import { DefaultLayouts } from "./layouts";
Expand All @@ -32,7 +36,7 @@ export const DICE_ROLLER_SOURCE = "FANTASY_STATBLOCKS_PLUGIN";

const DEFAULT_DATA: StatblockData = {
monsters: [],
defaultLayouts: [...DefaultLayouts.map((l) => fastCopy(l))],
defaultLayouts: {},
layouts: [],
default: Layout5e.name,
useDice: true,
Expand All @@ -53,7 +57,7 @@ const DEFAULT_DATA: StatblockData = {
hideConditionHelp: false,
alwaysImport: false,
defaultLayoutsIntegrated: false,
atomicWrite: true
atomicWrite: false
};

export default class StatBlockPlugin extends Plugin {
Expand Down Expand Up @@ -237,30 +241,10 @@ export default class StatBlockPlugin extends Plugin {

async loadSettings() {
const settings: StatblockData = await this.loadData();

if (settings != undefined && !("version" in settings)) {
//1.X settings;
this.settings = { ...DEFAULT_DATA };
this.settings.monsters = settings as any as [string, Monster][];

new Notice(
"5e Statblocks is now TTRPG Statblocks. Check out the ReadMe for more information!"
);
} else {
if (
settings &&
settings?.version?.major >= 2 &&
settings?.version?.minor >= 25 &&
!settings?.notifiedOfFantasy
) {
new Notice("TTRPG Statblocks is now Fantasy Statblocks!");
settings.notifiedOfFantasy = true;
}
this.settings = {
...DEFAULT_DATA,
...settings
};
}
this.settings = {
...DEFAULT_DATA,
...settings
};
if (!this.settings.defaultLayoutsIntegrated) {
for (const layout of this.settings.layouts) {
layout.id = nanoid();
Expand All @@ -273,30 +257,20 @@ export default class StatBlockPlugin extends Plugin {

this.settings.defaultLayoutsIntegrated = true;
}
if (this.settings.defaultLayouts.length != DefaultLayouts.length) {
for (const layout of DefaultLayouts) {
if (this.settings.defaultLayouts.find((l) => l.id == layout.id))
continue;
this.settings.defaultLayouts.push(fastCopy(layout));
}
for (const layout of this.settings.defaultLayouts) {
if (DefaultLayouts.find((l) => l.id == layout.id)) continue;
this.settings.layouts.push(layout);
this.settings.defaultLayouts.splice(
this.settings.defaultLayouts.indexOf(layout),
1
);
if (Array.isArray(this.settings.defaultLayouts)) {
const map: Record<string, DefaultLayout> = {};
for (const layout of this.settings
.defaultLayouts as DefaultLayout[]) {
if (layout.removed || layout.edited) {
map[layout.id] = layout;
}
}
this.settings.layouts = this.settings.layouts.filter(
(layout) =>
!this.settings.defaultLayouts.find((l) => l.id == layout.id)
);
this.settings.defaultLayouts = map;
}
for (const layout of DefaultLayouts) {
if (!layout.version) continue;
const existing = this.settings.defaultLayouts.find(
(l) => l.id === layout.id
);
if (!(layout.id in this.settings.defaultLayouts)) continue;
if (layout.version == null) continue;
const existing = this.settings.defaultLayouts[layout.id];
if (existing.version >= layout.version) continue;
if (existing.edited) {
existing.updatable = true;
Expand Down
35 changes: 16 additions & 19 deletions src/settings/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -547,21 +547,27 @@ export default class StatblockSettingTab extends PluginSettingTab {
) {
layoutContainer.empty();

if (this.plugin.settings.defaultLayouts.some((f) => f.removed)) {
if (this.plugin.manager.getAllDefaultLayouts().some((f) => f.removed)) {
new Setting(layoutContainer)
.setName("Restore Default Layouts")
.addButton((b) => {
b.setIcon("rotate-ccw").onClick(async () => {
for (const layout of this.plugin.settings
.defaultLayouts) {
delete layout.removed;
for (const layout of Object.values(
this.plugin.settings.defaultLayouts
)) {
layout.removed = false;
if (!layout.edited) {
delete this.plugin.settings.defaultLayouts[
layout.id
];
}
}
await this.plugin.saveSettings();
this.generateLayouts(outerContainer);
});
});
}
for (const layout of this.plugin.settings.defaultLayouts) {
for (const layout of this.plugin.manager.getAllDefaultLayouts()) {
if (layout.removed) continue;

const setting = new Setting(layoutContainer)
Expand All @@ -578,13 +584,8 @@ export default class StatblockSettingTab extends PluginSettingTab {
if (!modal.saved) return;

(modal.layout as DefaultLayout).edited = true;
this.plugin.settings.defaultLayouts.splice(
this.plugin.settings.defaultLayouts.findIndex(
(l) => layout.id === l.id
),
1,
modal.layout
);
this.plugin.settings.defaultLayouts[layout.id] =
modal.layout;

await this.plugin.saveSettings();
this.plugin.manager.updateDefaultLayout(
Expand All @@ -602,13 +603,7 @@ export default class StatblockSettingTab extends PluginSettingTab {
const defLayout = DefaultLayouts.find(
({ id }) => id == layout.id
);
this.plugin.settings.defaultLayouts.splice(
this.plugin.settings.defaultLayouts.findIndex(
(l) => layout.id === l.id
),
1,
fastCopy(defLayout)
);
delete this.plugin.settings.defaultLayouts[layout.id];
await this.plugin.saveSettings();
this.plugin.manager.updateDefaultLayout(
layout.id,
Expand Down Expand Up @@ -655,6 +650,8 @@ export default class StatblockSettingTab extends PluginSettingTab {
.setTooltip("Delete")
.onClick(async () => {
layout.removed = true;
this.plugin.settings.defaultLayouts[layout.id] =
layout;
await this.plugin.saveSettings();
this.generateLayouts(outerContainer);
});
Expand Down

0 comments on commit e1eb126

Please sign in to comment.