From f4f391fb13b8e198bbc29afa5a0c775a988883c5 Mon Sep 17 00:00:00 2001 From: viliusle Date: Tue, 5 Jan 2021 23:32:40 +0200 Subject: [PATCH] #205 - basic support for copying layer to clipboard --- src/js/config-menu.js | 5 +++ src/js/modules/edit/copy.js | 80 +++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 src/js/modules/edit/copy.js diff --git a/src/js/config-menu.js b/src/js/config-menu.js index 6dea29e..025e25a 100644 --- a/src/js/config-menu.js +++ b/src/js/config-menu.js @@ -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', diff --git a/src/js/modules/edit/copy.js b/src/js/modules/edit/copy.js new file mode 100644 index 0000000..ae44ea4 --- /dev/null +++ b/src/js/modules/edit/copy.js @@ -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;