怎么让hover editor浮窗在界面上显示它是否锁定呢?

hover editor的锁定功能只是让浮窗不会消失(图钉图标会从斜的变成竖的), 要想让浮窗里的链接点击时在新的标签页打开的话得要用ob的锁定功能再锁一下, 问题是用了ob的锁定命令后浮窗界面没有任何变化, 辨别不出这个浮窗到底锁了没有. 有什么办法可以让用户知道这个浮窗到底锁了没吗?(比如图钉颜色或形状改变下)

给插件作者写了issue, 他好像说是ob底层的原因, 没法实现这个

@wilson 你结合hover editor写了一个超级好用的设置界面浮窗功能, 这个问题你觉得有解吗?

感谢回复, 不过你好像没有理解我的意思 :joy:

用ob锁定命令锁定后的浮窗点击浮窗里的链接是可以在新标签页打开的, 这个没问题. 问题是, 辨别不出这个浮窗是否已被锁定, 因为用ob锁定命令后浮窗界面不会有改变(比如图钉图标变化之类的), 有时ob锁定命令多点几次后, 会不知道这个浮窗到底锁了没, 直到点击浮窗里的链接后链接在该浮窗打开才知道浮窗没被锁定, 反之则有锁定.

比如你动图里的图钉图标是竖的, 它并不一定代表该浮窗被真正锁定了. hover editor设置里有个’Auto Pin’的选项, 'Pin’后的浮窗的图钉图标就会从斜的变成竖的(像你动图里的那样), 但是这个只是表示该浮窗不会从画面消失. 要真正锁定, 得执行ob自带的锁定命令, 但执行后图钉图标仍然是竖的, 也就是浮窗界面没有变化, 用户会不知道浮窗被锁了没

不知道我解释清楚没有 :joy:

感谢信任!

首先应该可以实现的,大胆去尝试。

这里给你一个思路,不要使用ob自带的锁定命令。

使用runjs或quickadd添加一个自己的命令。

然后在这个命令中,你调用ob的api锁定或解锁当前文档,然后,获取当前激活叶子,如果你刚用hover editor打开文档,那么这个激活叶子就是你当前文档所在的叶子。

然后通过当前叶子可以获取hover editor所在的dom,进一步就能获取hover editor的那个锁定的图标,然后更改颜色即可。

伪代码如下,仅供参考

const activeLeaf = app.workspace.activeLeaf;
const isPinned = activeLeaf?.getViewState()?.pinned;
if(!isPinned) {
    activeLeaf.setPinned(true) // false解锁
    const pinStyle = activeLeaf.containerEl.closest(".hover-popover")?.querySelector(".mod-pin-popover > svg")?.style;
    if(pinStyle) pinStyle.color='red';
}

祝你好运 :four_leaf_clover:

不一定要让表示锁定的图标(图钉)有变化, 只要浮窗界面样式上有其它任何改变都可以, 只要能让用户从界面上辨别出浮窗是否被真正锁定了就可以

插件开发者的回复是下面这样的:
Unfortunately this is not a trivial thing; current versions of Obsidian have removed the code that used to show a pin icon on the view header, and Obsidian does not provide any style basis for knowing whether a pane is pinned. So we’d have to duplicate the application logic for this sort of thing and figure out how to add it. It’s not likely to be something I’ll have time for in the immediate future

一个题外话, 对某个特定用户的回复我看别人都能在右上角显示出下面这个图标
240816-191035

我编辑的时候有显示是针对某个特定用户回复的, 为啥回复发出去的时候右上角没显示出上面那个图标呢?

回复发出去的时候右上角没显示图标

搜索“论坛发帖指导2023”,里面有介绍。

非常感谢, 但是我按照你说的以及参照了你之前的帖子(我放弃了mindmap,直接把pixso白板嵌入到obsidian了)运行了runjs, 图钉还是不能显示成你截图里的红色的, 操作过程如下面动图, 我是哪里操作不对吗?

240816-215137

用这个代码吧,之前的是给你的参考代码,不够完善

```js RunJS="pin or unpin"

// 获取当前文档叶子
const activeLeaf = app.workspace.activeLeaf;
// 获取是否已锁定
const isPinned = activeLeaf?.getViewState()?.pinned;
if(!isPinned) {
    // 锁定
    activeLeaf.setPinned(true);
    // 设置锁定图片样式
    const hoverPinStyle = activeLeaf.containerEl.closest(".hover-popover")?.querySelector(".mod-pin-popover > svg")?.style;
     if(hoverPinStyle) hoverPinStyle.color = 'red';
} else {
    // 解锁
    activeLeaf.setPinned(false);
    // 设置锁定图片样式
    const hoverPinStyle = activeLeaf.containerEl.closest(".hover-popover")?.querySelector(".mod-pin-popover > svg")?.style;
     if(hoverPinStyle) hoverPinStyle.color = '';
}
```

