Files
pluggable-web-controls/DEPRECATED/plugin_display_png_v1a.js

184 lines
5.9 KiB
JavaScript

var isEraseMode = false;
var activeSelection = null;
function hookupPageDisplayPng() {
const canvas = new fabric.Canvas('canvas');
const symbolSelect = document.getElementById('symbolSelect');
const colorPicker = document.getElementById('colorPicker');
const symbols = ['Orange Arrow.png'];
// Populate symbol select
symbols.forEach(symbol => {
const option = document.createElement('option');
option.value = symbol;
option.textContent = symbol.replace('.png', '');
symbolSelect.appendChild(option);
});
// Image upload
document.getElementById('imageUpload').addEventListener('change', function(e) {
const file = e.target.files[0];
const reader = new FileReader();
reader.onload = function(f) {
fabric.Image.fromURL(f.target.result, function(img) {
canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas), {
scaleX: canvas.width / img.width,
scaleY: canvas.height / img.height
});
});
};
reader.readAsDataURL(file);
});
// Add arrow
document.getElementById('addArrow').addEventListener('click', function() {
const arrow = new fabric.Path('M 0 0 L 200 100', {
fill: colorPicker.value,
stroke: colorPicker.value,
strokeWidth: 2,
left: 100,
top: 100
});
canvas.add(arrow);
});
// Add textbox
document.getElementById('addTextbox').addEventListener('click', function() {
const textbox = new fabric.Textbox('Type here', {
left: 100,
top: 100,
width: 150,
fontSize: 20,
fill: colorPicker.value
});
canvas.add(textbox);
});
// Add symbol
symbolSelect.addEventListener('change', function() {
if (this.value) {
fabric.Image.fromURL(`symbols/${this.value}`, function(img) {
img.set({
left: 100,
top: 100,
scaleX: 0.5,
scaleY: 0.5
});
canvas.add(img);
});
this.value = ''; // Reset select
}
});
// Color change for selected object
colorPicker.addEventListener('change', function() {
const activeObject = canvas.getActiveObject();
if (activeObject) {
if (activeObject.type === 'textbox') {
activeObject.set('fill', this.value);
} else {
activeObject.set('fill', this.value);
activeObject.set('stroke', this.value);
}
canvas.renderAll();
}
});
// Erase mode
document.getElementById('eraseMode').addEventListener('click', function() {
isEraseMode = !isEraseMode;
this.textContent = isEraseMode ? 'Exit Erase Mode' : 'Erase Mode';
if (isEraseMode) {
// Delete any pre-selected elements when entering erase mode
deleteSelectedObjects(canvas);
// Disable selection and drawing
canvas.selection = false;
canvas.isDrawingMode = false;
// Change cursor to indicate erase mode
canvas.defaultCursor = 'crosshair';
canvas.hoverCursor = 'crosshair';
} else {
// Re-enable selection when exiting erase mode
canvas.selection = true;
// Reset cursors
canvas.defaultCursor = 'default';
canvas.hoverCursor = 'move';
}
});
// Object selection in erase mode
canvas.on('selection:created', function(options) {
if (isEraseMode) {
deleteSelectedObjects(canvas);
}
});
canvas.on('mouse:down', function(options) {
if (isEraseMode && options.target) {
canvas.remove(options.target);
canvas.requestRenderAll();
}
});
// Prevent dragging in erase mode
canvas.on('object:moving', function(options) {
if (isEraseMode) {
options.target.setCoords();
canvas.remove(options.target);
canvas.requestRenderAll();
}
});
// Save image
document.getElementById('saveImage').addEventListener('click', function() {
if (confirm("Please ensure there is no sensitive information or PII in your annotations. Do you want to proceed with saving?")) {
const dataURL = canvas.toDataURL({
format: 'png',
quality: 1
});
console.log("Base64 string:", dataURL);
// Here you would typically send this dataURL to your server or database
alert("Image saved as Base64 string. Check the console for the output.");
}
});
/*
// Object selection
canvas.on('selection:created', function(options) {
if (isEraseMode && options.target) {
canvas.remove(options.target);
} else if (options.target) {
if (options.target.type === 'textbox') {
colorPicker.value = options.target.fill;
} else {
colorPicker.value = options.target.stroke || options.target.fill;
}
}
});
*/
}
function deleteSelectedObjects(canvas) {
// const canvas = new fabric.Canvas('canvas');
const activeObject = canvas.getActiveObject();
if (activeObject) {
if (activeObject.type === 'activeSelection') {
// If it's a multi-selection, remove all selected objects
activeObject.forEachObject(function(obj) {
canvas.remove(obj);
});
canvas.discardActiveObject();
} else {
// If it's a single object, just remove it
canvas.remove(activeObject);
}
canvas.requestRenderAll();
}
}