feat(ui): add option to manually add weight

This commit is contained in:
Kritagya Bhattarai (CalfMoon) 2026-03-29 18:42:13 +05:45
parent 783607292d
commit fd824ea406
3 changed files with 119 additions and 16 deletions

32
src/file-suggest.ts Normal file
View file

@ -0,0 +1,32 @@
import { App, AbstractInputSuggest } from "obsidian";
export default class FileSuggest extends AbstractInputSuggest<string> {
private files: Array<string>;
private inputEl: HTMLInputElement;
constructor(app: App, inputEl: HTMLInputElement) {
super(app, inputEl);
this.inputEl = inputEl;
this.files = this.app.vault.getFiles().map((file) => file.path);
}
getSuggestions(inputStr: string): string[] {
const inputLower = inputStr.toLowerCase();
return this.files.filter((file) =>
file.toLowerCase().includes(inputLower),
);
}
renderSuggestion(folder: string, el: HTMLElement): void {
el.setText(folder);
}
selectSuggestion(folder: string): void {
this.inputEl.value = folder;
const event = new Event("input");
this.inputEl.dispatchEvent(event);
this.close();
}
}

View file

@ -1,6 +1,15 @@
import { App, PluginSettingTab, Setting } from "obsidian"; import {
App,
ButtonComponent,
PluginSettingTab,
SearchComponent,
Setting,
SliderComponent,
} from "obsidian";
import NodeFactor from "./main"; import NodeFactor from "./main";
import FileSuggest from "./file-suggest";
import { FileData } from "./types";
export default class NodeFactorSettingTab extends PluginSettingTab { export default class NodeFactorSettingTab extends PluginSettingTab {
plugin: NodeFactor; plugin: NodeFactor;
@ -14,57 +23,61 @@ export default class NodeFactorSettingTab extends PluginSettingTab {
const { containerEl } = this; const { containerEl } = this;
containerEl.empty(); containerEl.empty();
new Setting(containerEl)
.setName("Programatically Set Size")
.setHeading();
new Setting(containerEl) new Setting(containerEl)
.setName("Forward link weight multiplier") .setName("Forward link weight multiplier")
.setDesc("Multiplier for forward links weight (0 to disable).") .setDesc("Multiplier for forward links weight (0 to disable).")
.addSlider((slider) => .addSlider((slider) => {
slider slider
.setLimits(0, 20, 1) .setLimits(0, 20, 1)
.setDynamicTooltip() .setDynamicTooltip()
.setValue(this.plugin.settings.fwdMultiplier) .setValue(this.plugin.settings.fwdMultiplier)
.onChange(async (value) => { .onChange(async (value) => {
this.plugin.recalculateSize();
this.plugin.settings.fwdMultiplier = value; this.plugin.settings.fwdMultiplier = value;
await this.plugin.saveSettings(); await this.plugin.saveSettings();
}), this.plugin.recalculateSize();
); });
});
new Setting(containerEl) new Setting(containerEl)
.setName("Travel forward tree") .setName("Travel forward tree")
.setDesc( .setDesc(
"Travel forward and add all other nodes to determine final node size.", "Travel forward and add all other nodes to determine final node size.",
) )
.addToggle((toggle) => .addToggle((toggle) => {
toggle toggle
.setValue(this.plugin.settings.fwdTree) .setValue(this.plugin.settings.fwdTree)
.onChange(async (value) => { .onChange(async (value) => {
this.plugin.recalculateSize();
this.plugin.settings.fwdTree = value; this.plugin.settings.fwdTree = value;
await this.plugin.saveSettings(); await this.plugin.saveSettings();
}), this.plugin.recalculateSize();
); });
});
new Setting(containerEl) new Setting(containerEl)
.setName("Backward link weight multiplier") .setName("Backward link weight multiplier")
.setDesc("Multiplier for backward links weight (0 to disable).") .setDesc("Multiplier for backward links weight (0 to disable).")
.addSlider((slider) => .addSlider((slider) => {
slider slider
.setLimits(0, 20, 1) .setLimits(0, 20, 1)
.setDynamicTooltip() .setDynamicTooltip()
.setValue(this.plugin.settings.bwdMultiplier) .setValue(this.plugin.settings.bwdMultiplier)
.onChange(async (value) => { .onChange(async (value) => {
this.plugin.recalculateSize();
this.plugin.settings.bwdMultiplier = value; this.plugin.settings.bwdMultiplier = value;
await this.plugin.saveSettings(); await this.plugin.saveSettings();
}), this.plugin.recalculateSize();
); });
});
new Setting(containerEl) new Setting(containerEl)
.setName("Character per weight") .setName("Character per weight")
.setDesc( .setDesc(
"Add 1 weight to node size per no of given Character (0 to disable).", "Add 1 weight to node size per no of given Character (0 to disable).",
) )
.addSlider((slider) => .addSlider((slider) => {
slider slider
.setLimits(0, 5000, 100) .setLimits(0, 5000, 100)
.setDynamicTooltip() .setDynamicTooltip()
@ -72,7 +85,56 @@ export default class NodeFactorSettingTab extends PluginSettingTab {
.onChange(async (value) => { .onChange(async (value) => {
this.plugin.settings.lettersPerWt = value; this.plugin.settings.lettersPerWt = value;
await this.plugin.saveSettings(); await this.plugin.saveSettings();
}), this.plugin.recalculateSize();
); });
});
new Setting(containerEl).setName("Manually Set Weight").setHeading();
let selectedWeight: SliderComponent;
let selectedFile: SearchComponent;
let submitButton: ButtonComponent;
new Setting(containerEl)
.setName("Add new weight")
.setDesc("Weight added here overrides everything else.")
.addSearch((search) => {
new FileSuggest(this.app, search.inputEl);
selectedFile = search;
search
.setPlaceholder("Enter File Name")
.onChange(async (value) => {
// fileName = value;
if (value != "") submitButton.setDisabled(false);
});
})
.addSlider((slider) => {
selectedWeight = slider;
slider
.setLimits(0, 100, 5)
.setDynamicTooltip()
.setValue(0)
.onChange(async (value) => {
// fileNodeSize = value;
});
})
.addButton((button) => {
submitButton = button;
button
.setDisabled(true)
.setButtonText("Add")
.setTooltip("Click to add")
.onClick(async () => {
let enteredFileData: FileData = {
id: selectedFile.getValue(),
weight: selectedWeight.getValue(),
};
this.plugin.settings.manual.push(enteredFileData);
selectedWeight.setValue(0);
selectedFile.setValue("");
await this.plugin.saveSettings();
this.plugin.recalculateSize();
});
});
} }
} }

View file

@ -12,6 +12,13 @@ export interface NodeFactorSettings {
bwdMultiplier: number; bwdMultiplier: number;
lettersPerWt: number; lettersPerWt: number;
manual: Array<FileData>;
}
export interface FileData {
id: string;
weight: number;
} }
export const DEFAULT_SETTINGS: NodeFactorSettings = { export const DEFAULT_SETTINGS: NodeFactorSettings = {
@ -21,4 +28,6 @@ export const DEFAULT_SETTINGS: NodeFactorSettings = {
bwdMultiplier: 1, bwdMultiplier: 1,
lettersPerWt: 0, lettersPerWt: 0,
manual: new Array<FileData>(),
}; };