为什么要重试呢?

主要是觉得Pencil这个工具还是比较有价值。就像Linus对Linux下分发版的态度“让用户有选择”一样,在现在这个Sass服务、Web服务化越来越普遍越便利的时代,这样一款定位于桌面式的开源软件,就是给用户的一种选择。

诚然,好的服务、核心的服务我们需要付费、愿意付费,但同样一个服务对于不同的人其重要性是不同的,比如我的设定里印象笔记、迅雷下载、Jetbrains的IDE、京东、书籍阅读等是需要付费的,因为这是我自己的核心诉求,笔记多端同步、经常要下载国外各种软件时的速度体验、京东VIP的购物体验等。而原型图设计我认为不是我的核心诉求,再一个我不需要用到完整的服务,比如Sketch。去年也买过一年授权,但使用频率极低,而且其核心功能的用户体验并不太好,所以今年到期后也不再续费了。

mac用户群的体验标准,我代表不了,我对于mac的整体评价,甚至应该是中下的那一个等级,但那种软硬件完美结合的体验理念,相对于市面上其它产品、绝对要点一个大大的赞。

重试

很奇怪,前两个月尝试过的对Pencil的macOS原生菜单改造过程,这两天要去重试的时候,已经记不清了,所以一定要及时记录、而且要记重点,大脑内部存储性能不行,就找外部存储。

1、事件驱动的开发方式

主进程 pencil/app/index.js

从主进程到渲染进程的异步通信

mainWindow.webContents.on("will-navigate", handleRedirect);
mainWindow.webContents.on("new-window", handleRedirect);
mainWindow.webContents.on('did-finish-load', function () {
console.log('页面内容加载完成');
if (process.platform == 'darwin') {
mainWindow.webContents.send('initMacOSMenu');
}
});

初始化Electron自带的关于菜单,如果有需求的话。

