mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-25 15:15:44 -03:00
docs(dom_widget_dev_guide): clarify dynamic resizing and add performance note
- Add performance note explaining that providing `getMinHeight` and `getHeight` via `options` avoids expensive DOM measurements - Expand dynamic resizing section with detailed update sequence and common scenarios table - Update LoraPoolSummaryView.vue with `min-height: 0` to allow flex shrinking - Update main.ts to provide `getMinHeight` via options and adjust `computeLayoutSize` for performance
This commit is contained in:
@@ -93,6 +93,8 @@ Whether in Canvas Mode or Vue Mode, the underlying logic model (`LGraphNode`) ca
|
|||||||
|
|
||||||
It is recommended to use the `options` parameter to define height behavior.
|
It is recommended to use the `options` parameter to define height behavior.
|
||||||
|
|
||||||
|
**Performance Note:** providing `getMinHeight` and `getHeight` via `options` allows the system to skip expensive DOM measurements (`getComputedStyle`) during rendering loop. This significantly improves performance and prevents FPS drops during node resizing.
|
||||||
|
|
||||||
**Method 1: Using `options` (Recommended)**
|
**Method 1: Using `options` (Recommended)**
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@@ -134,14 +136,32 @@ widget.computeLayoutSize = (targetNode) => {
|
|||||||
|
|
||||||
### 4.4 Dynamic Resizing
|
### 4.4 Dynamic Resizing
|
||||||
|
|
||||||
If your widget's content changes dynamically (e.g., expanding sections, loading images), you must manually trigger a node resize:
|
If your widget's content changes dynamically (e.g., expanding sections, loading images, or CSS changes), the DOM element will resize, but the Canvas-rendered Node background and Slots will not automatically follow. You must manually trigger a synchronization.
|
||||||
|
|
||||||
|
**The Update Sequence:**
|
||||||
|
Whenever the **actual rendering height** of your DOM element changes, execute the following "three-step combo":
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// Execute after internal size changes:
|
// 1. Calculate the new optimal size for the node based on current widget requirements
|
||||||
node.setSize(node.computeSize());
|
const newSize = node.computeSize();
|
||||||
node.setDirtyCanvas(true, true); // Force redraw
|
|
||||||
|
// 2. Apply the new size to the node model (updates bounding box and slot positions)
|
||||||
|
node.setSize(newSize);
|
||||||
|
|
||||||
|
// 3. Mark the canvas as dirty to trigger a redraw in the next animation frame
|
||||||
|
node.setDirtyCanvas(true, true);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Common Scenarios:**
|
||||||
|
|
||||||
|
| Scenario | Actual Height Change? | Update Required? |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| **Expand/Collapse content** | **Yes** | ✅ **Yes**. Prevents widget from overflowing node boundaries. |
|
||||||
|
| **Image/Video finished loading** | **Yes** | ✅ **Yes**. Initial height might be 0 until the media loads. |
|
||||||
|
| **Changing `minHeight`** | **Maybe** | ❓ **Only if** the change causes the element's actual height to shift. |
|
||||||
|
| **Changing font size/styles** | **Yes** | ✅ **Yes**. Text reflow often changes the total height. |
|
||||||
|
| **User dragging node corner** | **Yes** | ❌ **No**. LiteGraph handles this internally. |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. State Persistence (Serialization)
|
## 5. State Persistence (Serialization)
|
||||||
|
|||||||
@@ -127,5 +127,7 @@ defineEmits<{
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding-right: 4px;
|
padding-right: 4px;
|
||||||
margin-right: -4px;
|
margin-right: -4px;
|
||||||
|
/* Allow flex item to shrink below content size */
|
||||||
|
min-height: 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -34,7 +34,12 @@ function createLoraPoolWidget(node) {
|
|||||||
widget.onSetValue(v)
|
widget.onSetValue(v)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
serialize: true
|
serialize: true,
|
||||||
|
// Per dev guide: providing getMinHeight via options allows the system to
|
||||||
|
// skip expensive DOM measurements during rendering loop, improving performance
|
||||||
|
getMinHeight() {
|
||||||
|
return 700
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -55,6 +60,13 @@ function createLoraPoolWidget(node) {
|
|||||||
vueApp.mount(container)
|
vueApp.mount(container)
|
||||||
vueApps.set(node.id, vueApp)
|
vueApps.set(node.id, vueApp)
|
||||||
|
|
||||||
|
widget.computeLayoutSize = () => {
|
||||||
|
const minWidth = 500
|
||||||
|
const minHeight = 700
|
||||||
|
|
||||||
|
return { minHeight, minWidth }
|
||||||
|
}
|
||||||
|
|
||||||
widget.onRemove = () => {
|
widget.onRemove = () => {
|
||||||
const vueApp = vueApps.get(node.id)
|
const vueApp = vueApps.get(node.id)
|
||||||
if (vueApp) {
|
if (vueApp) {
|
||||||
@@ -63,11 +75,6 @@ function createLoraPoolWidget(node) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
widget.computeLayoutSize = () => ({
|
|
||||||
minHeight: 600,
|
|
||||||
minWidth: 500
|
|
||||||
})
|
|
||||||
|
|
||||||
return { widget }
|
return { widget }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user