aboutsummaryrefslogtreecommitdiffstats
path: root/src/webview/contextMenu.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/webview/contextMenu.js')
-rw-r--r--src/webview/contextMenu.js67
1 files changed, 63 insertions, 4 deletions
diff --git a/src/webview/contextMenu.js b/src/webview/contextMenu.js
index ad156128c..bd099987d 100644
--- a/src/webview/contextMenu.js
+++ b/src/webview/contextMenu.js
@@ -1,9 +1,12 @@
1// This is heavily based on https://github.com/sindresorhus/electron-context-menu 1// This is heavily based on https://github.com/sindresorhus/electron-context-menu
2// ❤ @sindresorhus 2// ❤ @sindresorhus
3 3
4import { clipboard, remote, ipcRenderer, shell } from 'electron'; 4import {
5 clipboard, remote, ipcRenderer, shell,
6} from 'electron';
5 7
6import { isDevMode, isMac } from '../environment'; 8import { isDevMode, isMac } from '../environment';
9import { SPELLCHECKER_LOCALES } from '../i18n/languages';
7 10
8const debug = require('debug')('Franz:contextMenu'); 11const debug = require('debug')('Franz:contextMenu');
9 12
@@ -21,7 +24,7 @@ function delUnusedElements(menuTpl) {
21 }); 24 });
22} 25}
23 26
24const buildMenuTpl = (props, suggestions) => { 27const buildMenuTpl = (props, suggestions, isSpellcheckEnabled, defaultSpellcheckerLanguage, spellcheckerLanguage) => {
25 const { editFlags } = props; 28 const { editFlags } = props;
26 const textSelection = props.selectionText.trim(); 29 const textSelection = props.selectionText.trim();
27 const hasText = textSelection.length > 0; 30 const hasText = textSelection.length > 0;
@@ -190,6 +193,54 @@ const buildMenuTpl = (props, suggestions) => {
190 }); 193 });
191 } 194 }
192 195
196 const spellcheckingLanguages = [];
197 Object.keys(SPELLCHECKER_LOCALES).sort(Intl.Collator().compare).forEach((key) => {
198 spellcheckingLanguages.push({
199 id: `lang-${key}`,
200 label: SPELLCHECKER_LOCALES[key],
201 type: 'radio',
202 checked: spellcheckerLanguage === key,
203 click() {
204 debug('Setting service spellchecker to', key);
205 ipcRenderer.sendToHost('set-service-spellchecker-language', key);
206 },
207 });
208 });
209
210 console.log('isSpellcheckEnabled', isSpellcheckEnabled);
211
212 menuTpl.push({
213 type: 'separator',
214 }, {
215 id: 'spellchecker',
216 label: 'Spell Checking',
217 visible: isSpellcheckEnabled,
218 submenu: [
219 {
220 id: 'spellchecker',
221 label: 'Available Languages',
222 enabled: false,
223 }, {
224 type: 'separator',
225 },
226 {
227 id: 'resetToDefault',
228 label: `Reset to system default (${SPELLCHECKER_LOCALES[defaultSpellcheckerLanguage]})`,
229 type: 'radio',
230 visible: defaultSpellcheckerLanguage !== spellcheckerLanguage,
231 click() {
232 debug('Resetting service spellchecker to system default');
233 ipcRenderer.sendToHost('set-service-spellchecker-language', 'reset');
234 },
235 },
236 {
237 type: 'separator',
238 visible: defaultSpellcheckerLanguage !== spellcheckerLanguage,
239 },
240 ...spellcheckingLanguages],
241 });
242
243
193 if (isDevMode) { 244 if (isDevMode) {
194 menuTpl.push({ 245 menuTpl.push({
195 type: 'separator', 246 type: 'separator',
@@ -205,7 +256,7 @@ const buildMenuTpl = (props, suggestions) => {
205 return delUnusedElements(menuTpl); 256 return delUnusedElements(menuTpl);
206}; 257};
207 258
208export default function contextMenu(spellcheckProvider) { 259export default function contextMenu(spellcheckProvider, isSpellcheckEnabled, getDefaultSpellcheckerLanguage, getSpellcheckerLanguage) {
209 webContents.on('context-menu', (e, props) => { 260 webContents.on('context-menu', (e, props) => {
210 e.preventDefault(); 261 e.preventDefault();
211 262
@@ -216,7 +267,15 @@ export default function contextMenu(spellcheckProvider) {
216 debug('Suggestions', suggestions); 267 debug('Suggestions', suggestions);
217 } 268 }
218 269
219 const menu = Menu.buildFromTemplate(buildMenuTpl(props, suggestions.slice(0, 5))); 270 const menu = Menu.buildFromTemplate(
271 buildMenuTpl(
272 props,
273 suggestions.slice(0, 5),
274 isSpellcheckEnabled(),
275 getDefaultSpellcheckerLanguage(),
276 getSpellcheckerLanguage(),
277 ),
278 );
220 279
221 menu.popup(remote.getCurrentWindow()); 280 menu.popup(remote.getCurrentWindow());
222 }); 281 });