然后,看到你的图片显示是把脚本加到了runjs加载时执行。

你想想应该是runjs插件加载时执行锁定吗?

插件加载时,你文档都没打开,它锁定谁呢?

即使能锁定,锁定的也不是你hover editor打开的文件呀。

那是不是要先保证hover editor打开文件后才能执行锁定操作呢?

那应该怎么做呢?

那肯定得hover editor打开文件后执行命令呀,所以,runjs的脚本应该加到命令里,而不是自动加载里。

这个命令什么时候执行呢?

方法1,可以在你hover editor 打开后,ctrl / cmd + p 打开命令,运行 RunJS: pin or unpin(这个是你自定义的命令名,见上面代码中的名字)

方法2,配合commander插件,生成一个快捷操作按钮

然后,在hover editor 点击这个按钮即可

r26

你加到侧边栏,dock里也行。

非常感谢这么详细的解答, 但是好奇怪, 我完全按照你写的步骤做的, 但是那个红色的图钉还是没能出来, 麻烦看下下图, 我是哪里做的有问题吗?

240816-234734

抱歉!昨天太困了,代码存在兼容性问题,用这个代码,做了兼容性处理。

```js RunJS="pin or unpin"

// 获取当前文档叶子
const activeLeaf = app.workspace.activeLeaf;
// 获取是否已锁定
const isPinned = activeLeaf?.getViewState()?.pinned;
if(!isPinned) {
    // 锁定
    activeLeaf.setPinned(true);
    // 设置锁定图片样式
    const hoverPinStyle = activeLeaf.containerEl.closest(".hover-popover")?.querySelector(".mod-pin-popover > svg")?.style;
     if(hoverPinStyle) hoverPinStyle.color = 'red';
} else {
    // 解锁
    activeLeaf.setPinned(false);
    // 设置锁定图片样式
    const hoverPinStyle = activeLeaf.containerEl.closest(".hover-popover")?.querySelector(".mod-pin-popover > svg")?.style;
     if(hoverPinStyle) hoverPinStyle.color = '';
}
```

非常感谢, 终于可以了. 你说的"兼容性"是指哪方面的兼容性呢?

就是当获取元素对象时失败会导致报错,从而导致程序终止运行。

非常感谢你这么耐心的解答, 已经将你的方案推荐给hover editor插件开发者了:grinning:

有一个小问题. 一开始打开浮窗, 浮窗的图钉图标是白色斜的(hover editor的"Auto Pin"选项我是设置成"on drag or resize"的), 执行你这个脚本命令后, 图钉变成红色斜的, 鼠标点击浮窗之外的区域时浮窗会消失.

要真正锁定浮窗, 得打开浮窗, 执行脚本命令(图钉由白色斜的变成红色斜的), 再移动一下浮窗(图钉由红色斜的变成红色竖的); 或者打开浮窗, 移动一下浮窗(图钉由白色斜的变成白色竖的), 再执行脚本命令(图钉由白色竖的变成红色竖的)

能否在打开浮窗(图钉是白色斜的), 执行脚本命令后, 不移动浮窗, 直接图钉就变成红色竖的(也就是让它真正锁定)呢?

首先这两个不一样,hover editor的钉住是hover editor的,ob的是ob的。不应该混合使用。如果你想一打开hover editor就钉住,为什么不把Auto pin设为always?

当然,如果你执意要这么做,最简单的方式就是模拟点击了,既然能改变图标的颜色,就能改变图标的状态,甚至替换图标。

可以在锁定后的代码里加入这个模拟点击代码

比如

if(!isPinned) {
    ....
    // 同时钉住hover editor
    activeLeaf.containerEl.closest(".hover-popover")?.querySelector(".popover-header-icon:not(.is-active)")?.click();
} else {
     ....
    // 同时解锁hover editor
     activeLeaf.containerEl.closest(".hover-popover")?.querySelector(".popover-header-icon.is-active")?.click();
}

r26

有些浮窗只是瞄一眼就不看了, 鼠标移开浮窗它就会自动关闭, "Auto pin"设为"always"的话, 每次还得点"x"才能关闭;

有些浮窗希望点击里面的链接能直接在当前浮窗里打开, 于是将"Auto Pin"设置成"on drag or resize", 这样移动一下浮窗它就不会从画面消失, 然后就可以点击链接了;

有些浮窗希望点击里面的链接能在其它标签页里打开, 而当前浮窗又需要保持着用于对比查看, 于是就用到了你写的脚本 :blush:

是的, 但是ob的钉住肯定就意为着hover editor的钉住, 所以如果ob钉住了, 即使没执行hover editor的钉住(也就是移动浮窗), 浮窗也应该是被钉住的, 所以就有了我上面提的小问题 :grinning:

终于, 这个问题告一段落了, 非常感谢这么专业的解答:+1: :heart: