mirror of
https://github.com/notion-enhancer/notion-enhancer.git
synced 2025-04-09 15:09:02 +00:00
+ left/right tab switching, + remove cmd/ctrl+w from menu, - break tab opening/closing/titles
This commit is contained in:
parent
db3f89e3c4
commit
82e5db751f
@ -14,7 +14,9 @@ module.exports = (store, __exports) => {
|
|||||||
/\\/g,
|
/\\/g,
|
||||||
'/'
|
'/'
|
||||||
)}/app/helpers/notionIpc.js`),
|
)}/app/helpers/notionIpc.js`),
|
||||||
{ toKeyEvent } = require('keyboardevent-from-electron-accelerator');
|
{ toKeyEvent } = require('keyboardevent-from-electron-accelerator'),
|
||||||
|
tabsEnabled = (store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {})
|
||||||
|
.enabled;
|
||||||
|
|
||||||
document.defaultView.addEventListener('keyup', (event) => {
|
document.defaultView.addEventListener('keyup', (event) => {
|
||||||
// additional hotkeys
|
// additional hotkeys
|
||||||
@ -25,7 +27,7 @@ module.exports = (store, __exports) => {
|
|||||||
for (let prop in hotkey)
|
for (let prop in hotkey)
|
||||||
if (hotkey[prop] !== event[prop]) triggered = false;
|
if (hotkey[prop] !== event[prop]) triggered = false;
|
||||||
if (triggered) electron.ipcRenderer.send('enhancer:open-menu');
|
if (triggered) electron.ipcRenderer.send('enhancer:open-menu');
|
||||||
if ((store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled) {
|
if (tabsEnabled) {
|
||||||
// switch between tabs via key modifier
|
// switch between tabs via key modifier
|
||||||
const select_tab_modifier = toKeyEvent(
|
const select_tab_modifier = toKeyEvent(
|
||||||
store('e1692c29-475e-437b-b7ff-3eee872e1a42').select_modifier
|
store('e1692c29-475e-437b-b7ff-3eee872e1a42').select_modifier
|
||||||
@ -33,7 +35,22 @@ module.exports = (store, __exports) => {
|
|||||||
let triggered = true;
|
let triggered = true;
|
||||||
for (let prop in select_tab_modifier)
|
for (let prop in select_tab_modifier)
|
||||||
if (select_tab_modifier[prop] !== event[prop]) triggered = false;
|
if (select_tab_modifier[prop] !== event[prop]) triggered = false;
|
||||||
if (triggered && [1, 2, 3, 4, 5, 6, 7, 8, 9].includes(+event.key))
|
if (
|
||||||
|
triggered &&
|
||||||
|
[
|
||||||
|
'1',
|
||||||
|
'2',
|
||||||
|
'3',
|
||||||
|
'4',
|
||||||
|
'5',
|
||||||
|
'6',
|
||||||
|
'7',
|
||||||
|
'8',
|
||||||
|
'9',
|
||||||
|
'ArrowRight',
|
||||||
|
'ArrowLeft',
|
||||||
|
].includes(event.key)
|
||||||
|
)
|
||||||
electron.ipcRenderer.sendToHost('enhancer:select-tab', event.key);
|
electron.ipcRenderer.sendToHost('enhancer:select-tab', event.key);
|
||||||
// create/close tab keybindings
|
// create/close tab keybindings
|
||||||
const new_tab_keybinding = toKeyEvent(
|
const new_tab_keybinding = toKeyEvent(
|
||||||
@ -69,11 +86,7 @@ module.exports = (store, __exports) => {
|
|||||||
document.body.classList.add('snappy-transitions');
|
document.body.classList.add('snappy-transitions');
|
||||||
|
|
||||||
// frameless
|
// frameless
|
||||||
if (
|
if (store().frameless && !store().tiling_mode && !tabsEnabled) {
|
||||||
store().frameless &&
|
|
||||||
!store().tiling_mode &&
|
|
||||||
!(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled
|
|
||||||
) {
|
|
||||||
document.body.classList.add('frameless');
|
document.body.classList.add('frameless');
|
||||||
// draggable area
|
// draggable area
|
||||||
document
|
document
|
||||||
@ -86,9 +99,7 @@ module.exports = (store, __exports) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// window buttons
|
// window buttons
|
||||||
if (
|
if (!tabsEnabled) {
|
||||||
!(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled
|
|
||||||
) {
|
|
||||||
const buttons = require('./buttons.js')(store);
|
const buttons = require('./buttons.js')(store);
|
||||||
document
|
document
|
||||||
.querySelector('.notion-topbar > div[style*="display: flex"]')
|
.querySelector('.notion-topbar > div[style*="display: flex"]')
|
||||||
@ -185,9 +196,7 @@ module.exports = (store, __exports) => {
|
|||||||
'--theme--code_inline-background',
|
'--theme--code_inline-background',
|
||||||
].map((rule) => [rule, getStyle(rule)])
|
].map((rule) => [rule, getStyle(rule)])
|
||||||
);
|
);
|
||||||
if (
|
if (tabsEnabled) {
|
||||||
(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled
|
|
||||||
) {
|
|
||||||
electron.ipcRenderer.sendToHost(
|
electron.ipcRenderer.sendToHost(
|
||||||
'enhancer:set-tab-theme',
|
'enhancer:set-tab-theme',
|
||||||
[
|
[
|
||||||
@ -213,7 +222,7 @@ module.exports = (store, __exports) => {
|
|||||||
);
|
);
|
||||||
electron.ipcRenderer.on('enhancer:get-menu-theme', setThemeVars);
|
electron.ipcRenderer.on('enhancer:get-menu-theme', setThemeVars);
|
||||||
|
|
||||||
if ((store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {}).enabled) {
|
if (tabsEnabled) {
|
||||||
let tab_title = '';
|
let tab_title = '';
|
||||||
__electronApi.setWindowTitle = (title) => {
|
__electronApi.setWindowTitle = (title) => {
|
||||||
if (tab_title !== title) {
|
if (tab_title !== title) {
|
||||||
|
@ -83,7 +83,8 @@ module.exports = {
|
|||||||
],
|
],
|
||||||
hacks: {
|
hacks: {
|
||||||
'main/main.js': require('./tray.js'),
|
'main/main.js': require('./tray.js'),
|
||||||
'main/createWindow.js': require('./create.js'),
|
'main/systemMenu.js': require('./systemMenu.js'),
|
||||||
|
'main/createWindow.js': require('./createWindow.js'),
|
||||||
'renderer/index.js': require('./render.js'),
|
'renderer/index.js': require('./render.js'),
|
||||||
'renderer/preload.js': require('./client.js'),
|
'renderer/preload.js': require('./client.js'),
|
||||||
},
|
},
|
||||||
|
@ -42,7 +42,7 @@ module.exports = (store, __exports) => {
|
|||||||
searching: false,
|
searching: false,
|
||||||
searchingPeekView: false,
|
searchingPeekView: false,
|
||||||
zoomFactor: 1,
|
zoomFactor: 1,
|
||||||
tabs: new Map([[0, true]]),
|
tabs: new Map([[0, ['notion.so', true]]]),
|
||||||
};
|
};
|
||||||
this.$titlebar = null;
|
this.$titlebar = null;
|
||||||
this.$dragging = null;
|
this.$dragging = null;
|
||||||
@ -84,42 +84,42 @@ module.exports = (store, __exports) => {
|
|||||||
) || []
|
) || []
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
document.addEventListener('dragstart', (event) => {
|
// document.addEventListener('dragstart', (event) => {
|
||||||
if (!this.$titlebar) return;
|
// if (!this.$titlebar) return;
|
||||||
this.$dragging = getTab(event.target)[0];
|
// this.$dragging = getTab(event.target)[0];
|
||||||
event.target.style.opacity = 0.5;
|
// event.target.style.opacity = 0.5;
|
||||||
});
|
// });
|
||||||
document.addEventListener('dragend', (event) => {
|
// document.addEventListener('dragend', (event) => {
|
||||||
if (!this.$titlebar) return;
|
// if (!this.$titlebar) return;
|
||||||
event.target.style.opacity = '';
|
// event.target.style.opacity = '';
|
||||||
});
|
// });
|
||||||
document.addEventListener('dragover', (event) => {
|
// document.addEventListener('dragover', (event) => {
|
||||||
if (!this.$titlebar) return;
|
// if (!this.$titlebar) return;
|
||||||
event.preventDefault();
|
// event.preventDefault();
|
||||||
document
|
// document
|
||||||
.querySelectorAll('.dragged-over')
|
// .querySelectorAll('.dragged-over')
|
||||||
.forEach((el) => el.classList.remove('dragged-over'));
|
// .forEach((el) => el.classList.remove('dragged-over'));
|
||||||
const tab = getTab(event.target);
|
// const tab = getTab(event.target);
|
||||||
if (tab[1]) tab[1].classList.add('dragged-over');
|
// if (tab[1]) tab[1].classList.add('dragged-over');
|
||||||
});
|
// });
|
||||||
document.addEventListener('drop', (event) => {
|
// document.addEventListener('drop', (event) => {
|
||||||
if (!this.$titlebar || this.$dragging === null) return;
|
// if (!this.$titlebar || this.$dragging === null) return;
|
||||||
event.preventDefault();
|
// event.preventDefault();
|
||||||
document
|
// document
|
||||||
.querySelectorAll('.dragged-over')
|
// .querySelectorAll('.dragged-over')
|
||||||
.forEach((el) => el.classList.remove('dragged-over'));
|
// .forEach((el) => el.classList.remove('dragged-over'));
|
||||||
document
|
// document
|
||||||
.querySelectorAll('.slideIn')
|
// .querySelectorAll('.slideIn')
|
||||||
.forEach((el) => el.classList.remove('slideIn'));
|
// .forEach((el) => el.classList.remove('slideIn'));
|
||||||
const from = getTab(this.views.tabs[+this.$dragging]),
|
// const from = getTab(this.views.tabs[+this.$dragging]),
|
||||||
to = getTab(event.target);
|
// to = getTab(event.target);
|
||||||
if (!from[1].classList.contains('new') && from[0] !== to[0])
|
// if (!from[1].classList.contains('new') && from[0] !== to[0])
|
||||||
to[1].parentElement.insertBefore(from[1], to[1]);
|
// to[1].parentElement.insertBefore(from[1], to[1]);
|
||||||
this.$dragging = null;
|
// this.$dragging = null;
|
||||||
document
|
// document
|
||||||
.querySelector('#tabs')
|
// .querySelector('#tabs')
|
||||||
.appendChild(document.querySelector('.tab.new'));
|
// .appendChild(document.querySelector('.tab.new'));
|
||||||
});
|
// });
|
||||||
document.addEventListener('keyup', (event) => {
|
document.addEventListener('keyup', (event) => {
|
||||||
if (!electron.remote.getCurrentWindow().isFocused()) return;
|
if (!electron.remote.getCurrentWindow().isFocused()) return;
|
||||||
// switch between tabs via key modifier
|
// switch between tabs via key modifier
|
||||||
@ -129,7 +129,22 @@ module.exports = (store, __exports) => {
|
|||||||
let triggered = true;
|
let triggered = true;
|
||||||
for (let prop in select_tab_modifier)
|
for (let prop in select_tab_modifier)
|
||||||
if (select_tab_modifier[prop] !== event[prop]) triggered = false;
|
if (select_tab_modifier[prop] !== event[prop]) triggered = false;
|
||||||
if (triggered && [1, 2, 3, 4, 5, 6, 7, 8, 9].includes(+event.key))
|
if (
|
||||||
|
triggered &&
|
||||||
|
[
|
||||||
|
'1',
|
||||||
|
'2',
|
||||||
|
'3',
|
||||||
|
'4',
|
||||||
|
'5',
|
||||||
|
'6',
|
||||||
|
'7',
|
||||||
|
'8',
|
||||||
|
'9',
|
||||||
|
'ArrowRight',
|
||||||
|
'ArrowLeft',
|
||||||
|
].includes(event.key)
|
||||||
|
)
|
||||||
this.selectTab(event.key);
|
this.selectTab(event.key);
|
||||||
// create/close tab keybindings
|
// create/close tab keybindings
|
||||||
const new_tab_keybinding = toKeyEvent(
|
const new_tab_keybinding = toKeyEvent(
|
||||||
@ -192,58 +207,64 @@ module.exports = (store, __exports) => {
|
|||||||
newTab() {
|
newTab() {
|
||||||
let id = 0;
|
let id = 0;
|
||||||
const list = new Map(this.state.tabs);
|
const list = new Map(this.state.tabs);
|
||||||
while (this.state.tabs.get(id)) id++;
|
while (this.state.tabs.get(id) && this.state.tabs.get(id)[1]) id++;
|
||||||
list.delete(id);
|
list.delete(id);
|
||||||
this.openTab(id, list, true);
|
this.openTab(id, list, true);
|
||||||
}
|
}
|
||||||
openTab(id, state = new Map(this.state.tabs), load) {
|
openTab(id, state = new Map(this.state.tabs), load) {
|
||||||
if (!id && id !== 0) return;
|
if (!id && id !== 0) {
|
||||||
|
if (this.views.current.$el().style.display === 'flex') return;
|
||||||
|
id = [...state].find(([id, [title, open]]) => open)[0];
|
||||||
|
}
|
||||||
|
const current_src = this.views.current.$el().src;
|
||||||
this.views.current.id = id;
|
this.views.current.id = id;
|
||||||
this.setState({ tabs: state.set(id, true) }, async () => {
|
this.setState(
|
||||||
this.focusTab();
|
{
|
||||||
if (load) {
|
tabs: state.set(id, [
|
||||||
await new Promise((res, rej) => {
|
state.get(id) ? state.get(id)[0] : 'notion.so',
|
||||||
let attempt;
|
true,
|
||||||
attempt = setInterval(() => {
|
]),
|
||||||
if (!document.body.contains(this.views.html[id])) return;
|
},
|
||||||
clearInterval(attempt);
|
async () => {
|
||||||
res();
|
this.focusTab();
|
||||||
}, 50);
|
if (load) {
|
||||||
});
|
await new Promise((res, rej) => {
|
||||||
this.views.html[id].style.opacity = '0';
|
let attempt;
|
||||||
let unhide;
|
attempt = setInterval(() => {
|
||||||
unhide = () => {
|
if (!document.body.contains(this.views.html[id])) return;
|
||||||
this.views.html[id].style.opacity = '';
|
clearInterval(attempt);
|
||||||
this.views.html[id].removeEventListener(
|
res();
|
||||||
'did-stop-loading',
|
}, 50);
|
||||||
unhide
|
});
|
||||||
|
this.views.html[id].style.opacity = '0';
|
||||||
|
let unhide;
|
||||||
|
unhide = () => {
|
||||||
|
this.views.html[id].style.opacity = '';
|
||||||
|
this.views.html[id].removeEventListener(
|
||||||
|
'did-stop-loading',
|
||||||
|
unhide
|
||||||
|
);
|
||||||
|
};
|
||||||
|
this.views.html[id].addEventListener('did-stop-loading', unhide);
|
||||||
|
this.views.html[id].loadURL(
|
||||||
|
store().default_page
|
||||||
|
? idToNotionURL(store().default_page)
|
||||||
|
: current_src
|
||||||
);
|
);
|
||||||
};
|
// this.views.html[id].getWebContents().openDevTools();
|
||||||
this.views.html[id].addEventListener('did-stop-loading', unhide);
|
}
|
||||||
this.views.html[id].loadURL(
|
|
||||||
store().default_page
|
|
||||||
? idToNotionURL(store().default_page)
|
|
||||||
: this.views.current.$el().src
|
|
||||||
);
|
|
||||||
// this.views.html[id].getWebContents().openDevTools();
|
|
||||||
}
|
}
|
||||||
});
|
);
|
||||||
}
|
}
|
||||||
closeTab(id) {
|
closeTab(id) {
|
||||||
if ((!id && id !== 0) || !this.state.tabs.get(id)) return;
|
if ((!id && id !== 0) || !this.state.tabs.get(id)) return;
|
||||||
|
console.log(id);
|
||||||
const list = new Map(this.state.tabs);
|
const list = new Map(this.state.tabs);
|
||||||
list.delete(id);
|
list.set(id, [list.get(id)[0], false]);
|
||||||
list.set(id, false);
|
console.log(list);
|
||||||
if (![...list].filter(([id, open]) => open).length)
|
if (![...list].filter(([id, [title, open]]) => open).length)
|
||||||
return electron.remote.getCurrentWindow().close();
|
return electron.remote.getCurrentWindow().close();
|
||||||
while (
|
this.openTab(null, list);
|
||||||
!list.get(this.views.current.id) ||
|
|
||||||
this.views.current.id === id
|
|
||||||
) {
|
|
||||||
this.views.current.id = this.views.current.id - 1;
|
|
||||||
if (this.views.current.id < 0) this.views.current.id = list.size - 1;
|
|
||||||
}
|
|
||||||
this.setState({ tabs: list }, this.focusTab.bind(this));
|
|
||||||
}
|
}
|
||||||
focusTab() {
|
focusTab() {
|
||||||
if (this.views.active === this.views.current.id) return;
|
if (this.views.active === this.views.current.id) return;
|
||||||
@ -263,18 +284,28 @@ module.exports = (store, __exports) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
selectTab(num) {
|
selectTab(num) {
|
||||||
num = +num;
|
if (num === 'ArrowLeft') {
|
||||||
if (num == 9) {
|
const prev = document.querySelector('.tab.current')
|
||||||
document
|
.previousElementSibling;
|
||||||
.querySelector('#tabs')
|
if (prev) prev.click();
|
||||||
.children[
|
} else if (num === 'ArrowRight') {
|
||||||
document.querySelector('#tabs').children.length - 2
|
const next = document.querySelector('.tab.current')
|
||||||
].click();
|
.nextElementSibling;
|
||||||
} else if (
|
if (next && !next.classList.contains('new')) next.click();
|
||||||
document.querySelector('#tabs').children[num - 1] &&
|
} else {
|
||||||
document.querySelector('#tabs').children.length > num
|
num = +num;
|
||||||
) {
|
if (num == 9) {
|
||||||
document.querySelector('#tabs').children[num - 1].click();
|
document
|
||||||
|
.querySelector('#tabs')
|
||||||
|
.children[
|
||||||
|
document.querySelector('#tabs').children.length - 2
|
||||||
|
].click();
|
||||||
|
} else if (
|
||||||
|
document.querySelector('#tabs').children[num - 1] &&
|
||||||
|
document.querySelector('#tabs').children.length > num
|
||||||
|
) {
|
||||||
|
document.querySelector('#tabs').children[num - 1].click();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,9 +316,15 @@ module.exports = (store, __exports) => {
|
|||||||
document.body.style.setProperty(style[0], style[1]);
|
document.body.style.setProperty(style[0], style[1]);
|
||||||
break;
|
break;
|
||||||
case 'enhancer:set-tab-title':
|
case 'enhancer:set-tab-title':
|
||||||
if (this.views.tabs[event.target.id]) {
|
if (this.state.tabs.get(event.target.id)) {
|
||||||
this.views.tabs[event.target.id].children[0].innerText =
|
const list = new Map(this.state.tabs);
|
||||||
event.args[0];
|
list.set(event.target.id, [
|
||||||
|
event.args[0],
|
||||||
|
this.state.tabs.get(event.target.id)[1],
|
||||||
|
]);
|
||||||
|
this.setState({
|
||||||
|
tabs: list,
|
||||||
|
});
|
||||||
const electronWindow = electron.remote.getCurrentWindow();
|
const electronWindow = electron.remote.getCurrentWindow();
|
||||||
if (
|
if (
|
||||||
event.target.id == this.views.current.id &&
|
event.target.id == this.views.current.id &&
|
||||||
@ -550,6 +587,7 @@ module.exports = (store, __exports) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderTitlebar() {
|
renderTitlebar() {
|
||||||
|
console.log('title');
|
||||||
return React.createElement(
|
return React.createElement(
|
||||||
'header',
|
'header',
|
||||||
{
|
{
|
||||||
@ -568,25 +606,24 @@ module.exports = (store, __exports) => {
|
|||||||
'div',
|
'div',
|
||||||
{ id: 'tabs' },
|
{ id: 'tabs' },
|
||||||
...[...this.state.tabs]
|
...[...this.state.tabs]
|
||||||
.filter(([id, open]) => open)
|
.filter(([id, [title, open]]) => open)
|
||||||
.map(([id, open]) =>
|
.map(([id, [title, open]]) =>
|
||||||
React.createElement(
|
React.createElement(
|
||||||
'button',
|
'button',
|
||||||
{
|
{
|
||||||
draggable: true,
|
|
||||||
className:
|
className:
|
||||||
'tab slideIn' +
|
'tab' + (id === this.views.current.id ? ' current' : ''),
|
||||||
(id === this.views.current.id ? ' current' : ''),
|
draggable: true,
|
||||||
|
'data-linked': id,
|
||||||
onClick: (e) => {
|
onClick: (e) => {
|
||||||
if (!e.target.classList.contains('close'))
|
if (!e.target.classList.contains('close'))
|
||||||
this.openTab(id);
|
this.openTab(id);
|
||||||
},
|
},
|
||||||
ref: ($tab) => {
|
ref: ($tab) => {
|
||||||
this.views.tabs[id] = $tab;
|
this.views.tabs[id] = $tab;
|
||||||
this.focusTab();
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
React.createElement('span', {}, 'notion.so'),
|
React.createElement('span', {}, title),
|
||||||
React.createElement(
|
React.createElement(
|
||||||
'span',
|
'span',
|
||||||
{
|
{
|
||||||
@ -614,7 +651,7 @@ module.exports = (store, __exports) => {
|
|||||||
}
|
}
|
||||||
renderNotionContainer() {
|
renderNotionContainer() {
|
||||||
this.views.react = Object.fromEntries(
|
this.views.react = Object.fromEntries(
|
||||||
[...this.state.tabs].map(([id, open]) => {
|
[...this.state.tabs].map(([id, [title, open]]) => {
|
||||||
return [
|
return [
|
||||||
id,
|
id,
|
||||||
this.views.react[id] ||
|
this.views.react[id] ||
|
||||||
|
@ -0,0 +1,476 @@
|
|||||||
|
/*
|
||||||
|
* notion-enhancer
|
||||||
|
* (c) 2020 dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)
|
||||||
|
* under the MIT license
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = (store, __exports) => {
|
||||||
|
const electron = require('electron'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
{ __notion } = require('../../pkg/helpers.js'),
|
||||||
|
createWindow = require(`${__notion}/app/main/createWindow.js`),
|
||||||
|
config = require(`${__notion}/app/config.js`),
|
||||||
|
notion_intl = require(`${__notion}/app/shared/notion-intl/index.js`),
|
||||||
|
localizationHelper = require(`${__notion}/app/helpers/localizationHelper.js`),
|
||||||
|
isMac = process.platform === 'darwin',
|
||||||
|
// why is it inversed? i have no idea, but for some reason this is what works
|
||||||
|
tabsEnabled = !(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {})
|
||||||
|
.enabled,
|
||||||
|
menuMessages = notion_intl.defineMessages({
|
||||||
|
fileMenuTitle: {
|
||||||
|
id: 'desktopTopbar.fileMenu.title',
|
||||||
|
defaultMessage: 'File',
|
||||||
|
},
|
||||||
|
editMenuTitle: {
|
||||||
|
id: 'desktopTopbar.editMenu.title',
|
||||||
|
defaultMessage: 'Edit',
|
||||||
|
},
|
||||||
|
viewMenuTitle: {
|
||||||
|
id: 'desktopTopbar.viewMenu.title',
|
||||||
|
defaultMessage: 'View',
|
||||||
|
},
|
||||||
|
windowMenuTitle: {
|
||||||
|
id: 'desktopTopbar.windowMenu.title',
|
||||||
|
defaultMessage: 'Window',
|
||||||
|
},
|
||||||
|
helpTitle: {
|
||||||
|
id: 'desktopTopbar.helpMenu.title',
|
||||||
|
defaultMessage: 'Help',
|
||||||
|
},
|
||||||
|
newWindow: {
|
||||||
|
id: 'desktopTopbar.fileMenu.newWindow',
|
||||||
|
defaultMessage: 'New Window',
|
||||||
|
},
|
||||||
|
closeWindow: {
|
||||||
|
id: 'desktopTopbar.fileMenu.close',
|
||||||
|
defaultMessage: 'Close Window',
|
||||||
|
},
|
||||||
|
quit: {
|
||||||
|
id: 'desktopTopbar.fileMenu.quit',
|
||||||
|
defaultMessage: 'Exit',
|
||||||
|
},
|
||||||
|
undo: {
|
||||||
|
id: 'desktopTopbar.editMenu.undo',
|
||||||
|
defaultMessage: 'Undo',
|
||||||
|
},
|
||||||
|
redo: {
|
||||||
|
id: 'desktopTopbar.editMenu.redo',
|
||||||
|
defaultMessage: 'Redo',
|
||||||
|
},
|
||||||
|
cut: {
|
||||||
|
id: 'desktopTopbar.editMenu.cut',
|
||||||
|
defaultMessage: 'Cut',
|
||||||
|
},
|
||||||
|
copy: {
|
||||||
|
id: 'desktopTopbar.editMenu.copy',
|
||||||
|
defaultMessage: 'Copy',
|
||||||
|
},
|
||||||
|
paste: {
|
||||||
|
id: 'desktopTopbar.editMenu.paste',
|
||||||
|
defaultMessage: 'Paste',
|
||||||
|
},
|
||||||
|
selectAll: {
|
||||||
|
id: 'desktopTopbar.editMenu.selectAll',
|
||||||
|
defaultMessage: 'Select All',
|
||||||
|
},
|
||||||
|
startSpeaking: {
|
||||||
|
id: 'desktopTopbar.editMenu.speech.startSpeaking',
|
||||||
|
defaultMessage: 'Start Speaking',
|
||||||
|
},
|
||||||
|
stopSpeaking: {
|
||||||
|
id: 'desktopTopbar.editMenu.speech.stopSpeaking',
|
||||||
|
defaultMessage: 'Stop Speaking',
|
||||||
|
},
|
||||||
|
speech: {
|
||||||
|
id: 'desktopTopbar.editMenu.speech',
|
||||||
|
defaultMessage: 'Speech',
|
||||||
|
},
|
||||||
|
reload: {
|
||||||
|
id: 'desktopTopbar.viewMenu.reload',
|
||||||
|
defaultMessage: 'Reload',
|
||||||
|
},
|
||||||
|
togglefullscreen: {
|
||||||
|
id: 'desktopTopbar.viewMenu.togglefullscreen',
|
||||||
|
defaultMessage: 'Toggle Full Screen',
|
||||||
|
},
|
||||||
|
toggleDevTools: {
|
||||||
|
id: 'desktopTopbar.toggleDevTools',
|
||||||
|
defaultMessage: 'Toggle Developer Tools',
|
||||||
|
},
|
||||||
|
toggleWindowDevTools: {
|
||||||
|
id: 'desktopTopbar.toggleWindowDevTools',
|
||||||
|
defaultMessage: 'Toggle Window Developer Tools',
|
||||||
|
},
|
||||||
|
maximize: {
|
||||||
|
id: 'desktopTopbar.windowMenu.maximize',
|
||||||
|
defaultMessage: 'Maximize',
|
||||||
|
},
|
||||||
|
minimize: {
|
||||||
|
id: 'desktopTopbar.windowMenu.minimize',
|
||||||
|
defaultMessage: 'Minimize',
|
||||||
|
},
|
||||||
|
zoom: {
|
||||||
|
id: 'desktopTopbar.windowMenu.zoom',
|
||||||
|
defaultMessage: 'Zoom',
|
||||||
|
},
|
||||||
|
front: {
|
||||||
|
id: 'desktopTopbar.windowMenu.front',
|
||||||
|
defaultMessage: 'Front',
|
||||||
|
},
|
||||||
|
close: {
|
||||||
|
id: 'desktopTopbar.windowMenu.close',
|
||||||
|
defaultMessage: 'Close',
|
||||||
|
},
|
||||||
|
help: {
|
||||||
|
id: 'desktopTopbar.helpMenu.openHelpAndSupport',
|
||||||
|
defaultMessage: 'Open Help & Support',
|
||||||
|
},
|
||||||
|
reset: {
|
||||||
|
id: 'desktopTopbar.appMenu.resetAppAndClearData',
|
||||||
|
defaultMessage: 'Reset App & Clear Local Data',
|
||||||
|
},
|
||||||
|
about: {
|
||||||
|
id: 'desktopTopbar.appMenu.about',
|
||||||
|
defaultMessage: 'About Notion',
|
||||||
|
},
|
||||||
|
services: {
|
||||||
|
id: 'desktopTopbar.appMenu.services',
|
||||||
|
defaultMessage: 'Services',
|
||||||
|
},
|
||||||
|
hide: { id: 'desktopTopbar.appMenu.hide', defaultMessage: 'Hide Notion' },
|
||||||
|
hideOthers: {
|
||||||
|
id: 'desktopTopbar.appMenu.hideOthers',
|
||||||
|
defaultMessage: 'Hide Others',
|
||||||
|
},
|
||||||
|
unhide: {
|
||||||
|
id: 'desktopTopbar.appMenu.unhide',
|
||||||
|
defaultMessage: 'Show All',
|
||||||
|
},
|
||||||
|
quitMac: { id: 'desktopTopbar.appMenu.quit', defaultMessage: 'Quit' },
|
||||||
|
}),
|
||||||
|
escapeAmpersand = (message) => message.replace(/&/g, '&&');
|
||||||
|
__exports.setupSystemMenu = (locale) => {
|
||||||
|
const intl = localizationHelper.createIntlShape(locale),
|
||||||
|
fileMenu = {
|
||||||
|
role: 'fileMenu',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.fileMenuTitle)),
|
||||||
|
submenu: isMac
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.newWindow)
|
||||||
|
),
|
||||||
|
accelerator: 'CmdOrCtrl+Shift+N',
|
||||||
|
click: () => createWindow.createWindow(),
|
||||||
|
},
|
||||||
|
...(tabsEnabled
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
role: 'close',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.closeWindow)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.newWindow)
|
||||||
|
),
|
||||||
|
accelerator: 'CmdOrCtrl+Shift+N',
|
||||||
|
click: () => createWindow.createWindow(),
|
||||||
|
},
|
||||||
|
...(tabsEnabled
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
role: 'quit',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.quit)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
editMenu = {
|
||||||
|
role: 'editMenu',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.editMenuTitle)),
|
||||||
|
submenu: isMac
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
role: 'undo',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.undo)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'redo',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.redo)),
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
role: 'cut',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.cut)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'copy',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.copy)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'paste',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.paste)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'selectAll',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.selectAll)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.speech)),
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
role: 'startSpeaking',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.startSpeaking)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'stopSpeaking',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.stopSpeaking)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
role: 'undo',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.undo)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'redo',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.redo)),
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
role: 'cut',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.cut)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'copy',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.copy)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'paste',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.paste)),
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
role: 'selectAll',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.selectAll)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
viewMenu = {
|
||||||
|
role: 'viewMenu',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.viewMenuTitle)),
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.reload)),
|
||||||
|
accelerator: 'CmdOrCtrl+R',
|
||||||
|
click() {
|
||||||
|
const focusedWebContents = electron.webContents.getFocusedWebContents();
|
||||||
|
if (focusedWebContents) {
|
||||||
|
if (focusedWebContents.hostWebContents) {
|
||||||
|
for (const webContentsInstance of electron.webContents.getAllWebContents()) {
|
||||||
|
if (
|
||||||
|
webContentsInstance.hostWebContents ===
|
||||||
|
focusedWebContents.hostWebContents
|
||||||
|
) {
|
||||||
|
webContentsInstance.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
focusedWebContents.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.toggleDevTools)
|
||||||
|
),
|
||||||
|
accelerator: isMac ? 'Alt+Command+I' : 'Ctrl+Shift+I',
|
||||||
|
click() {
|
||||||
|
let focusedWebContents = electron.webContents.getFocusedWebContents();
|
||||||
|
if (focusedWebContents) {
|
||||||
|
const focusedWebContentsUrl = focusedWebContents.getURL();
|
||||||
|
if (
|
||||||
|
focusedWebContentsUrl.startsWith('file://') &&
|
||||||
|
focusedWebContentsUrl.endsWith('/search.html')
|
||||||
|
) {
|
||||||
|
const notionWebviewWebContents = electron.webContents
|
||||||
|
.getAllWebContents()
|
||||||
|
.find(
|
||||||
|
(webContentsInstance) =>
|
||||||
|
webContentsInstance.hostWebContents ===
|
||||||
|
focusedWebContents.hostWebContents &&
|
||||||
|
webContentsInstance !== focusedWebContents
|
||||||
|
);
|
||||||
|
if (notionWebviewWebContents) {
|
||||||
|
focusedWebContents = notionWebviewWebContents;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
focusedWebContents.toggleDevTools();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.toggleWindowDevTools)
|
||||||
|
),
|
||||||
|
accelerator: isMac ? 'Shift+Alt+Command+I' : 'Alt+Ctrl+Shift+I',
|
||||||
|
visible: false,
|
||||||
|
click(menuItem, focusedWindow) {
|
||||||
|
if (focusedWindow) {
|
||||||
|
focusedWindow.webContents.toggleDevTools();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
role: 'togglefullscreen',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.togglefullscreen)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
windowMenu = {
|
||||||
|
role: 'windowMenu',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.windowMenuTitle)
|
||||||
|
),
|
||||||
|
submenu: isMac
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
role: 'minimize',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.minimize)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'zoom',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.zoom)),
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
role: 'front',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.front)),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
role: 'minimize',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.minimize)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.maximize)
|
||||||
|
),
|
||||||
|
click(item, focusedWindow) {
|
||||||
|
if (focusedWindow) {
|
||||||
|
if (focusedWindow.isMaximized()) {
|
||||||
|
focusedWindow.unmaximize();
|
||||||
|
} else {
|
||||||
|
focusedWindow.maximize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
...(tabsEnabled
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
role: 'close',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.close)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
helpMenu = {
|
||||||
|
role: 'help',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.helpTitle)),
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.help)),
|
||||||
|
click() {
|
||||||
|
electron.shell.openExternal(config.default.baseURL + '/help');
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
appMenu = {
|
||||||
|
role: 'appMenu',
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
role: 'about',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.about)),
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.reset)),
|
||||||
|
async click(item, focusedWindow) {
|
||||||
|
await fs.remove(electron.app.getPath('userData'));
|
||||||
|
electron.app.relaunch();
|
||||||
|
electron.app.exit();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
role: 'services',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.services)),
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
role: 'hide',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.hide)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'hideOthers',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.hideOthers)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'unhide',
|
||||||
|
label: escapeAmpersand(intl.formatMessage(menuMessages.unhide)),
|
||||||
|
},
|
||||||
|
...(tabsEnabled
|
||||||
|
? [
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
role: 'quit',
|
||||||
|
label: escapeAmpersand(
|
||||||
|
intl.formatMessage(menuMessages.quitMac)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
template = [fileMenu, editMenu, viewMenu, windowMenu, helpMenu];
|
||||||
|
if (isMac) template.unshift(appMenu);
|
||||||
|
const menu = electron.Menu.buildFromTemplate(template);
|
||||||
|
electron.Menu.setApplicationMenu(menu);
|
||||||
|
};
|
||||||
|
};
|
@ -87,7 +87,7 @@ module.exports = (store, __exports) => {
|
|||||||
/\\/g,
|
/\\/g,
|
||||||
'/'
|
'/'
|
||||||
)}/app/node_modules/electron-window-state/index.js`)({
|
)}/app/node_modules/electron-window-state/index.js`)({
|
||||||
file: 'enhancerMenu.windowState.json',
|
file: 'menu.windowstate.json',
|
||||||
path: helpers.__data,
|
path: helpers.__data,
|
||||||
defaultWidth: 275,
|
defaultWidth: 275,
|
||||||
defaultHeight: 600,
|
defaultHeight: 600,
|
||||||
@ -172,7 +172,7 @@ module.exports = (store, __exports) => {
|
|||||||
type: 'normal',
|
type: 'normal',
|
||||||
label: 'New Window',
|
label: 'New Window',
|
||||||
click: () => {
|
click: () => {
|
||||||
require('./create.js')(
|
require('./createWindow.js')(
|
||||||
store,
|
store,
|
||||||
require(path.resolve(
|
require(path.resolve(
|
||||||
`${helpers.__notion}/app/main/createWindow.js`
|
`${helpers.__notion}/app/main/createWindow.js`
|
||||||
|
@ -19,9 +19,19 @@ module.exports = {
|
|||||||
options: [
|
options: [
|
||||||
{
|
{
|
||||||
key: 'select_modifier',
|
key: 'select_modifier',
|
||||||
label: 'tab select modifier (key+1, +2, +3, ... +9):',
|
label:
|
||||||
|
'tab select modifier (key+1, +2, +3, ... +9 and key+left/right arrows):',
|
||||||
type: 'select',
|
type: 'select',
|
||||||
value: ['Alt', 'Command', 'Control', 'Shift', 'Super'],
|
value: [
|
||||||
|
'Alt',
|
||||||
|
'Command',
|
||||||
|
'Control',
|
||||||
|
'Super',
|
||||||
|
'Alt+Shift',
|
||||||
|
'Command+Shift',
|
||||||
|
'Control+Shift',
|
||||||
|
'Super+Shift',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'new_tab',
|
key: 'new_tab',
|
||||||
|
Loading…
Reference in New Issue
Block a user