#205 - basic support for copying layer to clipboard

This commit is contained in:
viliusle 2021-01-05 23:32:40 +02:00
parent 5ccd056cde
commit f4f391fb13
2 changed files with 85 additions and 0 deletions

View File

@ -108,6 +108,11 @@ const menuDefinition = [
name: 'Copy Selection',
target: 'layer/new.new_selection'
},
{
name: 'Copy to Clipboard',
shortcut: 'Ctrl+C',
target: 'edit/copy.copy_to_clipboard'
},
{
name: 'Paste',
shortcut: 'Ctrl+V',

View File

@ -0,0 +1,80 @@
import config from "../../config";
import Base_layers_class from './../../core/base-layers.js';
import Helper_class from './../../libs/helpers.js';
import alertify from './../../../../node_modules/alertifyjs/build/alertify.min.js';
var instance = null;
class Copy_class {
constructor() {
//singleton
if (instance) {
return instance;
}
instance = this;
this.Base_layers = new Base_layers_class();
this.Helper = new Helper_class();
//events
document.addEventListener('keydown', (event) => {
var code = event.key.toLowerCase();
var ctrlDown = event.ctrlKey || event.metaKey;
if (this.Helper.is_input(event.target))
return;
if (code == "c" && ctrlDown == true) {
//copy to clipboard
this.copy_to_clipboard();
}
}, false);
}
async copy_to_clipboard(){
var _this = this;
const canWriteToClipboard = await this.askWritePermission();
if (canWriteToClipboard) {
//get data - current layer
var canvas = this.Base_layers.convert_layer_to_canvas();
var ctx = canvas.getContext("2d");
if (config.TRANSPARENCY == false) {
//add white background
ctx.globalCompositeOperation = 'destination-over';
this.fillCanvasBackground(ctx, '#ffffff');
ctx.globalCompositeOperation = 'source-over';
}
//save using lib
canvas.toBlob(function (blob) {
_this.setToClipboard(blob);
});
}
else{
alertify.error('Missing permissions to write to Clipboard.cc');
}
}
async setToClipboard(blob) {
const data = [new ClipboardItem({ [blob.type]: blob })];
await navigator.clipboard.write(data);
}
async askWritePermission() {
try {
// The clipboard-write permission is granted automatically to pages
// when they are the active tab. So it's not required, but it's more safe.
const { state } = await navigator.permissions.query({ name: 'clipboard-write' })
return state === 'granted';
}
catch (error) {
// Browser compatibility / Security error (ONLY HTTPS) ...
return false;
}
}
}
export default Copy_class;