我开发了一个可以把某笔记屏幕置顶的小工具

缘起

我们平时使用 obsidian 或其他文档文件的时候有没有这样的体会,就是我需要对照某个笔记的内容清单做一些事情。

这是时候,如果某个笔记能置顶就好了,然后就可以悬浮在桌面上来边对照边修改了。

DocOnTop 就是为这个需求而开发的。

暂时仅支持Mac系统,Windows理论上也支持的,只不过我暂时不具备Windows环境,有兴趣者可以自己下载源码构建。

预览

这是托盘菜单

image

这是主窗口

这是配置项

这是主题样式

image

展开查看更多主题样式 ⬇️

隐藏工具栏和状态栏效果

使用

在托盘图标里选择配置菜单,打开设置窗口,然后设置好相应参数就可以了。

下载

DocOnTop-1.0.0

Issues

DocOnTop/issues

1 个赞

帮顶
不清楚除了置顶还有什么feature?
如果只是置顶、设置大小之类,用ahk或类似软件几行脚本就可以

1 个赞

不是 Mac 可用 DeskPins。

1 个赞

谢谢!

暂时只支持置顶及可以与obsidian修改同步。

ahk以前也用过,但不支持Mac系统,这个用的Niva,基于Tauri的开发工具。

2 个赞

好的,谢谢推荐!

我去了解下 DeskPins。

对的,这个刚才去看了下,我记得之前也找到过,也仅支持Windows。

Mac之所以置顶困难,估计是Mac对置顶api的限制吧,基本上应用只能置顶自己,不能置顶自己之外的窗口,大多数的置顶应用都是支持文档啦,网页啦,图片啦之类,原理还是置顶自己,然后把这些内容嵌入到自己应用中,也有一些老的应用可以支持置顶别的窗口,但都8-9年没更新了,都是老应用,估计兼容性有问题吧。

1 个赞

windows可以用PowerToys吧

2 个赞

好的,谢谢分享!Windows上工具挺多的,先收藏了

1 个赞

更新了1.0.1版本,增加了几个好看的样式

image

更新了1.0.2版本,工具栏和状态栏可以设置显示和隐藏,并支持快捷键触发

隐藏工具栏和状态栏效果

最近在 uTools 里发现了“置顶窗口/取消置顶”命令,置顶当前活动窗口,可以先点击窗口确保活动,双闪就是成功置顶了,取消置顶则没有额外动画。介于 uTools 是全平台的,你可以试试。

测试 GIF,点击展开

20240516_132711

点开设置后下方“所有功能 - 内置功能”有“置顶窗口/取消置顶”命令。

感谢回复!是utools自带的吗?还是第三方插件,我在Mac上没找到这个命令,插件也仅搜到一个“窗口切换”,但仅支持Windows。

没有,应该是不同的操作系统有所不同。

我已经通过代码直接在obsidian中实现了,代码如下:

const openFilePath = "todo.md"; // 设置打开的文件路径
const activeWindowWidth = 380; // 设置新窗口的宽度
const activeWindowHeight = 500; // 设置新窗口的高度

// 获取屏幕大小
const screenWidth = activeWindow.screen.width;
const screenHeight = activeWindow.screen.height;

// 新窗口居中显示
const activeWindowLeft = (screenWidth - activeWindowWidth) / 2;
const activeWindowTop = (screenHeight - activeWindowHeight) / 2;

//打开文档
app.workspace.getLeaf('window').openFile(app.vault.getAbstractFileByPath(openFilePath));

// 等待5ms
await new Promise(resolve => setTimeout(resolve, 5));

// 将激活窗口置顶
activeWindow.electronWindow.setAlwaysOnTop(true);

// 调整窗口大小为宽度,高度
activeWindow.resizeTo(activeWindowWidth, activeWindowHeight);

// 设置窗口的位置
activeWindow.moveTo(activeWindowLeft, activeWindowTop);

结合 dataview + runjs实现生成归档和分类列表 可以实现通过常用命令打开,效果如下

根据 熊猫别熬夜 大佬的回复实现的 能否以新窗口的形式新建笔记 - #5,来自 熊猫别熬夜

缺点是:当未最小化obsidian主窗口时,关闭置顶窗口时会激活obsidian主窗口。

恭喜!我估计 uTools 置顶和取消置顶的命令就是 activeWindow.electronWindow.setAlwaysOnTop(),没想到 Mac 也能用。

1 个赞

谢谢,改进了下,加了动画缩放效果。

// 动画缩放窗口尺寸和位置
function animateWindowResizeAndMove(startWidth, startHeight, targetWidth, targetHeight, startX, startY, targetX, targetY, duration, step = 16, callback) {
    const startTime = Date.now();
    const animate = () => {
        const elapsedTime = Date.now() - startTime;
        const progress = Math.min(elapsedTime / duration, 1); // 当前进度(0-1之间)
        
        // 计算当前窗口尺寸和位置
        let currentWidth = startWidth + (targetWidth - startWidth) * easeInOutCubic(progress);
        let currentHeight = startHeight + (targetHeight - startHeight) * easeInOutCubic(progress);
        let currentX = startX + (targetX - startX) * easeInOutCubic(progress);
        let currentY = startY + (targetY - startY) * easeInOutCubic(progress);
        //let currentOpacity = startOpacity + (targetOpacity - startOpacity) * easeInOutCubic(progress);
        activeWindow.resizeTo(currentWidth, currentHeight);
        activeWindow.moveTo(currentX, currentY);
        //activeWindow.electronWindow.setOpacity(currentOpacity);
        
        if (progress < 1) {
            setTimeout(animate, step); // 继续动画
        } else if (typeof callback === 'function') {
            callback(); // 动画完成,执行回调
        }
    };
    animate(); // 启动动画
}

// 缓动函数,实现加速减速效果
function easeInOutCubic(t) {
    return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
}


const openFilePath = "todo.md"; // 设置打开的文件路径

//新窗口大小
const newWindowWidth = 380; // 设置新窗口的宽度
const newWindowHeight = 500; // 设置新窗口的高度
	
// 获取屏幕大小
const screenWidth = activeWindow.screen.width;
const screenHeight = activeWindow.screen.height;
	
// 新窗口居中显示
const newWindowLeft = (screenWidth - newWindowWidth) / 2;
const newWindowTop = (screenHeight - newWindowHeight) / 2;

//打开文档
app.workspace.getLeaf('window').openFile(app.vault.getAbstractFileByPath(openFilePath));

// 等待100ms
await new Promise(resolve => setTimeout(resolve, 100));

// 将激活窗口置顶
activeWindow.electronWindow.setAlwaysOnTop(true);

// 激活窗口大小
const activeWindowWidth = activeWindow.outerWidth
const activeWindowHeight = activeWindow.outerHeight
	
// 激活窗口坐标位置
const activeWindowLeft = activeWindow.screenX;
const activeWindowTop = activeWindow.screenY;

// 动画缩放窗口尺寸和位置,持续时间,单位毫秒
const animationDuration = 500;
animateWindowResizeAndMove(
    activeWindowWidth,
    activeWindowHeight,
    newWindowWidth,
    newWindowHeight,
    activeWindowLeft,
    activeWindowTop,
    newWindowLeft,
    newWindowTop,
    animationDuration
);

demo6666888

1 个赞