为经典设置窗口添加实时读取和实时保存的能力

This commit is contained in:
浔阳陌客 2024-04-06 13:24:00 +08:00
parent 44d61785cf
commit f06c82085e
3 changed files with 89 additions and 7 deletions

View file

@ -177,6 +177,13 @@ export default class PluginSample extends Plugin {
type: "textinput", type: "textinput",
title: "Readonly text", title: "Readonly text",
description: "Input description", description: "Input description",
action: {
callback: () => {
// Return data and save it in real time
let value = this.settingUtils.takeAndSave("Input")
console.log(value);
}
}
}); });
this.settingUtils.addItem({ this.settingUtils.addItem({
key: "InputArea", key: "InputArea",
@ -184,6 +191,13 @@ export default class PluginSample extends Plugin {
type: "textarea", type: "textarea",
title: "Readonly text", title: "Readonly text",
description: "Input description", description: "Input description",
action: {
callback: () => {
// Read data in real time
let value = this.settingUtils.take("InputArea")
console.log(value);
}
}
}); });
this.settingUtils.addItem({ this.settingUtils.addItem({
key: "Check", key: "Check",
@ -191,9 +205,12 @@ export default class PluginSample extends Plugin {
type: "checkbox", type: "checkbox",
title: "Checkbox text", title: "Checkbox text",
description: "Check description", description: "Check description",
checkbox: { action: {
callback: () => { callback: () => {
console.log("Checkbox clicked"); // Return data and save it in real time
let value = !this.settingUtils.get("Check")
this.settingUtils.set("Check", value)
console.log(value);
} }
} }
}); });
@ -201,11 +218,18 @@ export default class PluginSample extends Plugin {
key: "Select", key: "Select",
value: 1, value: 1,
type: "select", type: "select",
title: "Readonly text", title: "Select",
description: "Select description", description: "Select description",
options: { options: {
1: "Option 1", 1: "Option 1",
2: "Option 2" 2: "Option 2"
},
action: {
callback: () => {
// Read data in real time
let value = this.settingUtils.take("Select")
console.log(value);
}
} }
}); });
this.settingUtils.addItem({ this.settingUtils.addItem({
@ -218,6 +242,15 @@ export default class PluginSample extends Plugin {
min: 0, min: 0,
max: 100, max: 100,
step: 1, step: 1,
},
action:{
// The callback is called after the action of Silder changes,
// so it should be the this.settingUtils.get() method.
callback: () => {
// Read data in real time
let value = this.settingUtils.get("Slider")
console.log(value);
}
} }
}); });
this.settingUtils.addItem({ this.settingUtils.addItem({

2
src/libs/index.d.ts vendored
View file

@ -12,7 +12,7 @@ interface ISettingItem {
step: number; step: number;
}; };
options?: { [key: string | number]: string }; options?: { [key: string | number]: string };
checkbox?: { action?: {
callback: () => void; callback: () => void;
} }
button?: { button?: {

View file

@ -65,7 +65,7 @@ export class SettingUtils {
} }
/** /**
* Get setting item value * read the data after saving
* @param key key name * @param key key name
* @returns setting item value * @returns setting item value
*/ */
@ -73,6 +73,27 @@ export class SettingUtils {
return this.settings.get(key)?.value; return this.settings.get(key)?.value;
} }
/**
* Read in real time,
* do not read from the configuration file
* @param key key name
* @returns value in html
*/
take(key: string) {
let item = this.getElement(key)
this.settings.set(key, item)
if (item.type === 'button') {
return item.value
}
return item.value
}
/**
* Set data to this.settings,
* but do not save it to the configuration file
* @param key key name
* @param value value
*/
set(key: string, value: any) { set(key: string, value: any) {
let item = this.settings.get(key); let item = this.settings.get(key);
if (item) { if (item) {
@ -80,6 +101,7 @@ export class SettingUtils {
this.updateElementFromValue(key); this.updateElementFromValue(key);
} }
} }
/** /**
* Set and save setting item value * Set and save setting item value
* If you want to set and save immediately you can use this method * If you want to set and save immediately you can use this method
@ -95,6 +117,18 @@ export class SettingUtils {
} }
} }
/**
* Read data from html and save it
* @param key key name
* @param value value
* @return value in html
*/
async takeAndSave(key: string) {
let value = this.take(key)
await this.save()
return value
}
/** /**
* Disable setting item * Disable setting item
* @param key key name * @param key key name
@ -105,6 +139,7 @@ export class SettingUtils {
element.disabled = true; element.disabled = true;
} }
} }
/** /**
* Enable setting item * Enable setting item
* @param key key name * @param key key name
@ -122,6 +157,8 @@ export class SettingUtils {
*/ */
dump(): Object { dump(): Object {
let data: any = {}; let data: any = {};
for (let [key, item] of this.settings) { for (let [key, item] of this.settings) {
if (item.type === 'button') continue; if (item.type === 'button') continue;
data[key] = item.value; data[key] = item.value;
@ -139,7 +176,7 @@ export class SettingUtils {
element.checked = item.value; element.checked = item.value;
element.className = "b3-switch fn__flex-center"; element.className = "b3-switch fn__flex-center";
itemElement = element; itemElement = element;
element.onchange = item.checkbox?.callback ?? (() => { }); element.onchange = item.action?.callback ?? (() => { });
break; break;
case 'select': case 'select':
let selectElement: HTMLSelectElement = document.createElement('select'); let selectElement: HTMLSelectElement = document.createElement('select');
@ -153,6 +190,7 @@ export class SettingUtils {
selectElement.appendChild(optionElement); selectElement.appendChild(optionElement);
} }
selectElement.value = item.value; selectElement.value = item.value;
selectElement.onchange = item.action?.callback ?? (() => { });
itemElement = selectElement; itemElement = selectElement;
break; break;
case 'slider': case 'slider':
@ -166,6 +204,7 @@ export class SettingUtils {
sliderElement.value = item.value; sliderElement.value = item.value;
sliderElement.onchange = () => { sliderElement.onchange = () => {
sliderElement.ariaLabel = sliderElement.value; sliderElement.ariaLabel = sliderElement.value;
item.action?.callback();
} }
itemElement = sliderElement; itemElement = sliderElement;
break; break;
@ -173,12 +212,15 @@ export class SettingUtils {
let textInputElement: HTMLInputElement = document.createElement('input'); let textInputElement: HTMLInputElement = document.createElement('input');
textInputElement.className = 'b3-text-field fn__flex-center fn__size200'; textInputElement.className = 'b3-text-field fn__flex-center fn__size200';
textInputElement.value = item.value; textInputElement.value = item.value;
textInputElement.onkeyup = item.action?.callback ?? (() => { });
itemElement = textInputElement; itemElement = textInputElement;
break; break;
case 'textarea': case 'textarea':
let textareaElement: HTMLTextAreaElement = document.createElement('textarea'); let textareaElement: HTMLTextAreaElement = document.createElement('textarea');
textareaElement.className = "b3-text-field fn__block"; textareaElement.className = "b3-text-field fn__block";
textareaElement.value = item.value; textareaElement.value = item.value;
textareaElement.onkeyup = item.action?.callback ?? (() => { });
itemElement = textareaElement; itemElement = textareaElement;
break; break;
case 'number': case 'number':
@ -192,7 +234,7 @@ export class SettingUtils {
let buttonElement: HTMLButtonElement = document.createElement('button'); let buttonElement: HTMLButtonElement = document.createElement('button');
buttonElement.className = "b3-button b3-button--outline fn__flex-center fn__size200"; buttonElement.className = "b3-button b3-button--outline fn__flex-center fn__size200";
buttonElement.innerText = item.button?.label ?? 'Button'; buttonElement.innerText = item.button?.label ?? 'Button';
buttonElement.onclick = item.button?.callback ?? (() => {}); buttonElement.onclick = item.button?.callback ?? (() => { });
itemElement = buttonElement; itemElement = buttonElement;
break; break;
case 'hint': case 'hint':
@ -212,11 +254,18 @@ export class SettingUtils {
}) })
} }
/**
* Set the value in the setting to the value of the element
* and return the element information
* @param key key name
* @returns element
*/
getElement(key: string) { getElement(key: string) {
let item = this.settings.get(key); let item = this.settings.get(key);
let element = this.elements.get(key) as any; let element = this.elements.get(key) as any;
switch (item.type) { switch (item.type) {
case 'checkbox': case 'checkbox':
element.value = element.checked ? true : false;
element.checked = item.value; element.checked = item.value;
break; break;
case 'select': case 'select':