dragonish_obsidian-heading-.../components/setting-tab.ts
Victor Araújo 1b95a0a9b0 refactor(gutter): replace font size dropdown with 12-24px slider
Simpler and more flexible than mapping to Obsidian CSS variables.
Default is 15px.
2026-02-17 20:27:21 -03:00

1659 lines
52 KiB
TypeScript

import { App, ButtonComponent, PluginSettingTab, Setting } from "obsidian";
import type { HeadingPlugin } from "./plugin";
import type {
OrderedCounterStyleType,
HeadingDecoratorSettings,
IndependentDecoratorSettings,
SpliceDecoratorSettings,
IndependentSettings,
SpliceSettings,
} from "../common/data";
import {
defaultIndependentSettings,
defaultSpliceSettings,
} from "../common/data";
import { getStyleTypeOptions } from "../common/options";
import { FolderSuggest } from "./suggest";
import { SettingDisplayManager } from "./setting";
type ButtonOrUndefined = ButtonComponent | undefined;
export class HeadingSettingTab extends PluginSettingTab {
plugin: HeadingPlugin;
private readonly styleTypeOptions = getStyleTypeOptions();
constructor(app: App, plugin: HeadingPlugin) {
super(app, plugin);
this.plugin = plugin;
}
display(): void {
const {
containerEl,
plugin: { settings, i18n },
} = this;
containerEl.empty();
//* metadataKeyword
const metadataKeywordSetting = new Setting(containerEl)
.setName(i18n.t("setting.metadataKeyword"))
.addText((text) =>
text
.setPlaceholder(i18n.t("setting.metadataKeywordPlaceholder"))
.setValue(settings.metadataKeyword)
.onChange((value) => {
settings.metadataKeyword = value.trim();
this.plugin.saveSettings();
})
);
const metadataKeywordDesc = createFragment();
const metadataKeywordDescTuple = i18n.getPlaceholderTuple(
"setting.metadataKeywordDesc"
);
metadataKeywordDesc.append(
metadataKeywordDescTuple[0],
createEl("a", {
href: "https://help.obsidian.md/Editing+and+formatting/Properties",
text: i18n.t("setting.properties"),
}),
metadataKeywordDescTuple[1]
);
metadataKeywordSetting.descEl.appendChild(metadataKeywordDesc);
new Setting(containerEl).setName(i18n.t("setting.common")).setHeading();
//* common
new Setting(containerEl)
.setName(i18n.t("setting.commonConfig"))
.setDesc(i18n.t("setting.commonConfigDesc"))
.addButton((button) => {
button.setButtonText(i18n.t("button.config")).onClick(() => {
this.manageHeadingDecoratorSettings("commonSettings");
});
});
new Setting(containerEl)
.setName(i18n.t("setting.editorDisplay"))
.setHeading();
//* useGutter
const gutterPositionManager = new SettingDisplayManager();
new Setting(containerEl)
.setName(i18n.t("setting.useGutter"))
.setDesc(i18n.t("setting.useGutterDesc"))
.addToggle((toggle) =>
toggle.setValue(settings.useGutter).onChange((value) => {
settings.useGutter = value;
value ? gutterPositionManager.show() : gutterPositionManager.hide();
this.plugin.saveSettings();
})
);
//* gutterPosition
gutterPositionManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.gutterPosition"))
.setDesc(i18n.t("setting.gutterPositionDesc"))
.addDropdown((dropdown) => {
dropdown
.addOptions({
"before-line-numbers": i18n.t("setting.beforeLineNumbers"),
"after-line-numbers": i18n.t("setting.afterLineNumbers"),
})
.setValue(settings.gutterPosition)
.onChange((value) => {
settings.gutterPosition = this.isGutterPosition(value)
? value
: "before-line-numbers";
this.plugin.saveSettings();
});
})
);
//* gutterFontSize
gutterPositionManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.gutterFontSize"))
.setDesc(i18n.t("setting.gutterFontSizeDesc"))
.addSlider((slider) =>
slider
.setLimits(12, 24, 1)
.setValue(settings.gutterFontSize)
.onChange((value) => {
settings.gutterFontSize = value;
this.plugin.saveSettings();
})
.setDynamicTooltip()
)
);
//* enabledGutterSettings
let gutterConfigBtn: ButtonOrUndefined;
gutterPositionManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.enabledInGutterConfig"))
.setDesc(i18n.t("setting.enabledInGutterConfigDesc"))
.addToggle((toggle) => {
toggle.setValue(settings.enabledGutterSettings).onChange((value) => {
settings.enabledGutterSettings = value;
gutterConfigBtn?.setDisabled(!value);
this.plugin.saveSettings();
});
})
.addButton((button) => {
gutterConfigBtn = button;
button
.setButtonText(i18n.t("button.config"))
.onClick(() => {
this.manageHeadingDecoratorSettings("gutterSettings");
})
.setDisabled(!settings.enabledGutterSettings);
})
);
if (!settings.useGutter) {
gutterPositionManager.hide();
}
new Setting(containerEl).setName(i18n.t("setting.reading")).setHeading();
//* enabledInReading
new Setting(containerEl)
.setName(i18n.t("setting.enabledInReading"))
.setDesc(i18n.t("setting.enabledInReadingDesc"))
.addToggle((toggle) =>
toggle.setValue(settings.enabledInReading).onChange((value) => {
settings.enabledInReading = value;
value ? readingConfigManager.show() : readingConfigManager.hide();
this.plugin.saveSettings();
})
);
const readingConfigManager = new SettingDisplayManager();
let readingConfigBtn: ButtonOrUndefined;
readingConfigManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.enabledInReadingConfig"))
.setDesc(i18n.t("setting.enabledInReadingConfigDesc"))
.addToggle((toggle) => {
toggle.setValue(settings.enabledReadingSettings).onChange((value) => {
settings.enabledReadingSettings = value;
readingConfigBtn?.setDisabled(!value);
this.plugin.saveSettings();
});
})
.addButton((button) => {
readingConfigBtn = button;
button
.setButtonText(i18n.t("button.config"))
.onClick(() => {
this.manageHeadingDecoratorSettings("readingSettings");
})
.setDisabled(!settings.enabledReadingSettings);
})
);
//* readingRenderPolicy
readingConfigManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.renderPolicy"))
.setDesc(i18n.t("setting.renderPolicyDesc"))
.addDropdown((dropdown) => {
dropdown
.addOptions({
partial: i18n.t("setting.partial"),
full: i18n.t("setting.full"),
})
.setValue(settings.readingRenderPolicy)
.onChange((value) => {
settings.readingRenderPolicy = this.isRenderPolicy(value)
? value
: "partial";
this.plugin.saveSettings();
});
})
);
if (!settings.enabledInReading) {
readingConfigManager.hide();
}
new Setting(containerEl)
.setName(i18n.t("setting.livePreview"))
.setHeading();
//* enabledInPreview
new Setting(containerEl)
.setName(i18n.t("setting.enabledInPreview"))
.setDesc(i18n.t("setting.enabledInPreviewDesc"))
.addToggle((toggle) =>
toggle.setValue(settings.enabledInPreview).onChange((value) => {
settings.enabledInPreview = value;
value ? previewConfigManager.show() : previewConfigManager.hide();
this.plugin.saveSettings();
})
);
const previewConfigManager = new SettingDisplayManager();
let previewConfigBtn: ButtonOrUndefined;
previewConfigManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.enabledInPreviewConfig"))
.setDesc(i18n.t("setting.enabledInPreviewConfigDesc"))
.addToggle((toggle) => {
toggle.setValue(settings.enabledPreviewSettings).onChange((value) => {
settings.enabledPreviewSettings = value;
previewConfigBtn?.setDisabled(!value);
this.plugin.saveSettings();
});
})
.addButton((button) => {
previewConfigBtn = button;
button
.setButtonText(i18n.t("button.config"))
.onClick(() => {
this.manageHeadingDecoratorSettings("previewSettings");
})
.setDisabled(!settings.enabledPreviewSettings);
})
);
if (!settings.enabledInPreview) {
previewConfigManager.hide();
}
new Setting(containerEl).setName(i18n.t("setting.sourceMode")).setHeading();
//* enabledInSource
new Setting(containerEl)
.setName(i18n.t("setting.enabledInSource"))
.setDesc(i18n.t("setting.enabledInSourceDesc"))
.addToggle((toggle) =>
toggle.setValue(settings.enabledInSource).onChange((value) => {
settings.enabledInSource = value;
value ? sourceConfigManager.show() : sourceConfigManager.hide();
this.plugin.saveSettings();
})
);
const sourceConfigManager = new SettingDisplayManager();
let sourceConfigBtn: ButtonOrUndefined;
sourceConfigManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.enabledInSourceConfig"))
.setDesc(i18n.t("setting.enabledInSourceConfigDesc"))
.addToggle((toggle) => {
toggle.setValue(settings.enabledSourceSettings).onChange((value) => {
settings.enabledSourceSettings = value;
sourceConfigBtn?.setDisabled(!value);
this.plugin.saveSettings();
});
})
.addButton((button) => {
sourceConfigBtn = button;
button
.setButtonText(i18n.t("button.config"))
.onClick(() => {
this.manageHeadingDecoratorSettings("sourceSettings");
})
.setDisabled(!settings.enabledSourceSettings);
})
);
//* sourceHideNumberSigns
sourceConfigManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.hideNumberSigns"))
.setDesc(i18n.t("setting.hideNumberSignsDesc"))
.addToggle((toggle) => {
toggle
.setValue(settings.sourceHideNumberSigns ?? false)
.onChange((value) => {
settings.sourceHideNumberSigns = value;
this.plugin.saveSettings();
});
})
);
if (!settings.enabledInSource) {
sourceConfigManager.hide();
}
new Setting(containerEl).setName(i18n.t("setting.outline")).setHeading();
//* enabledInOutline
new Setting(containerEl)
.setName(i18n.t("setting.enabledInOutline"))
.setDesc(i18n.t("setting.enabledInOutlineDesc"))
.addToggle((toggle) =>
toggle.setValue(settings.enabledInOutline).onChange((value) => {
settings.enabledInOutline = value;
value ? outlineConfigManager.show() : outlineConfigManager.hide();
this.plugin.saveSettings();
})
);
const outlineConfigManager = new SettingDisplayManager();
let outlineConfigBtn: ButtonOrUndefined;
outlineConfigManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.enabledInOutlineConfig"))
.setDesc(i18n.t("setting.enabledInOutlineConfigDesc"))
.addToggle((toggle) => {
toggle.setValue(settings.enabledOutlineSettings).onChange((value) => {
settings.enabledOutlineSettings = value;
outlineConfigBtn?.setDisabled(!value);
this.plugin.saveSettings();
});
})
.addButton((button) => {
outlineConfigBtn = button;
button
.setButtonText(i18n.t("button.config"))
.onClick(() => {
this.manageHeadingDecoratorSettings("outlineSettings");
})
.setDisabled(!settings.enabledOutlineSettings);
})
);
if (!settings.enabledInOutline) {
outlineConfigManager.hide();
}
new Setting(containerEl)
.setName(i18n.t("setting.quietOutline"))
.setHeading();
//* enabledInQuietOutline
const enabledInQuietOutlineSetting = new Setting(containerEl)
.setName(i18n.t("setting.enabledInQuietOutline"))
.addToggle((toggle) =>
toggle.setValue(settings.enabledInQuietOutline).onChange((value) => {
settings.enabledInQuietOutline = value;
value
? quietOutlineConfigManager.show()
: quietOutlineConfigManager.hide();
this.plugin.saveSettings();
})
);
const enabledInQuietOutlineDesc = createFragment();
const enabledInQuietOutLineDescTuple = i18n.getPlaceholderTuple(
"setting.enabledInQuietOutlineDesc"
);
enabledInQuietOutlineDesc.append(
enabledInQuietOutLineDescTuple[0],
createEl("a", {
href: "https://github.com/guopenghui/obsidian-quiet-outline",
text: "Quiet Outline",
}),
enabledInQuietOutLineDescTuple[1]
);
enabledInQuietOutlineSetting.descEl.appendChild(enabledInQuietOutlineDesc);
const quietOutlineConfigManager = new SettingDisplayManager();
let quietOutlineConfigBtn: ButtonOrUndefined;
quietOutlineConfigManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.enabledInQuietOutlineConfig"))
.setDesc(i18n.t("setting.enabledInQuietOutlineConfigDesc"))
.addToggle((toggle) => {
toggle
.setValue(settings.enabledQuietOutlineSettings)
.onChange((value) => {
settings.enabledQuietOutlineSettings = value;
quietOutlineConfigBtn?.setDisabled(!value);
this.plugin.saveSettings();
});
})
.addButton((button) => {
quietOutlineConfigBtn = button;
button
.setButtonText(i18n.t("button.config"))
.onClick(() => {
this.manageHeadingDecoratorSettings("quietOutlineSettings");
})
.setDisabled(!settings.enabledQuietOutlineSettings);
})
);
if (!settings.enabledInQuietOutline) {
quietOutlineConfigManager.hide();
}
new Setting(containerEl)
.setName(i18n.t("setting.fileExplorer"))
.setHeading();
//* enabledInFileExplorer
const enabledInFileExplorerSetting = new Setting(containerEl)
.setName(i18n.t("setting.enabledInFileExplorer"))
.addToggle((toggle) =>
toggle.setValue(settings.enabledInFileExplorer).onChange((value) => {
settings.enabledInFileExplorer = value;
value
? fileExplorerConfigManager.show()
: fileExplorerConfigManager.hide();
this.plugin.saveSettings();
})
);
const enabledInFileExplorerDesc = createFragment();
const enabledInFileExplorerDescTuple = i18n.getPlaceholderTuple(
"setting.enabledInFileExplorerDesc"
);
enabledInFileExplorerDesc.append(
enabledInFileExplorerDescTuple[0],
createEl("a", {
href: "https://github.com/patrickchiang/obsidian-headings-in-explorer",
text: "Headings in Explorer",
}),
enabledInFileExplorerDescTuple[1]
);
enabledInFileExplorerSetting.descEl.appendChild(enabledInFileExplorerDesc);
const fileExplorerConfigManager = new SettingDisplayManager();
let fileExplorerConfigBtn: ButtonOrUndefined;
fileExplorerConfigManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.enabledInFileExplorerConfig"))
.setDesc(i18n.t("setting.enabledInFileExplorerConfigDesc"))
.addToggle((toggle) => {
toggle
.setValue(settings.enabledFileExplorerSettings)
.onChange((value) => {
settings.enabledFileExplorerSettings = value;
fileExplorerConfigBtn?.setDisabled(!value);
this.plugin.saveSettings();
});
})
.addButton((button) => {
fileExplorerConfigBtn = button;
button
.setButtonText(i18n.t("button.config"))
.onClick(() => {
this.manageHeadingDecoratorSettings("fileExplorerSettings");
})
.setDisabled(!settings.enabledFileExplorerSettings);
})
);
if (!settings.enabledInFileExplorer) {
fileExplorerConfigManager.hide();
}
new Setting(containerEl).setName(i18n.t("setting.blocklist")).setHeading();
//* folderBlacklist
new Setting(containerEl)
.setName(i18n.t("setting.folderBlacklist"))
.addButton((button) => {
button.setButtonText(i18n.t("button.manage")).onClick(() => {
this.manageFolderBlacklist(true);
});
});
//* fileRegexBlacklist
new Setting(containerEl)
.setName(i18n.t("setting.fileRegexBlacklist"))
.addButton((button) => {
button.setButtonText(i18n.t("button.manage")).onClick(() => {
this.manageFileRegexBlacklist(true);
});
});
}
private isOpacityValue(value: number): value is OpacityOptions {
if (value >= 10 && value <= 100 && value % 10 === 0) {
return true;
}
return false;
}
private isDecoratorModeValue(value: string): value is DecoratorMode {
return ["orderd", "independent", "splice", "unordered"].includes(value);
}
private isPositionValue(value: string): value is PostionOptions {
return ["before", "after", "before-inside", "after-inside"].includes(value);
}
private isRenderPolicy(value: string): value is RenderPolicy {
return ["partial", "full"].includes(value);
}
private isGutterPosition(value: string): value is GutterPosition {
return ["before-line-numbers", "after-line-numbers"].includes(value);
}
private manageHeadingDecoratorSettings(
settingsType: PluginDecoratorSettingsType
) {
const {
containerEl,
plugin: { settings, i18n },
} = this;
containerEl.empty();
let tabName = "";
switch (settingsType) {
case "commonSettings":
tabName = i18n.t("setting.commonConfig");
break;
case "readingSettings":
tabName = i18n.t("setting.enabledInReadingConfig");
break;
case "previewSettings":
tabName = i18n.t("setting.enabledInPreviewConfig");
break;
case "sourceSettings":
tabName = i18n.t("setting.enabledInSourceConfig");
break;
case "outlineSettings":
tabName = i18n.t("setting.enabledInOutlineConfig");
break;
case "quietOutlineSettings":
tabName = i18n.t("setting.enabledInQuietOutlineConfig");
break;
case "fileExplorerSettings":
tabName = i18n.t("setting.enabledInFileExplorerConfig");
break;
case "gutterSettings":
tabName = i18n.t("setting.enabledInGutterConfig");
break;
}
new Setting(containerEl)
.setName(tabName)
.setHeading()
.addButton((button) => {
button.setButtonText(i18n.t("button.back")).onClick(() => {
this.display();
});
});
//* enabledInEachNote
new Setting(containerEl)
.setName(i18n.t("setting.enabledInEachNote"))
.setDesc(i18n.t("setting.enabledInEachNoteDesc"))
.addToggle((toggle) =>
toggle
.setValue(settings[settingsType].enabledInEachNote ?? true)
.onChange((value) => {
settings[settingsType].enabledInEachNote = value;
this.plugin.saveSettings();
})
);
new Setting(containerEl).setName(i18n.t("setting.effect")).setHeading();
//* decoratorMode
new Setting(containerEl)
.setName(i18n.t("setting.decoratorMode"))
.setDesc(i18n.t("setting.decoratorModeDesc"))
.addDropdown((dropdown) => {
const options: Record<DecoratorMode, string> = {
orderd: i18n.t("setting.ordered"),
independent: i18n.t("setting.independent"),
splice: i18n.t("setting.splice"),
unordered: i18n.t("setting.unordered"),
};
dropdown
.addOptions(options)
.setValue(settings[settingsType].decoratorMode || "orderd")
.onChange((value) => {
settings[settingsType].decoratorMode = this.isDecoratorModeValue(
value
)
? value
: "orderd";
switch (settings[settingsType].decoratorMode) {
case "orderd":
orderedManager.show();
logicManager.show();
independentManager.hide();
spliceManager.hide();
unorderedManager.hide();
break;
case "independent":
independentManager.show();
logicManager.show();
orderedManager.hide();
spliceManager.hide();
unorderedManager.hide();
break;
case "splice":
spliceManager.show();
logicManager.show();
orderedManager.hide();
independentManager.hide();
unorderedManager.hide();
break;
case "unordered":
unorderedManager.show();
orderedManager.hide();
independentManager.hide();
spliceManager.hide();
logicManager.hide();
break;
}
this.plugin.saveSettings();
});
});
//* opacity
new Setting(containerEl)
.setName(i18n.t("setting.opacity"))
.setDesc(i18n.t("setting.opacityDesc"))
.addSlider((slider) =>
slider
.setLimits(10, 100, 10)
.setValue(settings[settingsType].opacity)
.onChange((value) => {
settings[settingsType].opacity = this.isOpacityValue(value)
? value
: 20;
this.plugin.saveSettings();
})
.setDynamicTooltip()
);
//* position
new Setting(containerEl)
.setName(i18n.t("setting.position"))
.setDesc(i18n.t("setting.positionDesc"))
.addDropdown((dropdown) => {
const options: Record<string, string> =
settingsType === "outlineSettings" ||
settingsType === "quietOutlineSettings" ||
settingsType === "fileExplorerSettings"
? {
before: i18n.t("setting.before"),
after: i18n.t("setting.after"),
}
: {
before: i18n.t("setting.before"),
"before-inside": i18n.t("setting.beforeInside"),
after: i18n.t("setting.after"),
"after-inside": i18n.t("setting.afterInside"),
};
dropdown
.addOptions(options)
.setValue(settings[settingsType].position)
.onChange((value) => {
settings[settingsType].position = this.isPositionValue(value)
? value
: "before";
this.plugin.saveSettings();
});
});
//* maxRecLevel
new Setting(containerEl)
.setName(i18n.t("setting.maxRecLevel"))
.setDesc(i18n.t("setting.maxRecLevelDesc"))
.addSlider((slider) => {
slider
.setLimits(1, 6, 1)
.setValue(settings[settingsType].maxRecLevel ?? 6)
.onChange((value) => {
settings[settingsType].maxRecLevel = value;
this.plugin.saveSettings();
})
.setDynamicTooltip();
});
const orderedManager = new SettingDisplayManager();
this.orderedSettings(orderedManager, containerEl, settings[settingsType]);
if (
settings[settingsType].decoratorMode &&
settings[settingsType].decoratorMode !== "orderd"
) {
orderedManager.hide();
}
const independentManager = new SettingDisplayManager();
if (!settings[settingsType].independentSettings) {
settings[settingsType].independentSettings = defaultIndependentSettings();
}
this.independentSettings(
independentManager,
containerEl,
settings[settingsType].independentSettings
);
if (settings[settingsType].decoratorMode !== "independent") {
independentManager.hide();
}
const spliceManager = new SettingDisplayManager();
if (!settings[settingsType].spliceSettings) {
settings[settingsType].spliceSettings = defaultSpliceSettings();
}
this.spliceSettings(
spliceManager,
containerEl,
settings[settingsType].spliceSettings
);
if (settings[settingsType].decoratorMode !== "splice") {
spliceManager.hide();
}
const unorderedManager = new SettingDisplayManager();
this.unorderedSettings(
unorderedManager,
containerEl,
settings[settingsType]
);
if (settings[settingsType].decoratorMode !== "unordered") {
unorderedManager.hide();
}
const logicManager = new SettingDisplayManager();
this.logicSettings(logicManager, containerEl, settings[settingsType]);
if (settings[settingsType].decoratorMode === "unordered") {
logicManager.hide();
}
//* Scroll back to the top
containerEl.scrollTo({ top: 0, behavior: "smooth" });
}
private orderedSettings(
displayManager: SettingDisplayManager,
containerEl: HTMLElement,
settings: HeadingDecoratorSettings
) {
const {
plugin: { i18n },
} = this;
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.ordered")).setHeading()
);
//* orderedStyleType
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedStyleType"))
.setDesc(i18n.t("setting.orderedStyleTypeDesc"))
.addDropdown((dropdown) =>
dropdown
.addOptions(this.styleTypeOptions)
.setValue(settings.orderedStyleType)
.onChange((value: OrderedCounterStyleType) => {
settings.orderedStyleType = value;
switch (value) {
case "customIdent":
orderedCustomIdentsManager.show();
orderedSpecifiedStringManager.hide();
break;
case "string":
orderedSpecifiedStringManager.show();
orderedCustomIdentsManager.hide();
break;
default:
orderedCustomIdentsManager.hide();
orderedSpecifiedStringManager.hide();
break;
}
this.plugin.saveSettings();
})
)
);
//* orderedDelimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedDelimiter"))
.setDesc(i18n.t("setting.orderedDelimiterDesc"))
.addText((text) =>
text.setValue(settings.orderedDelimiter).onChange((value) => {
settings.orderedDelimiter = value;
this.plugin.saveSettings();
})
)
);
//* orderedTrailingDelimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedTrailingDelimiter"))
.setDesc(i18n.t("setting.orderedTrailingDelimiterDesc"))
.addToggle((toggle) =>
toggle
.setValue(settings.orderedTrailingDelimiter)
.onChange((value) => {
settings.orderedTrailingDelimiter = value;
value
? orderedCustomTrailingDelimiterManager.show()
: orderedCustomTrailingDelimiterManager.hide();
this.plugin.saveSettings();
})
)
);
const orderedCustomTrailingDelimiterManager = new SettingDisplayManager();
displayManager.add(orderedCustomTrailingDelimiterManager);
//* orderedCustomTrailingDelimiter
orderedCustomTrailingDelimiterManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomTrailingDelimiter"))
.setDesc(i18n.t("setting.orderedCustomTrailingDelimiterDesc"))
.addText((text) => {
text
.setValue(settings.orderedCustomTrailingDelimiter || "")
.onChange((value) => {
settings.orderedCustomTrailingDelimiter = value;
this.plugin.saveSettings();
});
})
);
if (!settings.orderedTrailingDelimiter) {
orderedCustomTrailingDelimiterManager.hide();
}
//* orderedLeadingDelimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedLeadingDelimiter"))
.setDesc(i18n.t("setting.orderedLeadingDelimiterDesc"))
.addToggle((toggle) =>
toggle
.setValue(settings.orderedLeadingDelimiter || false)
.onChange((value) => {
settings.orderedLeadingDelimiter = value;
value
? orderedCustomLeadingDelimiterManager.show()
: orderedCustomLeadingDelimiterManager.hide();
this.plugin.saveSettings();
})
)
);
const orderedCustomLeadingDelimiterManager = new SettingDisplayManager();
displayManager.add(orderedCustomLeadingDelimiterManager);
//* orderedCustomLeadingDelimiter
orderedCustomLeadingDelimiterManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomLeadingDelimiter"))
.setDesc(i18n.t("setting.orderedCustomLeadingDelimiterDesc"))
.addText((text) => {
text
.setValue(settings.orderedCustomLeadingDelimiter || "")
.onChange((value) => {
settings.orderedCustomLeadingDelimiter = value;
this.plugin.saveSettings();
});
})
);
if (!settings.orderedLeadingDelimiter) {
orderedCustomLeadingDelimiterManager.hide();
}
const orderedCustomIdentsManager = new SettingDisplayManager();
displayManager.add(orderedCustomIdentsManager);
//* orderedCustomIdents
orderedCustomIdentsManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomIdents"))
.setDesc(i18n.t("setting.orderedCustomIdentsDesc"))
.addText((text) =>
text.setValue(settings.orderedCustomIdents).onChange((value) => {
settings.orderedCustomIdents = value;
this.plugin.saveSettings();
})
)
);
if (settings.orderedStyleType !== "customIdent") {
orderedCustomIdentsManager.hide();
}
const orderedSpecifiedStringManager = new SettingDisplayManager();
displayManager.add(orderedSpecifiedStringManager);
//* orderedSpecifiedString
orderedSpecifiedStringManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedSpecifiedString"))
.setDesc(i18n.t("setting.orderedSpecifiedStringDesc"))
.addText((text) =>
text.setValue(settings.orderedSpecifiedString).onChange((value) => {
settings.orderedSpecifiedString = value;
this.plugin.saveSettings();
})
)
);
if (settings.orderedStyleType !== "string") {
orderedSpecifiedStringManager.hide();
}
}
private independentSettings(
displayManager: SettingDisplayManager,
containerEl: HTMLElement,
settings: IndependentSettings
) {
const {
plugin: { i18n },
} = this;
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.independent"))
.setHeading()
);
//* orderedRecLevel
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedRecLevel"))
.setDesc(i18n.t("setting.orderedRecLevelDesc"))
.addSlider((slider) => {
slider
.setLimits(2, 6, 1)
.setValue(settings.orderedRecLevel)
.onChange((value) => {
settings.orderedRecLevel = value;
this.plugin.saveSettings();
})
.setDynamicTooltip();
})
);
//* h1
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h1")).setHeading()
);
this.independentDecoratorSettings(displayManager, containerEl, settings.h1);
//* h2
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h2")).setHeading()
);
this.independentDecoratorSettings(displayManager, containerEl, settings.h2);
//* h3
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h3")).setHeading()
);
this.independentDecoratorSettings(displayManager, containerEl, settings.h3);
//* h4
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h4")).setHeading()
);
this.independentDecoratorSettings(displayManager, containerEl, settings.h4);
//* h5
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h5")).setHeading()
);
this.independentDecoratorSettings(displayManager, containerEl, settings.h5);
//* h6
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h6")).setHeading()
);
this.independentDecoratorSettings(displayManager, containerEl, settings.h6);
}
private unorderedSettings(
displayManager: SettingDisplayManager,
containerEl: HTMLElement,
settings: HeadingDecoratorSettings
) {
const {
plugin: { i18n },
} = this;
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.unordered")).setHeading()
);
//* unorderedLevelHeadings
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.unorderedLevelHeadings"))
.setDesc(i18n.t("setting.unorderedLevelHeadingsDesc"))
.addText((text) =>
text.setValue(settings.unorderedLevelHeadings).onChange((value) => {
settings.unorderedLevelHeadings = value;
this.plugin.saveSettings();
})
)
);
}
private logicSettings(
displayManager: SettingDisplayManager,
containerEl: HTMLElement,
settings: HeadingDecoratorSettings
) {
const {
plugin: { i18n },
} = this;
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.logic")).setHeading()
);
//* orderedAllowZeroLevel
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedAllowZeroLevel"))
.setDesc(i18n.t("setting.orderedAllowZeroLevelDesc"))
.addToggle((toggle) =>
toggle
.setValue(settings.orderedAllowZeroLevel ?? false)
.onChange((value) => {
settings.orderedAllowZeroLevel = value;
this.plugin.saveSettings();
})
)
);
//* orderedBasedOnExisting
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedBasedOnExisting"))
.setDesc(i18n.t("setting.orderedBasedOnExistingDesc"))
.addToggle((toggle) =>
toggle
.setValue(settings.orderedBasedOnExisting ?? false)
.onChange((value) => {
settings.orderedBasedOnExisting = value;
this.plugin.saveSettings();
})
)
);
//* orderedAlwaysIgnore
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedAlwaysIgnore"))
.setDesc(i18n.t("setting.orderedAlwaysIgnoreDesc"))
.addToggle((toggle) =>
toggle
.setValue(settings.orderedAlwaysIgnore ?? false)
.onChange((value) => {
settings.orderedAlwaysIgnore = value;
this.plugin.saveSettings();
})
)
);
//* orderedIgnoreSingle
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedIgnoreSingle"))
.setDesc(i18n.t("setting.orderedIgnoreSingleDesc"))
.addToggle((toggle) =>
toggle.setValue(settings.orderedIgnoreSingle).onChange((value) => {
settings.orderedIgnoreSingle = value;
this.plugin.saveSettings();
})
)
);
//* orderedIgnoreMaximum
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedIgnoreMaximum"))
.setDesc(i18n.t("setting.orderedIgnoreMaximumDesc"))
.addSlider((slider) =>
slider
.setLimits(1, 6, 1)
.setValue(settings.orderedIgnoreMaximum ?? 6)
.onChange((value) => {
settings.orderedIgnoreMaximum = value;
this.plugin.saveSettings();
})
.setDynamicTooltip()
)
);
}
private spliceSettings(
displayManager: SettingDisplayManager,
containerEl: HTMLElement,
settings: SpliceSettings
) {
const {
plugin: { i18n },
} = this;
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.splice")).setHeading()
);
//* delimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedDelimiter"))
.setDesc(i18n.t("setting.orderedDelimiterDesc"))
.addText((text) =>
text.setValue(settings.delimiter).onChange((value) => {
settings.delimiter = value;
this.plugin.saveSettings();
})
)
);
//* trailingDelimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedTrailingDelimiter"))
.setDesc(i18n.t("setting.orderedTrailingDelimiterDesc"))
.addToggle((toggle) =>
toggle.setValue(settings.trailingDelimiter).onChange((value) => {
settings.trailingDelimiter = value;
value
? customTrailingDelimiterManager.show()
: customTrailingDelimiterManager.hide();
this.plugin.saveSettings();
})
)
);
const customTrailingDelimiterManager = new SettingDisplayManager();
displayManager.add(customTrailingDelimiterManager);
//* customTrailingDelimiter
customTrailingDelimiterManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomTrailingDelimiter"))
.setDesc(i18n.t("setting.orderedCustomTrailingDelimiterDesc"))
.addText((text) => {
text
.setValue(settings.customTrailingDelimiter || "")
.onChange((value) => {
settings.customTrailingDelimiter = value;
this.plugin.saveSettings();
});
})
);
if (!settings.trailingDelimiter) {
customTrailingDelimiterManager.hide();
}
//* leadingDelimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedLeadingDelimiter"))
.setDesc(i18n.t("setting.orderedLeadingDelimiterDesc"))
.addToggle((toggle) =>
toggle
.setValue(settings.leadingDelimiter || false)
.onChange((value) => {
settings.leadingDelimiter = value;
value
? customLeadingDelimiterManater.show()
: customLeadingDelimiterManater.hide();
this.plugin.saveSettings();
})
)
);
const customLeadingDelimiterManater = new SettingDisplayManager();
displayManager.add(customLeadingDelimiterManater);
//* customLeadingDelimiter
customLeadingDelimiterManater.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomLeadingDelimiter"))
.setDesc(i18n.t("setting.orderedCustomLeadingDelimiterDesc"))
.addText((text) => {
text
.setValue(settings.customLeadingDelimiter || "")
.onChange((value) => {
settings.customLeadingDelimiter = value;
this.plugin.saveSettings();
});
})
);
if (!settings.leadingDelimiter) {
customLeadingDelimiterManater.hide();
}
//* h1
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h1")).setHeading()
);
this.spliceDecoratorSettings(displayManager, containerEl, settings.h1);
//* h2
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h2")).setHeading()
);
this.spliceDecoratorSettings(displayManager, containerEl, settings.h2);
//* h3
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h3")).setHeading()
);
this.spliceDecoratorSettings(displayManager, containerEl, settings.h3);
//* h4
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h4")).setHeading()
);
this.spliceDecoratorSettings(displayManager, containerEl, settings.h4);
//* h5
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h5")).setHeading()
);
this.spliceDecoratorSettings(displayManager, containerEl, settings.h5);
//* h6
displayManager.add(
new Setting(containerEl).setName(i18n.t("setting.h6")).setHeading()
);
this.spliceDecoratorSettings(displayManager, containerEl, settings.h6);
}
private manageFolderBlacklist(scrollToTop = false) {
const {
containerEl,
plugin: { settings, i18n },
} = this;
containerEl.empty();
new Setting(containerEl)
.setName(i18n.t("setting.folderBlacklist"))
.setHeading()
.addButton((button) => {
button.setButtonText(i18n.t("button.back")).onClick(() => {
this.display();
});
});
settings.folderBlacklist.forEach((folder, index) => {
new Setting(containerEl)
.setName(
i18n.t("setting.folderBlocklistIndex", {
index: index + 1,
})
)
.addText((text) => {
text.setValue(folder).onChange((value) => {
settings.folderBlacklist[index] = value;
this.plugin.saveSettings();
});
const suggest = new FolderSuggest(this.app, text.inputEl);
suggest.onSelect((value) => {
text.setValue(value);
settings.folderBlacklist[index] = value;
suggest.close();
this.plugin.saveSettings();
});
})
.addButton((button) => {
button
.setButtonText(i18n.t("button.delete"))
.setWarning()
.onClick(async () => {
settings.folderBlacklist.splice(index, 1);
await this.plugin.saveSettings();
this.manageFolderBlacklist();
});
});
});
new Setting(containerEl).addButton((button) => {
button
.setButtonText(i18n.t("button.add"))
.setCta()
.setTooltip(i18n.t("setting.folderBlocklistAddTip"))
.onClick(async () => {
settings.folderBlacklist.push("");
await this.plugin.saveSettings();
this.manageFolderBlacklist();
});
});
//* Scroll back to the top
if (scrollToTop) {
containerEl.scrollTo({ top: 0, behavior: "smooth" });
}
}
private manageFileRegexBlacklist(scrollToTop = false) {
const {
containerEl,
plugin: { settings, i18n },
} = this;
containerEl.empty();
new Setting(containerEl)
.setName(i18n.t("setting.fileRegexBlacklist"))
.setHeading()
.addButton((button) => {
button.setButtonText(i18n.t("button.back")).onClick(() => {
this.display();
});
});
settings.fileRegexBlacklist.forEach((regex, index) => {
new Setting(containerEl)
.setName(
i18n.t("setting.fileRegexBlocklistIndex", {
index: index + 1,
})
)
.addText((text) =>
text
.setPlaceholder(i18n.t("setting.fileRegexBlocklistPlaceholder"))
.setValue(regex)
.onChange((value) => {
settings.fileRegexBlacklist[index] = value.trim();
this.plugin.saveSettings();
})
)
.addButton((button) => {
button
.setButtonText(i18n.t("button.delete"))
.setWarning()
.onClick(async () => {
settings.fileRegexBlacklist.splice(index, 1);
await this.plugin.saveSettings();
this.manageFileRegexBlacklist();
});
});
});
new Setting(containerEl).addButton((button) => {
button
.setButtonText(i18n.t("button.add"))
.setCta()
.setTooltip(i18n.t("setting.fileRegexBlocklistAddTip"))
.onClick(async () => {
settings.fileRegexBlacklist.push("");
await this.plugin.saveSettings();
this.manageFileRegexBlacklist();
});
});
//* Scroll back to the top
if (scrollToTop) {
containerEl.scrollTo({ top: 0, behavior: "smooth" });
}
}
private independentDecoratorSettings(
displayManager: SettingDisplayManager,
containerEl: HTMLElement,
settings: IndependentDecoratorSettings
) {
const {
plugin: { i18n },
} = this;
//* styleType
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedStyleType"))
.setDesc(i18n.t("setting.orderedStyleTypeDesc"))
.addDropdown((dropdown) =>
dropdown
.addOptions(this.styleTypeOptions)
.setValue(settings.styleType)
.onChange((value: OrderedCounterStyleType) => {
settings.styleType = value;
switch (value) {
case "customIdent":
customIdentsManager.show();
specifiedStringManager.hide();
break;
case "string":
specifiedStringManager.show();
customIdentsManager.hide();
break;
default:
customIdentsManager.hide();
specifiedStringManager.hide();
break;
}
this.plugin.saveSettings();
})
)
);
//* delimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedDelimiter"))
.setDesc(i18n.t("setting.orderedDelimiterDesc"))
.addText((text) =>
text.setValue(settings.delimiter).onChange((value) => {
settings.delimiter = value;
this.plugin.saveSettings();
})
)
);
//* trailingDelimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedTrailingDelimiter"))
.setDesc(i18n.t("setting.orderedTrailingDelimiterDesc"))
.addToggle((toggle) =>
toggle.setValue(settings.trailingDelimiter).onChange((value) => {
settings.trailingDelimiter = value;
value
? customTrailingDelimiterManager.show()
: customTrailingDelimiterManager.hide();
this.plugin.saveSettings();
})
)
);
const customTrailingDelimiterManager = new SettingDisplayManager();
displayManager.add(customTrailingDelimiterManager);
//* customTrailingDelimiter
customTrailingDelimiterManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomTrailingDelimiter"))
.setDesc(i18n.t("setting.orderedCustomTrailingDelimiterDesc"))
.addText((text) => {
text
.setValue(settings.customTrailingDelimiter || "")
.onChange((value) => {
settings.customTrailingDelimiter = value;
this.plugin.saveSettings();
});
})
);
if (!settings.trailingDelimiter) {
customTrailingDelimiterManager.hide();
}
//* leadingDelimiter
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedLeadingDelimiter"))
.setDesc(i18n.t("setting.orderedLeadingDelimiterDesc"))
.addToggle((toggle) =>
toggle
.setValue(settings.leadingDelimiter || false)
.onChange((value) => {
settings.leadingDelimiter = value;
value
? customLeadingDelimiterManager.show()
: customLeadingDelimiterManager.hide();
this.plugin.saveSettings();
})
)
);
const customLeadingDelimiterManager = new SettingDisplayManager();
displayManager.add(customLeadingDelimiterManager);
//* customLeadingDelimiter
customLeadingDelimiterManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomLeadingDelimiter"))
.setDesc(i18n.t("setting.orderedCustomLeadingDelimiterDesc"))
.addText((text) => {
text
.setValue(settings.customLeadingDelimiter || "")
.onChange((value) => {
settings.customLeadingDelimiter = value;
this.plugin.saveSettings();
});
})
);
if (!settings.leadingDelimiter) {
customLeadingDelimiterManager.hide();
}
const customIdentsManager = new SettingDisplayManager();
displayManager.add(customIdentsManager);
//* customIdents
customIdentsManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomIdents"))
.setDesc(i18n.t("setting.orderedCustomIdentsDesc"))
.addText((text) =>
text.setValue(settings.customIdents).onChange((value) => {
settings.customIdents = value;
this.plugin.saveSettings();
})
)
);
if (settings.styleType !== "customIdent") {
customIdentsManager.hide();
}
const specifiedStringManager = new SettingDisplayManager();
displayManager.add(specifiedStringManager);
//* specifiedString
specifiedStringManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedSpecifiedString"))
.setDesc(i18n.t("setting.orderedSpecifiedStringDesc"))
.addText((text) =>
text.setValue(settings.specifiedString).onChange((value) => {
settings.specifiedString = value;
this.plugin.saveSettings();
})
)
);
if (settings.styleType !== "string") {
specifiedStringManager.hide();
}
}
private spliceDecoratorSettings(
displayManager: SettingDisplayManager,
containerEl: HTMLElement,
settings: SpliceDecoratorSettings
) {
const {
plugin: { i18n },
} = this;
//* styleType
displayManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedStyleType"))
.setDesc(i18n.t("setting.orderedStyleTypeDesc"))
.addDropdown((dropdown) =>
dropdown
.addOptions(this.styleTypeOptions)
.setValue(settings.styleType)
.onChange((value: OrderedCounterStyleType) => {
settings.styleType = value;
switch (value) {
case "customIdent":
customIdentsManager.show();
specifiedStringManager.hide();
break;
case "string":
specifiedStringManager.show();
customIdentsManager.hide();
break;
default:
customIdentsManager.hide();
specifiedStringManager.hide();
break;
}
this.plugin.saveSettings();
})
)
);
const customIdentsManager = new SettingDisplayManager();
displayManager.add(customIdentsManager);
//* customIdents
customIdentsManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomIdents"))
.setDesc(i18n.t("setting.orderedCustomIdentsDesc"))
.addText((text) =>
text.setValue(settings.customIdents).onChange((value) => {
settings.customIdents = value;
this.plugin.saveSettings();
})
)
);
if (settings.styleType !== "customIdent") {
customIdentsManager.hide();
}
const specifiedStringManager = new SettingDisplayManager();
displayManager.add(specifiedStringManager);
//* specifiedString
specifiedStringManager.add(
new Setting(containerEl)
.setName(i18n.t("setting.orderedSpecifiedString"))
.setDesc(i18n.t("setting.orderedSpecifiedStringDesc"))
.addText((text) =>
text.setValue(settings.specifiedString).onChange((value) => {
settings.specifiedString = value;
this.plugin.saveSettings();
})
)
);
if (settings.styleType !== "string") {
specifiedStringManager.hide();
}
}
}