Heal runaway height after workspace changes

This commit is contained in:
NineKey
2026-09-13 00:07:29 +08:00
parent 08bf5e9caf
commit dfa4e4a464
2 changed files with 30 additions and 8 deletions
+15
View File
@@ -727,9 +727,24 @@ app.registerExtension({
const originalOnRemoved = node.onRemoved;
const originalWidgetOnRemove = composerWidget.onRemove;
let composerDisposed = false;
const healComposerHeight = () => {
if (!composerDisposed) node._healRunawayHeight?.();
};
const composerResizeObserver = new ResizeObserver(healComposerHeight);
composerResizeObserver.observe(composerHost);
const originalOnSelected = node.onSelected;
node.onSelected = function() {
const result = originalOnSelected?.apply(this, arguments);
requestAnimationFrame(healComposerHeight);
return result;
};
requestAnimationFrame(healComposerHeight);
setTimeout(healComposerHeight, 0);
setTimeout(healComposerHeight, 250);
const disposeComposer = () => {
if (composerDisposed) return;
composerDisposed = true;
composerResizeObserver.disconnect();
closeMenu();
menu.remove();
document.removeEventListener("pointerdown", closeMenuOutside, true);
+15 -8
View File
@@ -64,6 +64,18 @@ export function setupSizeManager(node) {
const initialMinHeight = node.computeSize?.()[1] || 0;
node._userMinHeight = 0;
node._isResizing = false;
const isRunawayHeight = height => height > MAX_RESTORED_HEIGHT
&& height > initialMinHeight + MAX_RESTORED_EXTRA_HEIGHT;
node._healRunawayHeight = function() {
const height = node.size?.[1] || 0;
if (node._isResizing || !isRunawayHeight(height)) return false;
node._isResizing = true;
node._userMinHeight = 0;
node.setSize([node.size[0], initialMinHeight]);
node._isResizing = false;
node.setDirtyCanvas(true, true);
return true;
};
// 1. 攔截讀取工作流配置
const originalOnConfigure = node.onConfigure;
@@ -71,14 +83,8 @@ export function setupSizeManager(node) {
if (originalOnConfigure) originalOnConfigure.apply(this, arguments);
if (data && data.size) {
const restoredHeight = data.size[1];
const runawayHeight = restoredHeight > MAX_RESTORED_HEIGHT
&& restoredHeight > initialMinHeight + MAX_RESTORED_EXTRA_HEIGHT;
node._userMinHeight = runawayHeight ? 0 : restoredHeight;
if (runawayHeight) {
node._isResizing = true;
node.setSize([node.size[0], initialMinHeight]);
node._isResizing = false;
}
node._userMinHeight = restoredHeight;
node._healRunawayHeight();
}
};
@@ -88,6 +94,7 @@ export function setupSizeManager(node) {
if (originalOnResize) originalOnResize.apply(this, arguments);
if (!node._isResizing) {
node._userMinHeight = size[1];
node._healRunawayHeight();
}
};