|
var _a; |
|
import { app } from "../../scripts/app.js"; |
|
import { RgthreeBaseServerNode } from "./base_node.js"; |
|
import { rgthree } from "./rgthree.js"; |
|
import { addConnectionLayoutSupport } from "./utils.js"; |
|
import { NodeTypesString } from "./constants.js"; |
|
import { drawInfoIcon, drawNumberWidgetPart, drawRoundedRectangle, drawTogglePart, fitString, isLowQuality, } from "./utils_canvas.js"; |
|
import { RgthreeBaseWidget, RgthreeBetterButtonWidget, RgthreeDividerWidget, } from "./utils_widgets.js"; |
|
import { rgthreeApi } from "../../rgthree/common/rgthree_api.js"; |
|
import { showLoraChooser } from "./utils_menu.js"; |
|
import { moveArrayItem, removeArrayItem } from "../../rgthree/common/shared_utils.js"; |
|
import { RgthreeLoraInfoDialog } from "./dialog_info.js"; |
|
import { LORA_INFO_SERVICE } from "../../rgthree/common/model_info_service.js"; |
|
const PROP_LABEL_SHOW_STRENGTHS = "Show Strengths"; |
|
const PROP_LABEL_SHOW_STRENGTHS_STATIC = `@${PROP_LABEL_SHOW_STRENGTHS}`; |
|
const PROP_VALUE_SHOW_STRENGTHS_SINGLE = "Single Strength"; |
|
const PROP_VALUE_SHOW_STRENGTHS_SEPARATE = "Separate Model & Clip"; |
|
class RgthreePowerLoraLoader extends RgthreeBaseServerNode { |
|
constructor(title = NODE_CLASS.title) { |
|
super(title); |
|
this.serialize_widgets = true; |
|
this.logger = rgthree.newLogSession(`[Power Lora Stack]`); |
|
this.loraWidgetsCounter = 0; |
|
this.widgetButtonSpacer = null; |
|
this.properties[PROP_LABEL_SHOW_STRENGTHS] = PROP_VALUE_SHOW_STRENGTHS_SINGLE; |
|
rgthreeApi.getLoras(); |
|
} |
|
configure(info) { |
|
var _b; |
|
while ((_b = this.widgets) === null || _b === void 0 ? void 0 : _b.length) |
|
this.removeWidget(0); |
|
this.widgetButtonSpacer = null; |
|
super.configure(info); |
|
this._tempWidth = this.size[0]; |
|
this._tempHeight = this.size[1]; |
|
for (const widgetValue of info.widgets_values || []) { |
|
if ((widgetValue === null || widgetValue === void 0 ? void 0 : widgetValue.lora) !== undefined) { |
|
const widget = this.addNewLoraWidget(); |
|
widget.value = { ...widgetValue }; |
|
} |
|
} |
|
this.addNonLoraWidgets(); |
|
this.size[0] = this._tempWidth; |
|
this.size[1] = Math.max(this._tempHeight, this.computeSize()[1]); |
|
} |
|
onNodeCreated() { |
|
var _b; |
|
(_b = super.onNodeCreated) === null || _b === void 0 ? void 0 : _b.call(this); |
|
this.addNonLoraWidgets(); |
|
const computed = this.computeSize(); |
|
this.size = this.size || [0, 0]; |
|
this.size[0] = Math.max(this.size[0], computed[0]); |
|
this.size[1] = Math.max(this.size[1], computed[1]); |
|
this.setDirtyCanvas(true, true); |
|
} |
|
addNewLoraWidget(lora) { |
|
this.loraWidgetsCounter++; |
|
const widget = this.addCustomWidget(new PowerLoraLoaderWidget("lora_" + this.loraWidgetsCounter)); |
|
if (lora) |
|
widget.setLora(lora); |
|
if (this.widgetButtonSpacer) { |
|
moveArrayItem(this.widgets, widget, this.widgets.indexOf(this.widgetButtonSpacer)); |
|
} |
|
return widget; |
|
} |
|
addNonLoraWidgets() { |
|
moveArrayItem(this.widgets, this.addCustomWidget(new RgthreeDividerWidget({ marginTop: 4, marginBottom: 0, thickness: 0 })), 0); |
|
moveArrayItem(this.widgets, this.addCustomWidget(new PowerLoraLoaderHeaderWidget()), 1); |
|
this.widgetButtonSpacer = this.addCustomWidget(new RgthreeDividerWidget({ marginTop: 4, marginBottom: 0, thickness: 0 })); |
|
this.addCustomWidget(new RgthreeBetterButtonWidget("➕ Add Lora", (event, pos, node) => { |
|
rgthreeApi.getLoras().then((loras) => { |
|
showLoraChooser(event, (value) => { |
|
var _b; |
|
if (typeof value === "string") { |
|
if (value.includes("Power Lora Chooser")) { |
|
} |
|
else if (value !== "NONE") { |
|
this.addNewLoraWidget(value); |
|
const computed = this.computeSize(); |
|
const tempHeight = (_b = this._tempHeight) !== null && _b !== void 0 ? _b : 15; |
|
this.size[1] = Math.max(tempHeight, computed[1]); |
|
this.setDirtyCanvas(true, true); |
|
} |
|
} |
|
}, null, [...loras]); |
|
}); |
|
return true; |
|
})); |
|
} |
|
getSlotInPosition(canvasX, canvasY) { |
|
var _b; |
|
const slot = super.getSlotInPosition(canvasX, canvasY); |
|
if (!slot) { |
|
let lastWidget = null; |
|
for (const widget of this.widgets) { |
|
if (!widget.last_y) |
|
return; |
|
if (canvasY > this.pos[1] + widget.last_y) { |
|
lastWidget = widget; |
|
continue; |
|
} |
|
break; |
|
} |
|
if ((_b = lastWidget === null || lastWidget === void 0 ? void 0 : lastWidget.name) === null || _b === void 0 ? void 0 : _b.startsWith("lora_")) { |
|
return { widget: lastWidget, output: { type: "LORA WIDGET" } }; |
|
} |
|
} |
|
return slot; |
|
} |
|
getSlotMenuOptions(slot) { |
|
var _b, _c, _d, _e, _f, _g; |
|
if ((_c = (_b = slot === null || slot === void 0 ? void 0 : slot.widget) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.startsWith("lora_")) { |
|
const widget = slot.widget; |
|
const index = this.widgets.indexOf(widget); |
|
const canMoveUp = !!((_e = (_d = this.widgets[index - 1]) === null || _d === void 0 ? void 0 : _d.name) === null || _e === void 0 ? void 0 : _e.startsWith("lora_")); |
|
const canMoveDown = !!((_g = (_f = this.widgets[index + 1]) === null || _f === void 0 ? void 0 : _f.name) === null || _g === void 0 ? void 0 : _g.startsWith("lora_")); |
|
const menuItems = [ |
|
{ |
|
content: `ℹ️ Show Info`, |
|
callback: () => { |
|
widget.showLoraInfoDialog(); |
|
}, |
|
}, |
|
null, |
|
{ |
|
content: `${widget.value.on ? "⚫" : "🟢"} Toggle ${widget.value.on ? "Off" : "On"}`, |
|
callback: () => { |
|
widget.value.on = !widget.value.on; |
|
}, |
|
}, |
|
{ |
|
content: `⬆️ Move Up`, |
|
disabled: !canMoveUp, |
|
callback: () => { |
|
moveArrayItem(this.widgets, widget, index - 1); |
|
}, |
|
}, |
|
{ |
|
content: `⬇️ Move Down`, |
|
disabled: !canMoveDown, |
|
callback: () => { |
|
moveArrayItem(this.widgets, widget, index + 1); |
|
}, |
|
}, |
|
{ |
|
content: `🗑️ Remove`, |
|
callback: () => { |
|
removeArrayItem(this.widgets, widget); |
|
}, |
|
}, |
|
]; |
|
let canvas = app.canvas; |
|
new LiteGraph.ContextMenu(menuItems, { title: "LORA WIDGET", event: rgthree.lastAdjustedMouseEvent }, canvas.getCanvasWindow()); |
|
return null; |
|
} |
|
return this.defaultGetSlotMenuOptions(slot); |
|
} |
|
refreshComboInNode(defs) { |
|
rgthreeApi.getLoras(true); |
|
} |
|
hasLoraWidgets() { |
|
var _b; |
|
return !!((_b = this.widgets) === null || _b === void 0 ? void 0 : _b.find((w) => { var _b; return (_b = w.name) === null || _b === void 0 ? void 0 : _b.startsWith("lora_"); })); |
|
} |
|
allLorasState() { |
|
var _b, _c, _d; |
|
let allOn = true; |
|
let allOff = true; |
|
for (const widget of this.widgets) { |
|
if ((_b = widget.name) === null || _b === void 0 ? void 0 : _b.startsWith("lora_")) { |
|
const on = (_c = widget.value) === null || _c === void 0 ? void 0 : _c.on; |
|
allOn = allOn && on === true; |
|
allOff = allOff && on === false; |
|
if (!allOn && !allOff) { |
|
return null; |
|
} |
|
} |
|
} |
|
return allOn && ((_d = this.widgets) === null || _d === void 0 ? void 0 : _d.length) ? true : false; |
|
} |
|
toggleAllLoras() { |
|
var _b; |
|
const allOn = this.allLorasState(); |
|
const toggledTo = !allOn ? true : false; |
|
for (const widget of this.widgets) { |
|
if ((_b = widget.name) === null || _b === void 0 ? void 0 : _b.startsWith("lora_")) { |
|
widget.value.on = toggledTo; |
|
} |
|
} |
|
} |
|
static setUp(comfyClass, nodeData) { |
|
RgthreeBaseServerNode.registerForOverride(comfyClass, nodeData, NODE_CLASS); |
|
} |
|
static onRegisteredForOverride(comfyClass, ctxClass) { |
|
addConnectionLayoutSupport(NODE_CLASS, app, [ |
|
["Left", "Right"], |
|
["Right", "Left"], |
|
]); |
|
setTimeout(() => { |
|
NODE_CLASS.category = comfyClass.category; |
|
}); |
|
} |
|
getHelp() { |
|
return ` |
|
<p> |
|
The ${this.type.replace("(rgthree)", "")} is a powerful node that condenses 100s of pixels |
|
of functionality in a single, dynamic node that allows you to add loras, change strengths, |
|
and quickly toggle on/off all without taking up half your screen. |
|
</p> |
|
<ul> |
|
<li><p> |
|
Add as many Lora's as you would like by clicking the "+ Add Lora" button. |
|
There's no real limit! |
|
</p></li> |
|
<li><p> |
|
Right-click on a Lora widget for special options to move the lora up or down |
|
(no image affect, only presentational), toggle it on/off, or delete the row all together. |
|
</p></li> |
|
<li> |
|
<p> |
|
<strong>Properties.</strong> You can change the following properties (by right-clicking |
|
on the node, and select "Properties" or "Properties Panel" from the menu): |
|
</p> |
|
<ul> |
|
<li><p> |
|
<code>${PROP_LABEL_SHOW_STRENGTHS}</code> - Change between showing a single, simple |
|
strength (which will be used for both model and clip), or a more advanced view with |
|
both model and clip strengths being modifiable. |
|
</p></li> |
|
</ul> |
|
</li> |
|
</ul>`; |
|
} |
|
} |
|
_a = PROP_LABEL_SHOW_STRENGTHS_STATIC; |
|
RgthreePowerLoraLoader.title = NodeTypesString.POWER_LORA_LOADER; |
|
RgthreePowerLoraLoader.type = NodeTypesString.POWER_LORA_LOADER; |
|
RgthreePowerLoraLoader.comfyClass = NodeTypesString.POWER_LORA_LOADER; |
|
RgthreePowerLoraLoader[_a] = { |
|
type: "combo", |
|
values: [PROP_VALUE_SHOW_STRENGTHS_SINGLE, PROP_VALUE_SHOW_STRENGTHS_SEPARATE], |
|
}; |
|
class PowerLoraLoaderHeaderWidget extends RgthreeBaseWidget { |
|
constructor(name = "PowerLoraLoaderHeaderWidget") { |
|
super(name); |
|
this.showModelAndClip = null; |
|
this.value = { type: "PowerLoraLoaderHeaderWidget" }; |
|
this.hitAreas = { |
|
toggle: { bounds: [0, 0], onDown: this.onToggleDown }, |
|
}; |
|
} |
|
draw(ctx, node, w, posY, height) { |
|
if (!node.hasLoraWidgets()) { |
|
return; |
|
} |
|
this.showModelAndClip = |
|
node.properties[PROP_LABEL_SHOW_STRENGTHS] === PROP_VALUE_SHOW_STRENGTHS_SEPARATE; |
|
const margin = 10; |
|
const innerMargin = margin * 0.33; |
|
const lowQuality = isLowQuality(); |
|
const allLoraState = node.allLorasState(); |
|
posY += 2; |
|
const midY = posY + height * 0.5; |
|
let posX = 10; |
|
ctx.save(); |
|
this.hitAreas.toggle.bounds = drawTogglePart(ctx, { posX, posY, height, value: allLoraState }); |
|
if (!lowQuality) { |
|
posX += this.hitAreas.toggle.bounds[1] + innerMargin; |
|
ctx.globalAlpha = app.canvas.editor_alpha * 0.55; |
|
ctx.fillStyle = LiteGraph.WIDGET_TEXT_COLOR; |
|
ctx.textAlign = "left"; |
|
ctx.textBaseline = "middle"; |
|
ctx.fillText("Toggle All", posX, midY); |
|
let rposX = node.size[0] - margin - innerMargin - innerMargin; |
|
ctx.textAlign = "center"; |
|
ctx.fillText(this.showModelAndClip ? "Clip" : "Strength", rposX - drawNumberWidgetPart.WIDTH_TOTAL / 2, midY); |
|
if (this.showModelAndClip) { |
|
rposX = rposX - drawNumberWidgetPart.WIDTH_TOTAL - innerMargin * 2; |
|
ctx.fillText("Model", rposX - drawNumberWidgetPart.WIDTH_TOTAL / 2, midY); |
|
} |
|
} |
|
ctx.restore(); |
|
} |
|
onToggleDown(event, pos, node) { |
|
node.toggleAllLoras(); |
|
this.cancelMouseDown(); |
|
return true; |
|
} |
|
} |
|
const DEFAULT_LORA_WIDGET_DATA = { |
|
on: true, |
|
lora: null, |
|
strength: 1, |
|
strengthTwo: null, |
|
}; |
|
class PowerLoraLoaderWidget extends RgthreeBaseWidget { |
|
constructor(name) { |
|
super(name); |
|
this.haveMouseMovedStrength = false; |
|
this.loraInfoPromise = null; |
|
this.loraInfo = null; |
|
this.showModelAndClip = null; |
|
this.hitAreas = { |
|
toggle: { bounds: [0, 0], onDown: this.onToggleDown }, |
|
lora: { bounds: [0, 0], onDown: this.onLoraDown }, |
|
strengthDec: { bounds: [0, 0], onDown: this.onStrengthDecDown }, |
|
strengthVal: { bounds: [0, 0], onUp: this.onStrengthValUp }, |
|
strengthInc: { bounds: [0, 0], onDown: this.onStrengthIncDown }, |
|
strengthAny: { bounds: [0, 0], onMove: this.onStrengthAnyMove }, |
|
strengthTwoDec: { bounds: [0, 0], onDown: this.onStrengthTwoDecDown }, |
|
strengthTwoVal: { bounds: [0, 0], onUp: this.onStrengthTwoValUp }, |
|
strengthTwoInc: { bounds: [0, 0], onDown: this.onStrengthTwoIncDown }, |
|
strengthTwoAny: { bounds: [0, 0], onMove: this.onStrengthTwoAnyMove }, |
|
}; |
|
this._value = { |
|
on: true, |
|
lora: null, |
|
strength: 1, |
|
strengthTwo: null, |
|
}; |
|
} |
|
set value(v) { |
|
this._value = v; |
|
if (typeof this._value !== "object") { |
|
this._value = { ...DEFAULT_LORA_WIDGET_DATA }; |
|
if (this.showModelAndClip) { |
|
this._value.strengthTwo = this._value.strength; |
|
} |
|
} |
|
this.getLoraInfo(); |
|
} |
|
get value() { |
|
return this._value; |
|
} |
|
setLora(lora) { |
|
this._value.lora = lora; |
|
this.getLoraInfo(); |
|
} |
|
draw(ctx, node, w, posY, height) { |
|
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p; |
|
let currentShowModelAndClip = node.properties[PROP_LABEL_SHOW_STRENGTHS] === PROP_VALUE_SHOW_STRENGTHS_SEPARATE; |
|
if (this.showModelAndClip !== currentShowModelAndClip) { |
|
let oldShowModelAndClip = this.showModelAndClip; |
|
this.showModelAndClip = currentShowModelAndClip; |
|
if (this.showModelAndClip) { |
|
if (oldShowModelAndClip != null) { |
|
this.value.strengthTwo = (_b = this.value.strength) !== null && _b !== void 0 ? _b : 1; |
|
} |
|
} |
|
else { |
|
this.value.strengthTwo = null; |
|
this.hitAreas.strengthTwoDec.bounds = [0, -1]; |
|
this.hitAreas.strengthTwoVal.bounds = [0, -1]; |
|
this.hitAreas.strengthTwoInc.bounds = [0, -1]; |
|
this.hitAreas.strengthTwoAny.bounds = [0, -1]; |
|
} |
|
} |
|
ctx.save(); |
|
const margin = 10; |
|
const innerMargin = margin * 0.33; |
|
const lowQuality = isLowQuality(); |
|
const midY = posY + height * 0.5; |
|
let posX = margin; |
|
drawRoundedRectangle(ctx, { posX, posY, height, width: node.size[0] - margin * 2 }); |
|
this.hitAreas.toggle.bounds = drawTogglePart(ctx, { posX, posY, height, value: this.value.on }); |
|
posX += this.hitAreas.toggle.bounds[1] + innerMargin; |
|
if (lowQuality) { |
|
ctx.restore(); |
|
return; |
|
} |
|
if (!this.value.on) { |
|
ctx.globalAlpha = app.canvas.editor_alpha * 0.4; |
|
} |
|
ctx.fillStyle = LiteGraph.WIDGET_TEXT_COLOR; |
|
let rposX = node.size[0] - margin - innerMargin - innerMargin; |
|
const strengthValue = this.showModelAndClip |
|
? (_c = this.value.strengthTwo) !== null && _c !== void 0 ? _c : 1 |
|
: (_d = this.value.strength) !== null && _d !== void 0 ? _d : 1; |
|
let textColor = undefined; |
|
if (((_e = this.loraInfo) === null || _e === void 0 ? void 0 : _e.strengthMax) != null && strengthValue > ((_f = this.loraInfo) === null || _f === void 0 ? void 0 : _f.strengthMax)) { |
|
textColor = "#c66"; |
|
} |
|
else if (((_g = this.loraInfo) === null || _g === void 0 ? void 0 : _g.strengthMin) != null && strengthValue < ((_h = this.loraInfo) === null || _h === void 0 ? void 0 : _h.strengthMin)) { |
|
textColor = "#c66"; |
|
} |
|
const [leftArrow, text, rightArrow] = drawNumberWidgetPart(ctx, { |
|
posX: node.size[0] - margin - innerMargin - innerMargin, |
|
posY, |
|
height, |
|
value: strengthValue, |
|
direction: -1, |
|
textColor, |
|
}); |
|
this.hitAreas.strengthDec.bounds = leftArrow; |
|
this.hitAreas.strengthVal.bounds = text; |
|
this.hitAreas.strengthInc.bounds = rightArrow; |
|
this.hitAreas.strengthAny.bounds = [leftArrow[0], rightArrow[0] + rightArrow[1] - leftArrow[0]]; |
|
rposX = leftArrow[0] - innerMargin; |
|
if (this.showModelAndClip) { |
|
rposX -= innerMargin; |
|
this.hitAreas.strengthTwoDec.bounds = this.hitAreas.strengthDec.bounds; |
|
this.hitAreas.strengthTwoVal.bounds = this.hitAreas.strengthVal.bounds; |
|
this.hitAreas.strengthTwoInc.bounds = this.hitAreas.strengthInc.bounds; |
|
this.hitAreas.strengthTwoAny.bounds = this.hitAreas.strengthAny.bounds; |
|
let textColor = undefined; |
|
if (((_j = this.loraInfo) === null || _j === void 0 ? void 0 : _j.strengthMax) != null && this.value.strength > ((_k = this.loraInfo) === null || _k === void 0 ? void 0 : _k.strengthMax)) { |
|
textColor = "#c66"; |
|
} |
|
else if (((_l = this.loraInfo) === null || _l === void 0 ? void 0 : _l.strengthMin) != null && |
|
this.value.strength < ((_m = this.loraInfo) === null || _m === void 0 ? void 0 : _m.strengthMin)) { |
|
textColor = "#c66"; |
|
} |
|
const [leftArrow, text, rightArrow] = drawNumberWidgetPart(ctx, { |
|
posX: rposX, |
|
posY, |
|
height, |
|
value: (_o = this.value.strength) !== null && _o !== void 0 ? _o : 1, |
|
direction: -1, |
|
textColor, |
|
}); |
|
this.hitAreas.strengthDec.bounds = leftArrow; |
|
this.hitAreas.strengthVal.bounds = text; |
|
this.hitAreas.strengthInc.bounds = rightArrow; |
|
this.hitAreas.strengthAny.bounds = [ |
|
leftArrow[0], |
|
rightArrow[0] + rightArrow[1] - leftArrow[0], |
|
]; |
|
rposX = leftArrow[0] - innerMargin; |
|
} |
|
const infoIconSize = height * 0.66; |
|
const infoWidth = infoIconSize + innerMargin + innerMargin; |
|
if (this.hitAreas["info"]) { |
|
rposX -= innerMargin; |
|
drawInfoIcon(ctx, rposX - infoIconSize, posY + (height - infoIconSize) / 2, infoIconSize); |
|
this.hitAreas.info.bounds = [rposX - infoIconSize, infoWidth]; |
|
rposX = rposX - infoIconSize - innerMargin; |
|
} |
|
const loraWidth = rposX - posX; |
|
ctx.textAlign = "left"; |
|
ctx.textBaseline = "middle"; |
|
const loraLabel = String(((_p = this.value) === null || _p === void 0 ? void 0 : _p.lora) || "None"); |
|
ctx.fillText(fitString(ctx, loraLabel, loraWidth), posX, midY); |
|
this.hitAreas.lora.bounds = [posX, loraWidth]; |
|
posX += loraWidth + innerMargin; |
|
ctx.globalAlpha = app.canvas.editor_alpha; |
|
ctx.restore(); |
|
} |
|
serializeValue(serializedNode, widgetIndex) { |
|
var _b; |
|
const v = { ...this.value }; |
|
if (!this.showModelAndClip) { |
|
delete v.strengthTwo; |
|
} |
|
else { |
|
this.value.strengthTwo = (_b = this.value.strengthTwo) !== null && _b !== void 0 ? _b : 1; |
|
v.strengthTwo = this.value.strengthTwo; |
|
} |
|
return v; |
|
} |
|
onToggleDown(event, pos, node) { |
|
this.value.on = !this.value.on; |
|
this.cancelMouseDown(); |
|
return true; |
|
} |
|
onInfoDown(event, pos, node) { |
|
this.showLoraInfoDialog(); |
|
} |
|
onLoraDown(event, pos, node) { |
|
showLoraChooser(event, (value) => { |
|
if (typeof value === "string") { |
|
this.value.lora = value; |
|
this.loraInfo = null; |
|
this.getLoraInfo(); |
|
} |
|
node.setDirtyCanvas(true, true); |
|
}); |
|
this.cancelMouseDown(); |
|
} |
|
onStrengthDecDown(event, pos, node) { |
|
this.stepStrength(-1, false); |
|
} |
|
onStrengthIncDown(event, pos, node) { |
|
this.stepStrength(1, false); |
|
} |
|
onStrengthTwoDecDown(event, pos, node) { |
|
this.stepStrength(-1, true); |
|
} |
|
onStrengthTwoIncDown(event, pos, node) { |
|
this.stepStrength(1, true); |
|
} |
|
onStrengthAnyMove(event, pos, node) { |
|
this.doOnStrengthAnyMove(event, false); |
|
} |
|
onStrengthTwoAnyMove(event, pos, node) { |
|
this.doOnStrengthAnyMove(event, true); |
|
} |
|
doOnStrengthAnyMove(event, isTwo = false) { |
|
var _b; |
|
if (event.deltaX) { |
|
let prop = isTwo ? "strengthTwo" : "strength"; |
|
this.haveMouseMovedStrength = true; |
|
this.value[prop] = ((_b = this.value[prop]) !== null && _b !== void 0 ? _b : 1) + event.deltaX * 0.05; |
|
} |
|
} |
|
onStrengthValUp(event, pos, node) { |
|
this.doOnStrengthValUp(event, false); |
|
} |
|
onStrengthTwoValUp(event, pos, node) { |
|
this.doOnStrengthValUp(event, true); |
|
} |
|
doOnStrengthValUp(event, isTwo = false) { |
|
if (this.haveMouseMovedStrength) |
|
return; |
|
let prop = isTwo ? "strengthTwo" : "strength"; |
|
const canvas = app.canvas; |
|
canvas.prompt("Value", this.value[prop], (v) => (this.value[prop] = Number(v)), event); |
|
} |
|
onMouseUp(event, pos, node) { |
|
super.onMouseUp(event, pos, node); |
|
this.haveMouseMovedStrength = false; |
|
} |
|
showLoraInfoDialog() { |
|
if (!this.value.lora || this.value.lora === "None") { |
|
return; |
|
} |
|
const infoDialog = new RgthreeLoraInfoDialog(this.value.lora).show(); |
|
infoDialog.addEventListener("close", ((e) => { |
|
if (e.detail.dirty) { |
|
this.getLoraInfo(true); |
|
} |
|
})); |
|
} |
|
stepStrength(direction, isTwo = false) { |
|
var _b; |
|
let step = 0.05; |
|
let prop = isTwo ? "strengthTwo" : "strength"; |
|
let strength = ((_b = this.value[prop]) !== null && _b !== void 0 ? _b : 1) + step * direction; |
|
this.value[prop] = Math.round(strength * 100) / 100; |
|
} |
|
getLoraInfo(force = false) { |
|
if (!this.loraInfoPromise || force == true) { |
|
let promise; |
|
if (this.value.lora && this.value.lora != "None") { |
|
promise = LORA_INFO_SERVICE.getInfo(this.value.lora, force, true); |
|
} |
|
else { |
|
promise = Promise.resolve(null); |
|
} |
|
this.loraInfoPromise = promise.then((v) => (this.loraInfo = v)); |
|
} |
|
return this.loraInfoPromise; |
|
} |
|
} |
|
const NODE_CLASS = RgthreePowerLoraLoader; |
|
app.registerExtension({ |
|
name: "rgthree.PowerLoraLoader", |
|
async beforeRegisterNodeDef(nodeType, nodeData) { |
|
if (nodeData.name === NODE_CLASS.type) { |
|
NODE_CLASS.setUp(nodeType, nodeData); |
|
} |
|
}, |
|
}); |
|
|