app.on('ready', function() {
app.setAboutPanelOptions({
applicationName: pkg.productName,
applicationVersion: pkg.version,
copyright: pkg.copyright,
version: '',
credits: '',
authors: '',
website: pkg.homepage,
iconPath: '',
});

渲染进程 pencil/app/app.js

/**
* 调整实现方式为完全在渲染进程中初始化原生菜单
*/
ipcRenderer.on('initMacOSMenu', (event) => {
console.log('initMacOSMenu web page received '); var {MacOSToolbar} = require('./views/toolbars/MacOSToolbar'); MacOSToolbar.createMacOSToolbar();
});

2、具体实现

要让主进程的菜单点击事件触发后,渲染进程响应相应的指令。关键词:UICommandManager.getCommand、menu key。

菜单初始化 pencil/app/views/toolbars/MacOSToolbar.js

const {Menu, app, webContents} = require('electron').remote;
const pkg = require("../../package.json");
const FileToolMenu = require('../menus/FileToolMenu'); /**
* 原始逻辑是在主进程中,初始化MacOS下的原生菜单
* 目前改成在渲染进程中被调用
* 菜单的交互事件,需要在 渲染进程 中指定
*/
exports.MacOSToolbar = { menuClicked(menuItem, browserWindow, event) {
// browserWindow.webContents.send('menuClicked', menuItem); var command = UICommandManager.getCommand(menuItem.id);
if (!command) {
return;
} command.run();
}, createMacOSToolbar() {
// Cli 环境执行
var menuClicked = this.menuClicked;
var fileMenus = [];
var fileCommands = FileToolMenu.allItems();
for (let i = 0; i < fileCommands.length; i++) {
const command = fileCommands[i]; let menu = {
id: command.key,
label: command.label,
accelerator: command.shortcut,
click: menuClicked,
};
if (command.type == 'separator') {
menu = {
type: "separator",
};
}
if (command.run) { }
fileMenus.push(menu);
}

Pencil 基于Electron的GUI原型工具之菜单再探的更多相关文章

  1. Pencil 基于Electron的GUI原型工具之菜单三探 印象笔记同步

    今天一鼓作气实现Pencil整合印象笔记同步的功能. 缘起,像Sketch或者Adobe XD等一些工具都开始陆续支持整合阿里巴巴的"语雀"云服务,将设计文档同步到云端,便于团队协 ...

  2. 4款最受欢迎的Mac原型工具

    原型工具中Wireframe, Mockup和prototype之间的有什么不同? 无论你是一名刚入行的UX/UI设计师,还是入行多年的老手,在制作原型的过程中一定接触或听说过其中很重要的三个原型术语 ...

  3. 基于 electron 实现简单易用的抓包、mock 工具

    背景 经常我们要去看一些页面所发出的请求时,经常会用到 Charles 做为抓包工具来进行接口抓取,但一方面市面是很多抓包工具都是收费或者无法二次开发的.当前我们团队大多数用的也都是 Charles, ...

  4. MonjaDB —— 基于 Eclipse 的 MongoDB GUI 客户端工具(转载)

    原文链接http://www.oschina.net/question/12_59707 MonjaDB 是一个 MongoDB 的 GUI 客户端工具,提供直观的 MongoDB 数据管理的功能,支 ...

  5. 30款基本UX工具 - 思维流程工具 & 原型工具

    来源:GBin1.com 现在的开发人员在建造网站时,注重的是布局和技术特性,但是往往忽略了更重要的一点,那就是用户体验. 如 果用户在使用的时候,不能简单清楚的知道该要如何操作,那么他们一定会选择另 ...

  6. 使用Squirrel创建基于Electron开发的Windows 应用安装包

    我们把自己开发的Electron应用发布之前,需要把app打包成简单的安装包,这样app更容易被获取,以此来发布我们的应用.我们可以参考Wix或其他的安装程序,但是对于Electron应用更好的打包程 ...

  7. 转载:开发者眼中最好的 22 款 GUI 测试工具

    对于很多同学来说gui程序的测试是一个难点,所以我从网上转载了一篇关于gui测试的一篇文章,里面罗列的很多工具,大家可以尝试一下学习学习. 英文原文:22 best GUI testing tools ...

  8. 开发者眼中最好的 22 款 GUI 测试工具

    1.Abbot - Java GUI 测试框架 Abbot是一个基于GUI的简单的Java测试框架,它能够帮助开发者测试Java用户界面. 它提供事件自动生成和验证Java GUI组件,使您能够轻松地 ...

  9. Pencil-一个开源免费的UI原型工具,自带ios和android模板

    Pencil是一个开源免费的UI原型工具,自带ios和android模板,可以很方便的做mockup. 下图是一个官方展示的模板:         

随机推荐

  1. 一起学react (1) 10分钟 让你dva从入门到精通

    前言 如果文章中有错误的地方的话 可以直接加我QQ:469373256 自己针对一些问题做的优化版本 目前刚启动 还不是很成熟 https://github.com/fangkyi03/fastkit ...

  2. 在Unity中使用自定义宏

    最近写AVG工具时有这样的功能需求,AVG的角色可以支持动态的Spine动画,当没有Spine动画时采用默认的立绘图片替代. 这时在脚本中就可以采用自定义的宏来实现: 例如: #if VNSpine ...

  3. 2019_JAVA面试题_真实总结

    来自刚被某互联网公司录取的朋友的分享. 整理的面试题1: 1.Java里面有哪几种基础数据类型, 2.Char为何是两个字节, 3.Object有哪些方法 4.final修饰变量,函数,类的作用, 5 ...

  4. python多进程multiprocessing Pool相关问题

    python多进程想必大部分人都用到过,可以充分利用多核CPU让代码效率更高效. 我们看看multiprocessing.pool.Pool.map的官方用法 map(func, iterable[, ...

  5. 分词 | 双向匹配中文分词算法python实现

    本次实验内容是基于词典的双向匹配算法的中文分词算法的实现.使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法. 算法描述正向最大匹配算法先设定扫描的窗口大小ma ...

  6. docker-mysql-使用docker运行mysql8

    1, 下载镜像, 我用的是8 docker pull mysql: 2, 启动镜像 docker run \ --name mysql8 \ -p : \ -v /Users/wenbronk/Con ...

  7. oracle学习笔记(十五) PL/SQL语法结构以及使用

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...

  8. [笔记] .net core WPF 程序,发布独立程序与单一执行程序

    如何发布独立可运行的,和只有一个文件的 .net core WPF 程序. 1 发布并打包 Step 1 在项目上右键,在菜单中选择发布,使用文件发布,选择独立部署模式,其它的条件,依照自己的情况设置 ...

  9. go-运算符

    算术运算符 ++,--只能放在变量后面,不能放在前面 独立使用 目的:更简洁 go语言不支持三元运算符 键盘输入 fmt.scanln 会在换行时扫描,所以最后一个条目必须换行或达到结束位置 fmt. ...

  10. 用Python制作只属于你和ta的聊天渠道吧

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Python应用宝典 PS:如有需要Python学习资料的小伙伴可 ...