Add menu option for copying supported images in lightbox (#4614)

This commit is contained in:
Vin Howe 2020-11-02 17:47:46 -07:00 committed by GitHub
parent 2373209834
commit 526ab4fe29
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 15 deletions

View file

@ -163,6 +163,10 @@
"message": "Copy Link", "message": "Copy Link",
"description": "Shown in the context menu for a link to indicate that the user can copy the link" "description": "Shown in the context menu for a link to indicate that the user can copy the link"
}, },
"contextMenuCopyImage": {
"message": "Copy Image",
"description": "Shown in the context menu for an image to indicate that the user can copy the image"
},
"contextMenuNoSuggestions": { "contextMenuNoSuggestions": {
"message": "No Suggestions", "message": "No Suggestions",
"description": "Shown in the context menu for a misspelled word to indicate that there are no suggestions to replace the misspelled word" "description": "Shown in the context menu for a misspelled word to indicate that there are no suggestions to replace the misspelled word"

View file

@ -1,8 +1,9 @@
/* eslint-disable strict */ /* eslint-disable strict */
const { Menu, clipboard } = require('electron'); const { Menu, clipboard, nativeImage } = require('electron');
const osLocale = require('os-locale'); const osLocale = require('os-locale');
const { uniq } = require('lodash'); const { uniq } = require('lodash');
const url = require('url');
function getLanguages(userLocale, availableLocales) { function getLanguages(userLocale, availableLocales) {
const baseLocale = userLocale.split('-')[0]; const baseLocale = userLocale.split('-')[0];
@ -37,7 +38,10 @@ exports.setup = (browserWindow, messages) => {
const { editFlags } = params; const { editFlags } = params;
const isMisspelled = Boolean(params.misspelledWord); const isMisspelled = Boolean(params.misspelledWord);
const isLink = Boolean(params.linkURL); const isLink = Boolean(params.linkURL);
const showMenu = params.isEditable || editFlags.canCopy || isLink; const isImage =
params.mediaType === 'image' && params.hasImageContents && params.srcURL;
const showMenu =
params.isEditable || editFlags.canCopy || isLink || isImage;
// Popup editor menu // Popup editor menu
if (showMenu) { if (showMenu) {
@ -79,25 +83,43 @@ exports.setup = (browserWindow, messages) => {
} }
} }
if (editFlags.canCopy || isLink) { if (editFlags.canCopy || isLink || isImage) {
template.push({ let click;
label: isLink let label;
? messages.contextMenuCopyLink.message
: messages.editMenuCopy.message, if (isLink) {
role: isLink ? undefined : 'copy', click = () => {
click: isLink
? () => {
clipboard.writeText(params.linkURL); clipboard.writeText(params.linkURL);
};
label = messages.contextMenuCopyLink.message;
} else if (isImage) {
click = () => {
if (url.parse(params.srcURL).protocol !== 'file:') {
return;
} }
: undefined,
const image = nativeImage.createFromPath(
url.fileURLToPath(params.srcURL)
);
clipboard.writeImage(image);
};
label = messages.contextMenuCopyImage.message;
} else {
label = messages.editMenuCopy.message;
}
template.push({
label,
role: isLink || isImage ? undefined : 'copy',
click,
}); });
} }
if (editFlags.canPaste) { if (editFlags.canPaste && !isImage) {
template.push({ label: messages.editMenuPaste.message, role: 'paste' }); template.push({ label: messages.editMenuPaste.message, role: 'paste' });
} }
if (editFlags.canPaste) { if (editFlags.canPaste && !isImage) {
template.push({ template.push({
label: messages.editMenuPasteAndMatchStyle.message, label: messages.editMenuPasteAndMatchStyle.message,
role: 'pasteAndMatchStyle', role: 'pasteAndMatchStyle',

View file

@ -544,7 +544,8 @@ try {
); );
const link = e.target.closest('a'); const link = e.target.closest('a');
const selection = Boolean(window.getSelection().toString()); const selection = Boolean(window.getSelection().toString());
if (!editable && !selection && !link) { const image = e.target.closest('.module-lightbox img');
if (!editable && !selection && !link && !image) {
e.preventDefault(); e.preventDefault();
} }
}); });

View file

@ -376,6 +376,7 @@ export class Lightbox extends React.Component<Props, State> {
alt={i18n('lightboxImageAlt')} alt={i18n('lightboxImageAlt')}
style={styles.img} style={styles.img}
src={objectURL} src={objectURL}
onContextMenu={this.onContextMenu}
/> />
</button> </button>
); );
@ -415,6 +416,15 @@ export class Lightbox extends React.Component<Props, State> {
); );
}; };
private readonly onContextMenu = (event: React.MouseEvent<HTMLImageElement>) => {
const { contentType } = this.props;
// These are the only image types supported by Electron's NativeImage
if (contentType !== "image/png" && contentType !== "image/jpg") {
event?.preventDefault();
}
}
private readonly onClose = () => { private readonly onClose = () => {
const { close } = this.props; const { close } = this.props;
if (!close) { if (!close) {