dsh-comfyui-rp 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/docs/CHANGELOG.md +12 -0
- package/lib/client.js +261 -11
- package/lib/meta.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,6 +56,8 @@ dsh plugin --profile web add git+https://github.com/bmhty123/dsh-comfyui-rp.git
|
|
|
56
56
|
- **临时手动出一张**:悬浮球 → 铅笔菜单 →「请求生成」,读来源会话的最新正文。
|
|
57
57
|
- **只重做一张**:图片框 → 重新生成 →「仅此图」;整套重来选「全部」。
|
|
58
58
|
- **找图**:图库 → 当前会话 / 全部 / 收藏夹 / 回收站。
|
|
59
|
+
- **一键找菜单**:在图片上单击一下,四角按钮和铅笔菜单一起亮出来,5 秒没操作自动收回;再点铅笔就能收起。
|
|
60
|
+
- **调图片框大小**:鼠标滚轮,或触屏双指捏合(以两指中点为中心放大缩小)。
|
|
59
61
|
- **会话没更新**:概览右上「检测」,或设置里会话旁的「刷新」。
|
|
60
62
|
- **清理跟图定位**:图片框 → 更多 →「清空定位」,只清当前会话,之后按比例重新分配。
|
|
61
63
|
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# 更新记录
|
|
2
2
|
|
|
3
|
+
## 0.2.6
|
|
4
|
+
|
|
5
|
+
- **单击图片框亮出所有菜单**:在图片上单击一下,四角按钮(固定左侧 / 悬浮左侧 / 右侧栏看图 / 收起)和左下角铅笔展开的那排菜单会一起出现,不用先把鼠标挪到角上。
|
|
6
|
+
- 亮起来之后,框里只要还有操作(移动、点击、滚轮、捏合、点菜单)就一直续着;**5 秒没有操作自动收回**,回到原来的「鼠标靠近角落才出现」。
|
|
7
|
+
- 手动再点一下铅笔把菜单关掉会立刻收回,不用等 5 秒。
|
|
8
|
+
- 双击收起图片框不会先闪一层菜单(第二下点击会撤掉待亮的菜单)。
|
|
9
|
+
- **支持双指捏合缩放**:触屏 / 触控板上两指捏合可以放大缩小图片框(之前只认滚轮)。
|
|
10
|
+
- 以两指中点为中心缩放,捏合时两指一起移动就跟着平移。
|
|
11
|
+
- 缩放范围和滚轮完全一致(不会小于 280×360,也不会超出视口);停靠在左侧时捏合调的是停靠宽度。
|
|
12
|
+
- 两根手指都在图片框里才接管,框外双指缩放还是缩放页面。
|
|
13
|
+
- 捏合期间不会误拖动图片框,捏合结束才写本地存储。
|
|
14
|
+
|
|
3
15
|
## 0.2.5
|
|
4
16
|
|
|
5
17
|
- **修「只收到时间戳、正文没跟着来」**:自动投递前先等目标会话空闲(最多 15 秒)。有些宿主(例如带自动续写的 Tavern)会让会话一直有事在跑,这时 `queue` 投递的正文会被排到下一轮,而当前这一轮模型只看到时间上下文注入的那三行。
|
package/lib/client.js
CHANGED
|
@@ -221,6 +221,71 @@ window.__ModuleLoader__.load({
|
|
|
221
221
|
|
|
222
222
|
function clamp(v, lo, hi) { return Math.max(lo, Math.min(hi, Number(v) || 0)); }
|
|
223
223
|
|
|
224
|
+
/**
|
|
225
|
+
* 双指捏合用的框尺寸算法(纯函数,便于离线测试)。
|
|
226
|
+
* p: { x, y, w, h, anchorX, anchorY } —— 捏合开始时框的视口坐标 + 要钉住的点;
|
|
227
|
+
* factor: 两指当前距离 / 起始距离;midX/midY: 两指当前中点。
|
|
228
|
+
* 返回新的 { x, y, w, h, factor }:尺寸按比例缩放后被夹在「不小于 280×360(或视口更小)
|
|
229
|
+
* 不大于视口」之间,并保证 anchor 在框内的相对位置始终落在 mid 上。
|
|
230
|
+
*/
|
|
231
|
+
function scaleFrameAround(p, factor, midX, midY, vw, vh) {
|
|
232
|
+
var baseW = Math.max(1, Number(p && p.w) || 1);
|
|
233
|
+
var baseH = Math.max(1, Number(p && p.h) || 1);
|
|
234
|
+
var maxW = Math.max(1, Number(vw) || 1);
|
|
235
|
+
var maxH = Math.max(1, Number(vh) || 1);
|
|
236
|
+
var minW = Math.min(280, maxW);
|
|
237
|
+
var minH = Math.min(360, maxH);
|
|
238
|
+
var maxF = Math.min(maxW / baseW, maxH / baseH);
|
|
239
|
+
var minF = Math.min(maxF, Math.max(minW / baseW, minH / baseH));
|
|
240
|
+
var lo = Math.min(minF, maxF);
|
|
241
|
+
var hi = Math.max(minF, maxF);
|
|
242
|
+
var f = Number(factor) || 1;
|
|
243
|
+
if (f < lo) f = lo;
|
|
244
|
+
if (f > hi) f = hi;
|
|
245
|
+
var nw = Math.max(1, baseW * f);
|
|
246
|
+
var nh = Math.max(1, baseH * f);
|
|
247
|
+
var rx = Math.max(0, Math.min(1, ((Number(p && p.anchorX) || 0) - (Number(p && p.x) || 0)) / baseW));
|
|
248
|
+
var ry = Math.max(0, Math.min(1, ((Number(p && p.anchorY) || 0) - (Number(p && p.y) || 0)) / baseH));
|
|
249
|
+
var nx = (Number(midX) || 0) - rx * nw;
|
|
250
|
+
var ny = (Number(midY) || 0) - ry * nh;
|
|
251
|
+
return {
|
|
252
|
+
factor: f,
|
|
253
|
+
w: nw,
|
|
254
|
+
h: nh,
|
|
255
|
+
x: Math.max(0, Math.min(Math.max(0, maxW - nw), nx)),
|
|
256
|
+
y: Math.max(0, Math.min(Math.max(0, maxH - nh), ny)),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* 双指捏合的一步(纯函数,便于离线测试)。
|
|
262
|
+
* p 是捏合起点快照:{ dist, midX, midY, w, h, x, y, docked, dockW, dockMax }
|
|
263
|
+
* a / b 是当前两指的 { clientX, clientY };dockMin 是停靠最小宽度。
|
|
264
|
+
* 返回 null(这一步不用动)、{ docked: true, dockW } 或 { docked: false, x, y, w, h, factor }。
|
|
265
|
+
*/
|
|
266
|
+
function pinchFrameStep(p, a, b, vw, vh, dockMin) {
|
|
267
|
+
if (!p || !p.active || !a || !b) return null;
|
|
268
|
+
var dx = a.clientX - b.clientX;
|
|
269
|
+
var dy = a.clientY - b.clientY;
|
|
270
|
+
var d = Math.sqrt(dx * dx + dy * dy);
|
|
271
|
+
if (!(d > 1)) return null;
|
|
272
|
+
var factor = d / Math.max(1, Number(p.dist) || 1);
|
|
273
|
+
if (!isFinite(factor) || factor <= 0) return null;
|
|
274
|
+
if (p.docked) {
|
|
275
|
+
// 停靠时宽度就是框宽,捏合和滚轮一样调停靠宽度。
|
|
276
|
+
var lo = Math.max(1, Number(dockMin) || 1);
|
|
277
|
+
var hi = Math.max(lo, Number(p.dockMax) || 0);
|
|
278
|
+
return {
|
|
279
|
+
docked: true,
|
|
280
|
+
dockW: Math.max(lo, Math.min(hi, Math.round((Number(p.dockW) || 0) * factor))),
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
var sc = scaleFrameAround({
|
|
284
|
+
x: p.x, y: p.y, w: p.w, h: p.h, anchorX: p.midX, anchorY: p.midY,
|
|
285
|
+
}, factor, (a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2, vw, vh);
|
|
286
|
+
return { docked: false, x: sc.x, y: sc.y, w: sc.w, h: sc.h, factor: sc.factor };
|
|
287
|
+
}
|
|
288
|
+
|
|
224
289
|
/**
|
|
225
290
|
* 自动补图的全局状态:逻辑在 FloatBall 里跑(它一直在,负责检测纯黑图),
|
|
226
291
|
* 但「停止」按钮要能出现在右侧栏面板里,所以两边共享这一份。
|
|
@@ -1375,6 +1440,8 @@ window.__ModuleLoader__.load({
|
|
|
1375
1440
|
var [followOn, setFollowOn] = useState(function () { return prefs.follow !== false; });
|
|
1376
1441
|
var [pointerFollow, setPointerFollow] = useState(function () { return prefs.pointerFollow === true; });
|
|
1377
1442
|
var [dragging, setDragging] = useState(false);
|
|
1443
|
+
// 单击图片框临时亮起所有菜单(四角按钮 + 铅笔菜单),到点自动收回。
|
|
1444
|
+
var [peek, setPeek] = useState(false);
|
|
1378
1445
|
var [menuClipped, setMenuClipped] = useState(false);
|
|
1379
1446
|
var [subPos, setSubPos] = useState(null);
|
|
1380
1447
|
var [recycleBusy, setRecycleBusy] = useState(false);
|
|
@@ -1383,6 +1450,13 @@ window.__ModuleLoader__.load({
|
|
|
1383
1450
|
var blRef = useRef(null);
|
|
1384
1451
|
var menuRef = useRef(null);
|
|
1385
1452
|
var moreRef = useRef(null);
|
|
1453
|
+
// 单击亮菜单的计时器 / 是否处于亮菜单状态 / 这次按下是不是落在菜单按钮上。
|
|
1454
|
+
var peekRef = useRef(false);
|
|
1455
|
+
var peekTimer = useRef(null);
|
|
1456
|
+
var peekDelay = useRef(null);
|
|
1457
|
+
var uiDownRef = useRef(false);
|
|
1458
|
+
// 双指捏合:开始时的两指距离、中点、框尺寸都记下来,移动时按比例算绝对值,避免累积误差。
|
|
1459
|
+
var pinchRef = useRef({ active: false });
|
|
1386
1460
|
var wheelTimer = useRef(null);
|
|
1387
1461
|
var dockDrag = useRef(null);
|
|
1388
1462
|
var reserveDrag = useRef(null);
|
|
@@ -1540,6 +1614,47 @@ window.__ModuleLoader__.load({
|
|
|
1540
1614
|
var persistPrefs = function () {
|
|
1541
1615
|
setPrefs(function (old) { saveFloatPrefs(old); return old; });
|
|
1542
1616
|
};
|
|
1617
|
+
|
|
1618
|
+
/* ---------------------------------------------------------------
|
|
1619
|
+
* 单击图片框:把四角按钮和铅笔菜单一起亮出来,5 秒内框里没操作就收回。
|
|
1620
|
+
* 全部走 peekRef + 定时器,不依赖重渲染时序,所以连续点 / 拖 / 滚轮都不会串。
|
|
1621
|
+
* ------------------------------------------------------------- */
|
|
1622
|
+
var PEEK_MS = 5000;
|
|
1623
|
+
// 亮菜单稍微等一下:双击收框时不会被第一下点击先闪出一层菜单。
|
|
1624
|
+
var PEEK_DELAY_MS = 240;
|
|
1625
|
+
var clearPeekTimer = function () {
|
|
1626
|
+
if (peekTimer.current) { clearTimeout(peekTimer.current); peekTimer.current = null; }
|
|
1627
|
+
if (peekDelay.current) { clearTimeout(peekDelay.current); peekDelay.current = null; }
|
|
1628
|
+
};
|
|
1629
|
+
var endPeek = function () {
|
|
1630
|
+
clearPeekTimer();
|
|
1631
|
+
if (!peekRef.current) return;
|
|
1632
|
+
peekRef.current = false;
|
|
1633
|
+
setPeek(false);
|
|
1634
|
+
setMenuOpen(false);
|
|
1635
|
+
setSubOpen(false);
|
|
1636
|
+
setRegenOpen(false);
|
|
1637
|
+
};
|
|
1638
|
+
var bumpPeek = function () {
|
|
1639
|
+
if (!peekRef.current) return;
|
|
1640
|
+
clearPeekTimer();
|
|
1641
|
+
peekTimer.current = setTimeout(endPeek, PEEK_MS);
|
|
1642
|
+
};
|
|
1643
|
+
var startPeek = function () {
|
|
1644
|
+
if (peekRef.current) { bumpPeek(); return; }
|
|
1645
|
+
// 已经有一次点击在等:这是双击收框的前半截,直接撤掉,别让菜单闪一下。
|
|
1646
|
+
if (peekDelay.current) { clearPeekTimer(); return; }
|
|
1647
|
+
clearPeekTimer();
|
|
1648
|
+
peekDelay.current = setTimeout(function () {
|
|
1649
|
+
peekDelay.current = null;
|
|
1650
|
+
peekRef.current = true;
|
|
1651
|
+
setPeek(true);
|
|
1652
|
+
setMenuOpen(true);
|
|
1653
|
+
setSubOpen(false);
|
|
1654
|
+
setRegenOpen(false);
|
|
1655
|
+
bumpPeek();
|
|
1656
|
+
}, PEEK_DELAY_MS);
|
|
1657
|
+
};
|
|
1543
1658
|
var showToast = function (text, tone) {
|
|
1544
1659
|
var id = (toastSeq.current += 1);
|
|
1545
1660
|
setToasts(function (old) {
|
|
@@ -3187,6 +3302,7 @@ window.__ModuleLoader__.load({
|
|
|
3187
3302
|
if (ev.clientX < r.left || ev.clientX > r.right || ev.clientY < r.top || ev.clientY > r.bottom) return;
|
|
3188
3303
|
var overDockGrip = !!(ev.target && ev.target.closest && ev.target.closest(".ac-dockgrip"));
|
|
3189
3304
|
if (!overDockGrip && ev.target && ev.target.closest && ev.target.closest("[data-ui]")) return;
|
|
3305
|
+
bumpPeek();
|
|
3190
3306
|
ev.preventDefault();
|
|
3191
3307
|
var ds = dockStateRef.current;
|
|
3192
3308
|
if (ds.docked) {
|
|
@@ -3250,6 +3366,115 @@ window.__ModuleLoader__.load({
|
|
|
3250
3366
|
};
|
|
3251
3367
|
}, []);
|
|
3252
3368
|
|
|
3369
|
+
// 双指捏合缩放:和滚轮走同一条改框尺寸的路径,只是锚点换成两指中点,
|
|
3370
|
+
// 顺带支持捏合时两指一起平移。挂在 window 上(和滚轮一致),
|
|
3371
|
+
// 切会话 / 重挂图片框都不会丢监听。
|
|
3372
|
+
useEffect(function () {
|
|
3373
|
+
if (typeof window === "undefined" || typeof window.addEventListener !== "function") return undefined;
|
|
3374
|
+
var dist2 = function (a, b) {
|
|
3375
|
+
var dx = a.clientX - b.clientX;
|
|
3376
|
+
var dy = a.clientY - b.clientY;
|
|
3377
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
3378
|
+
};
|
|
3379
|
+
var mid2 = function (a, b) {
|
|
3380
|
+
return { x: (a.clientX + b.clientX) / 2, y: (a.clientY + b.clientY) / 2 };
|
|
3381
|
+
};
|
|
3382
|
+
var onTouchStart = function (ev) {
|
|
3383
|
+
if (!openRef.current || hiddenRef.current) return;
|
|
3384
|
+
// 单指还是原来的拖动;只有两根手指落在框里才当成捏合。
|
|
3385
|
+
if (!ev.touches || ev.touches.length !== 2) return;
|
|
3386
|
+
var el = frameRef.current;
|
|
3387
|
+
if (!el || !el.getBoundingClientRect) return;
|
|
3388
|
+
var r = el.getBoundingClientRect();
|
|
3389
|
+
if (!r.width || !r.height) return;
|
|
3390
|
+
var a = ev.touches[0];
|
|
3391
|
+
var b = ev.touches[1];
|
|
3392
|
+
var inside = function (p) {
|
|
3393
|
+
return p.clientX >= r.left && p.clientX <= r.right
|
|
3394
|
+
&& p.clientY >= r.top && p.clientY <= r.bottom;
|
|
3395
|
+
};
|
|
3396
|
+
// 两指都在框里才接管;在框外双指缩放还能正常缩页面。
|
|
3397
|
+
if (!inside(a) || !inside(b)) return;
|
|
3398
|
+
if (ev.target && ev.target.closest && ev.target.closest("[data-ui]")) return;
|
|
3399
|
+
var d = dist2(a, b);
|
|
3400
|
+
if (!(d > 8)) return;
|
|
3401
|
+
// 捏合一开始就掐掉单指拖动,别让框跟着其中一根手指跑。
|
|
3402
|
+
if (dragRaf.current) { caf(dragRaf.current); dragRaf.current = 0; }
|
|
3403
|
+
dragPending.current = null;
|
|
3404
|
+
dragRef.current = null;
|
|
3405
|
+
setDragging(false);
|
|
3406
|
+
var ds = dockStateRef.current;
|
|
3407
|
+
var dr = ds.dockRect;
|
|
3408
|
+
var dm = dr ? Math.max(DOCK_MIN, Math.min(920, dr.width - DOCK_MIN_CHAT - DOCK_GAP)) : DOCK_MIN;
|
|
3409
|
+
var mid = mid2(a, b);
|
|
3410
|
+
pinchRef.current = {
|
|
3411
|
+
active: true,
|
|
3412
|
+
dist: d,
|
|
3413
|
+
midX: mid.x,
|
|
3414
|
+
midY: mid.y,
|
|
3415
|
+
w: r.width,
|
|
3416
|
+
h: r.height,
|
|
3417
|
+
x: r.left,
|
|
3418
|
+
y: r.top,
|
|
3419
|
+
docked: !!ds.docked,
|
|
3420
|
+
dockW: Number(ds.dockW) || 0,
|
|
3421
|
+
dockMax: dm,
|
|
3422
|
+
};
|
|
3423
|
+
bumpPeek();
|
|
3424
|
+
};
|
|
3425
|
+
var onTouchMove = function (ev) {
|
|
3426
|
+
var p = pinchRef.current;
|
|
3427
|
+
if (!p || !p.active) return;
|
|
3428
|
+
if (!ev.touches || ev.touches.length !== 2) return;
|
|
3429
|
+
var a = ev.touches[0];
|
|
3430
|
+
var b = ev.touches[1];
|
|
3431
|
+
var s = vp();
|
|
3432
|
+
var step = pinchFrameStep(p, a, b, s.w, s.h, DOCK_MIN);
|
|
3433
|
+
if (!step) return;
|
|
3434
|
+
// 双指手势到这一步还没被浏览器拿走,说明它归我们,先掐掉页面缩放 / 滚动。
|
|
3435
|
+
ev.preventDefault();
|
|
3436
|
+
if (step.docked) {
|
|
3437
|
+
if (step.dockW !== dockStateRef.current.dockW) setFrame({ dockW: step.dockW }, false);
|
|
3438
|
+
} else {
|
|
3439
|
+
if (Math.abs(step.factor - 1) < 0.002) return;
|
|
3440
|
+
setFrame({
|
|
3441
|
+
x: step.x,
|
|
3442
|
+
y: step.y,
|
|
3443
|
+
w: step.w, h: step.h,
|
|
3444
|
+
// 和滚轮一致:空白框也记住这个大小,用户自己定过尺寸后切图不再回退。
|
|
3445
|
+
emptyW: step.w,
|
|
3446
|
+
emptyH: step.h,
|
|
3447
|
+
userSized: true,
|
|
3448
|
+
}, false);
|
|
3449
|
+
}
|
|
3450
|
+
bumpPeek();
|
|
3451
|
+
};
|
|
3452
|
+
var onTouchEnd = function (ev) {
|
|
3453
|
+
var p = pinchRef.current;
|
|
3454
|
+
if (!p || !p.active) return;
|
|
3455
|
+
if (ev.touches && ev.touches.length >= 2) return;
|
|
3456
|
+
pinchRef.current = { active: false };
|
|
3457
|
+
// 捏合收尾后浏览器常补一个 click,别让它再触发「单击亮菜单」。
|
|
3458
|
+
suppressClick.current = Date.now();
|
|
3459
|
+
persistPrefs();
|
|
3460
|
+
};
|
|
3461
|
+
try {
|
|
3462
|
+
window.addEventListener("touchstart", onTouchStart, { passive: false });
|
|
3463
|
+
window.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
3464
|
+
window.addEventListener("touchend", onTouchEnd, { passive: false });
|
|
3465
|
+
window.addEventListener("touchcancel", onTouchEnd, { passive: false });
|
|
3466
|
+
} catch (e) { /* 老浏览器不支持 passive 选项就退化成默认 */ }
|
|
3467
|
+
return function () {
|
|
3468
|
+
pinchRef.current = { active: false };
|
|
3469
|
+
try {
|
|
3470
|
+
window.removeEventListener("touchstart", onTouchStart);
|
|
3471
|
+
window.removeEventListener("touchmove", onTouchMove);
|
|
3472
|
+
window.removeEventListener("touchend", onTouchEnd);
|
|
3473
|
+
window.removeEventListener("touchcancel", onTouchEnd);
|
|
3474
|
+
} catch (e) { /* ignore */ }
|
|
3475
|
+
};
|
|
3476
|
+
}, []);
|
|
3477
|
+
|
|
3253
3478
|
useEffect(function () {
|
|
3254
3479
|
if (!menuOpen) { setMenuClipped(false); return undefined; }
|
|
3255
3480
|
var el = menuRef.current;
|
|
@@ -3298,6 +3523,7 @@ window.__ModuleLoader__.load({
|
|
|
3298
3523
|
var ny = clamp(by + BALL_HALF - fh + COLLAPSE, 0, Math.max(0, s.h - fh));
|
|
3299
3524
|
setFrame({ x: nx, y: ny, w: fw, h: fh }, true);
|
|
3300
3525
|
setPref({ open: true });
|
|
3526
|
+
endPeek();
|
|
3301
3527
|
setMenuOpen(false);
|
|
3302
3528
|
setSubOpen(false);
|
|
3303
3529
|
setNearAny(false);
|
|
@@ -3320,6 +3546,7 @@ window.__ModuleLoader__.load({
|
|
|
3320
3546
|
}, true);
|
|
3321
3547
|
setPref({ open: false, dock: "", reserve: "" });
|
|
3322
3548
|
if (reserved) restoreReserveFrame();
|
|
3549
|
+
endPeek();
|
|
3323
3550
|
setMenuOpen(false);
|
|
3324
3551
|
setSubOpen(false);
|
|
3325
3552
|
setNearAny(false);
|
|
@@ -3339,7 +3566,17 @@ window.__ModuleLoader__.load({
|
|
|
3339
3566
|
var onFrameDown = function (e) {
|
|
3340
3567
|
if (dockTimer.current) { clearTimeout(dockTimer.current); dockTimer.current = null; }
|
|
3341
3568
|
if (e.button !== undefined && e.button !== 0) return;
|
|
3342
|
-
|
|
3569
|
+
// 捏合中的第二根手指不参与拖动;非触屏按下(说明捏合早就该结束了)顺手复位,
|
|
3570
|
+
// 免得一次没收尾的捏合把后面的拖动 / 单击全卡住。
|
|
3571
|
+
if (pinchRef.current.active) {
|
|
3572
|
+
if (e.pointerType === "touch" && !e.isPrimary) return;
|
|
3573
|
+
pinchRef.current = { active: false };
|
|
3574
|
+
}
|
|
3575
|
+
// 记下这次按下的起点是不是菜单按钮:落在菜单上就不算「单击图片框」。
|
|
3576
|
+
var onUi = !!(e.target && e.target.closest && e.target.closest("[data-ui]"));
|
|
3577
|
+
uiDownRef.current = onUi;
|
|
3578
|
+
bumpPeek();
|
|
3579
|
+
if (onUi) return;
|
|
3343
3580
|
e.preventDefault();
|
|
3344
3581
|
try { e.currentTarget.setPointerCapture(e.pointerId); } catch (e2) { /* ignore */ }
|
|
3345
3582
|
if (dockedActive) {
|
|
@@ -3367,6 +3604,7 @@ window.__ModuleLoader__.load({
|
|
|
3367
3604
|
var onMove = function (e) {
|
|
3368
3605
|
var d = dragRef.current;
|
|
3369
3606
|
if (!d) return;
|
|
3607
|
+
if (pinchRef.current.active) return;
|
|
3370
3608
|
var dx = e.clientX - d.sx;
|
|
3371
3609
|
var dy = e.clientY - d.sy;
|
|
3372
3610
|
if (Math.abs(dx) > 3 || Math.abs(dy) > 3) d.moved = true;
|
|
@@ -3407,6 +3645,12 @@ window.__ModuleLoader__.load({
|
|
|
3407
3645
|
if (!d) return;
|
|
3408
3646
|
dragRef.current = null;
|
|
3409
3647
|
setDragging(false);
|
|
3648
|
+
// 单击(按下后没拖动、不是捏合、不是点在菜单按钮上)= 短暂亮出所有菜单。
|
|
3649
|
+
// 放在 pointerup 上而不是 click:触屏上 pointerdown 被 preventDefault 后
|
|
3650
|
+
// click 不一定还来,pointerup 一定来。
|
|
3651
|
+
if (!d.moved && d.kind === "frame" && !uiDownRef.current && !pinchRef.current.active) {
|
|
3652
|
+
startPeek();
|
|
3653
|
+
}
|
|
3410
3654
|
if (d.moved) {
|
|
3411
3655
|
suppressClick.current = Date.now();
|
|
3412
3656
|
persistPrefs();
|
|
@@ -3434,6 +3678,7 @@ window.__ModuleLoader__.load({
|
|
|
3434
3678
|
}
|
|
3435
3679
|
};
|
|
3436
3680
|
var onFrameMove = function (e) {
|
|
3681
|
+
bumpPeek();
|
|
3437
3682
|
if (dragRef.current) return;
|
|
3438
3683
|
var r = e.currentTarget.getBoundingClientRect();
|
|
3439
3684
|
var x = e.clientX - r.left;
|
|
@@ -3523,6 +3768,7 @@ window.__ModuleLoader__.load({
|
|
|
3523
3768
|
useEffect(function () {
|
|
3524
3769
|
return function () {
|
|
3525
3770
|
if (dockTimer.current) { clearTimeout(dockTimer.current); dockTimer.current = null; }
|
|
3771
|
+
clearPeekTimer();
|
|
3526
3772
|
};
|
|
3527
3773
|
}, []);
|
|
3528
3774
|
|
|
@@ -4298,10 +4544,11 @@ window.__ModuleLoader__.load({
|
|
|
4298
4544
|
setFrame({ reserveW: d.last }, true);
|
|
4299
4545
|
};
|
|
4300
4546
|
|
|
4301
|
-
|
|
4302
|
-
var
|
|
4303
|
-
var
|
|
4304
|
-
var
|
|
4547
|
+
// peek 期间四角一起亮:单击图片框就能看到所有入口,不用先把鼠标挪到角上。
|
|
4548
|
+
var showBL = nearAny || menuOpen || peek;
|
|
4549
|
+
var showBR = nearAny || nearBR || peek;
|
|
4550
|
+
var showTR = nearAny || peek;
|
|
4551
|
+
var showTL = nearAny || peek;
|
|
4305
4552
|
var openSidebarFull = function () {
|
|
4306
4553
|
var shown = view || img || null;
|
|
4307
4554
|
var id = shown && shown.id ? String(shown.id) : "";
|
|
@@ -4509,7 +4756,7 @@ window.__ModuleLoader__.load({
|
|
|
4509
4756
|
hasImage: !!img,
|
|
4510
4757
|
regenOpen: regenOpen,
|
|
4511
4758
|
regenText: regenText,
|
|
4512
|
-
onToggleRegen: function () { setSubOpen(false); setRegenOpen(function (v) { return !v; }); },
|
|
4759
|
+
onToggleRegen: function () { setSubOpen(false); setRegenOpen(function (v) { return !v; }); bumpPeek(); },
|
|
4513
4760
|
onRegenText: setRegenText,
|
|
4514
4761
|
onRegenSingle: function () { runRegenFor(img, "single"); },
|
|
4515
4762
|
onRegenAll: function () { runRegenFor(img, "all"); },
|
|
@@ -4532,12 +4779,15 @@ window.__ModuleLoader__.load({
|
|
|
4532
4779
|
menuRef: menuRef,
|
|
4533
4780
|
moreRef: moreRef,
|
|
4534
4781
|
onToggleMenu: function () {
|
|
4535
|
-
|
|
4536
|
-
|
|
4537
|
-
|
|
4538
|
-
|
|
4782
|
+
var next = !menuOpen;
|
|
4783
|
+
setSubOpen(false);
|
|
4784
|
+
setRegenOpen(false);
|
|
4785
|
+
setMenuOpen(next);
|
|
4786
|
+
// 手动把菜单关掉 = 立刻收手,不等 5 秒;开着就继续续命。
|
|
4787
|
+
if (!next) endPeek();
|
|
4788
|
+
else bumpPeek();
|
|
4539
4789
|
},
|
|
4540
|
-
onToggleSub: function () { setSubPos(null); setRegenOpen(false); setSubOpen(function (v) { return !v; }); },
|
|
4790
|
+
onToggleSub: function () { setSubPos(null); setRegenOpen(false); setSubOpen(function (v) { return !v; }); bumpPeek(); },
|
|
4541
4791
|
onCapture: captureCurrent,
|
|
4542
4792
|
onStop: stopJob,
|
|
4543
4793
|
onContinuous: toggleContinuous,
|
package/lib/meta.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export const PACKAGE_NAME = 'dsh-comfyui-rp';
|
|
8
8
|
export const PLUGIN_NAME = 'dsh-comfyui-rp';
|
|
9
|
-
export const VERSION = '0.2.
|
|
9
|
+
export const VERSION = '0.2.6';
|
|
10
10
|
|
|
11
11
|
/** 对外路由前缀。不能带尾斜杠(dsh-host-webserver 的 prefix 匹配规则)。 */
|
|
12
12
|
export const ROUTE_PATH = '/__airp_comfy';
|
package/package.json
CHANGED