electron 使用菜单模板构建器进行条件菜单项操作过于不便,

webghufk  于 6个月前  发布在  Electron
关注(0)|答案(5)|浏览(69)

您的功能请求是否与问题相关?请描述。

我之前打开了 #13754 ,但与其采用我首选的过滤掉假值的方法,他们选择了严格的类型检查,这很好,但也意味着在内联条件菜单中进行操作非常不方便。
这是不可能的:

electron.Menu.buildFromTemplate([
	{
		type: 'separator',
	},
	isLoggedIn ? {
		label: 'Foo'
	} : undefined
]);

您可能会被误导以为可以这样做:

electron.Menu.buildFromTemplate([
	{
		type: 'separator',
	},
	{
		label: 'Foo',
		visible: isLoggedIn
	}
]);

但即使 visible: false 时,它仍然会显示分隔符:

描述您希望实现的解决方案

我希望 Electron 能够:

  1. 允许 undefined 并将其过滤掉(深入/递归地)。那将是我首选的最方便的解决方案。
  2. 添加一个 {type: 'empty'} ,该项已被过滤掉(深入/递归地)。

描述您考虑过的替代方案

删除无意义的 {type: 'separator} 项目。例如,当有一个分隔符和一个 {visible: false} 项目在末尾时,分隔符应该被过滤掉,否则它看起来很奇怪。

附加上下文

跨平台应用程序有很多条件菜单项。它不应该这么难做到。

v1l68za4

v1l68za41#

import {Menu} from "electron";

const emptyArray = Object.freeze([]);

...

mainWindow.webContents.on("context-menu", (event, {editFlags}) => {
    const template = [
        ...(editFlags.canCut ? [{role: "cut"}] : emptyArray),
        ...(editFlags.canCopy ? [{role: "copy"}] : emptyArray),
        ...(editFlags.canPaste ? [{role: "paste"}] : emptyArray),
    ];

    if (!template.length) {
        return;
    }

    Menu
        .buildFromTemplate(template)
        .popup({});
});
vuktfyat

vuktfyat2#

@vladimiry 我知道我可以解决这个问题,我已经在做了。这不是重点。这种常见的需求不应该需要一个丑陋的解决方法。

nukf8bse

nukf8bse3#

在我的看来,使用诸如数组扩展这样的通用JS特性并不比将undefined{type: 'empty'}放入菜单项数组中,期望Electron会过滤掉这些项目更丑陋。菜单项数组是一个菜单项数组,为什么要在那里放乱七八糟的东西呢?因此,在我看来,通过实现这个建议来膨胀Electron代码库是没有意义的,尤其是考虑到数组扩展解决方法与第一个请求的选项并没有太大的不同。

附注:构建一个基于标准Menu.buildFromTemplate的有偏见的 Package 器始终是一个选择,它可以在默认行为的基础上执行所有花哨的操作。

im9ewurl

im9ewurl4#

@sindresorhus 有任何更方便的想法吗?

5f0d552i

5f0d552i5#

当使用TypeScript时,这会变成一个可怕的混乱。然而,对于@sindresorhus所使用的非常具体的例子,在分隔符中添加visible可能是最简单的前进方式。

相关问题