diff options
Diffstat (limited to 'src/webview/contextMenu.js')
-rw-r--r-- | src/webview/contextMenu.js | 67 |
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 | ||
4 | import { clipboard, remote, ipcRenderer, shell } from 'electron'; | 4 | import { |
5 | clipboard, remote, ipcRenderer, shell, | ||
6 | } from 'electron'; | ||
5 | 7 | ||
6 | import { isDevMode, isMac } from '../environment'; | 8 | import { isDevMode, isMac } from '../environment'; |
9 | import { SPELLCHECKER_LOCALES } from '../i18n/languages'; | ||
7 | 10 | ||
8 | const debug = require('debug')('Franz:contextMenu'); | 11 | const debug = require('debug')('Franz:contextMenu'); |
9 | 12 | ||
@@ -21,7 +24,7 @@ function delUnusedElements(menuTpl) { | |||
21 | }); | 24 | }); |
22 | } | 25 | } |
23 | 26 | ||
24 | const buildMenuTpl = (props, suggestions) => { | 27 | const 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 | ||
208 | export default function contextMenu(spellcheckProvider) { | 259 | export 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 | }); |