diff --git a/common.ts b/common.ts index 203fadb..1c783fd 100644 --- a/common.ts +++ b/common.ts @@ -27,6 +27,7 @@ export interface LoomSettings { modelPresets: ModelPreset[]; modelPreset: number; + visibility: Record; maxTokens: number; temperature: number; topP: number; diff --git a/main.ts b/main.ts index d8ce98a..36c91eb 100644 --- a/main.ts +++ b/main.ts @@ -54,6 +54,18 @@ const DEFAULT_SETTINGS: LoomSettings = { modelPresets: [], modelPreset: -1, + visibility: { + "visibility": true, + "modelPreset": true, + "maxTokens": true, + "n": true, + "bestOf": false, + "temperature": true, + "topP": false, + "frequencyPenalty": false, + "presencePenalty": false, + "prepend": false, + }, maxTokens: 60, temperature: 1, topP: 1, @@ -979,6 +991,17 @@ export default class LoomPlugin extends Plugin { ) ); + this.registerEvent( + this.app.workspace.on( + // @ts-expect-error + "loom:set-visibility-setting", + (setting: string, value: boolean) => { + this.settings.visibility[setting] = value; + this.saveAndRender(); + } + ) + ); + this.registerEvent( // @ts-expect-error this.app.workspace.on("loom:search", (term: string) => this.withFile((file) => { diff --git a/manifest.json b/manifest.json index 9702ff9..91cc8be 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "loom", "name": "Loom", - "version": "1.19.4", + "version": "1.20.0", "minAppVersion": "0.15.0", "description": "Loom in Obsidian", "author": "celeste", diff --git a/package.json b/package.json index 7bb9cbc..860dff4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-loom", - "version": "1.19.4", + "version": "1.20.0", "description": "Loom in Obsidian", "main": "main.js", "scripts": { diff --git a/styles.css b/styles.css index edfb72e..9a7a0ad 100644 --- a/styles.css +++ b/styles.css @@ -82,6 +82,26 @@ body { margin-bottom: 0.3em; } +.loom__visibility { + margin-bottom: 0.7em; +} + +.loom__visibility-item { + display: inline-flex; + align-items: center; + margin-right: 0.7em; +} + +.loom__visibility-item-label { + font-size: var(--font-ui-small); +} + +.loom__no-metavisibility { + color: var(--text-faint); + font-size: var(--font-ui-small); + margin: 0 0 0.5em 0.5em; +} + .loom__setting { display: flex; flex-direction: column; diff --git a/views.ts b/views.ts index 52da348..34a6f2e 100644 --- a/views.ts +++ b/views.ts @@ -269,26 +269,69 @@ export class LoomView extends ItemView { renderSettings(container: HTMLElement, settings: LoomSettings) { const settingsContainer = container.createDiv({ cls: "loom__settings" }); + // visibility checkboxes + + const visibilityContainer = settingsContainer.createDiv({ cls: "loom__visibility" }); + + const createCheckbox = (id: string, label: string, ellipsis: boolean = false) => { + const checkboxContainer = visibilityContainer.createSpan({ cls: "loom__visibility-item" }); + const checkbox = checkboxContainer.createEl("input", { + attr: { + id: `loom__${id}-checkbox`, + checked: settings.visibility[id] ? "checked" : null + }, + type: "checkbox", + }); + checkbox.addEventListener("change", () => + this.app.workspace.trigger("loom:set-visibility-setting", id, checkbox.checked) + ); + + const checkboxLabel = checkboxContainer.createEl("label", { + attr: { for: `loom__${id}-checkbox` }, + cls: "loom__visibility-item-label", + text: label, + }); + if (ellipsis && !settings.visibility.visibility) checkboxLabel.createSpan({ + cls: "loom__no-metavisibility", + text: "...", + }); + }; + + createCheckbox("visibility", "These checkboxes", true); + if (settings.visibility["visibility"]) { + createCheckbox("modelPreset", "Model preset"); + createCheckbox("maxTokens", "Length"); + createCheckbox("n", "Number of completions"); + createCheckbox("bestOf", "Best of"); + createCheckbox("temperature", "Temperature"); + createCheckbox("topP", "Top p"); + createCheckbox("frequencyPenalty", "Frequency penalty"); + createCheckbox("presencePenalty", "Presence penalty"); + createCheckbox("prepend", "Prepend sequence"); + } + // preset dropdown - const presetContainer = settingsContainer.createDiv({ cls: "loom__setting" }); - presetContainer.createEl("label", { text: "Model preset" }); - const presetDropdown = presetContainer.createEl("select"); + if (settings.visibility["modelPreset"]) { + const presetContainer = settingsContainer.createDiv({ cls: "loom__setting" }); + presetContainer.createEl("label", { text: "Model preset" }); + const presetDropdown = presetContainer.createEl("select"); - if (settings.modelPresets.length === 0) - presetDropdown.createEl("option").createEl("i", { text: "[You have no presets. Go to Settings → Loom.]" }); - else { - for (const i in settings.modelPresets) { - const preset = settings.modelPresets[i]; - presetDropdown.createEl("option", { - text: preset.name, - attr: { selected: settings.modelPreset === parseInt(i), value: i }, - }); + if (settings.modelPresets.length === 0) + presetDropdown.createEl("option").createEl("i", { text: "[You have no presets. Go to Settings → Loom.]" }); + else { + for (const i in settings.modelPresets) { + const preset = settings.modelPresets[i]; + presetDropdown.createEl("option", { + text: preset.name, + attr: { selected: settings.modelPreset === parseInt(i), value: i }, + }); + } + + presetDropdown.addEventListener("change", () => + this.app.workspace.trigger("loom:set-setting", "modelPreset", presetDropdown.value) + ); } - - presetDropdown.addEventListener("change", () => - this.app.workspace.trigger("loom:set-setting", "modelPreset", presetDropdown.value) - ); } // other settings @@ -299,6 +342,8 @@ export class LoomView extends ItemView { value: string, type: "string" | "int" | "float" ) => { + if (!settings.visibility[setting]) return; + const parsers = { "string": (value: string) => value, "int": (value: string) => parseInt(value),