TAB4IDC-InterventionDemo / js /interactive_grid.js
pooyanrg's picture
initial commit
ad4721b
raw
history blame
5.18 kB
const gridSize = 14;
var cellSize = null;
var inputImage = null;
var image = null;
var canvas = null;
var ctx = null;
var canvasBg = null;
let grid = new Array(gridSize).fill(null).map(() => new Array(gridSize).fill(false));
var isInitialized = false;
let selectedCells = 0;
function createGrid() {
console.log('createGrid')
for (let i = 0; i < 196; i++) {
const div = document.createElement('div');
div.classList.add('checkbox');
div.innerHTML = '<input type="checkbox">';
grid.appendChild(div);
}
}
function loadImage(event) {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = function (e) {
image.src = e.target.result;
}
reader.readAsDataURL(file);
}
function handleMouseDown(event) {
// console.log("handleMouseDown");
}
function handleMouseMove(event) {
// console.log("handleMouseMove");
}
function handleMouseUp(event) {
// console.log("handleMouseUp");
}
function handleMouseLeave(event) {
// console.log("handleMouseLeave");
}
function drawGrid() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawBackground();
for (let row = 0; row < gridSize; row++) {
for (let col = 0; col < gridSize; col++) {
ctx.beginPath();
ctx.rect(col * cellSize, row * cellSize, cellSize, cellSize);
ctx.strokeStyle = 'black';
ctx.lineWidth = 2;
ctx.stroke();
if (grid[row][col]) {
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(col * cellSize, row * cellSize, cellSize, cellSize);
}
}
}
}
function initializeEditor() {
console.log("initializeEditor");
if (isInitialized) {
return;
}
isInitialized = true;
image = document.getElementById('image');
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
// Add click event listener to canvas
canvas.addEventListener('mousedown', handleMouseDown);
canvas.addEventListener('mousemove', handleMouseMove);
canvas.addEventListener('mouseup', handleMouseUp);
canvas.addEventListener('mouseleave', handleMouseLeave);
cellSize = canvas.width / gridSize;
canvas.addEventListener('click', (event) => {
const rect = canvas.getBoundingClientRect();
const scaleX = canvas.width / rect.width;
const scaleY = canvas.height / rect.height;
const x = (event.clientX - rect.left) * scaleX;
const y = (event.clientY - rect.top) * scaleY;
const row = Math.floor(y / cellSize);
const col = Math.floor(x / cellSize);
// If the cell is already selected, it's always allowed to deselect it
if (grid[row][col]) {
grid[row][col] = false;
selectedCells--; // Decrement the selected cell count
} else {
// Only select a new cell if less than 50 cells are already selected
if (selectedCells < 50) {
grid[row][col] = true;
selectedCells++; // Increment the selected cell count
}
}
drawGrid();
});
drawGrid();
}
function drawBackground() {
if (canvasBg != null) {
const canvasWidth = canvas.width;
const canvasHeight = canvas.height;
const bgWidth = canvasBg.width;
const bgHeight = canvasBg.height;
const scaleX = canvasWidth / bgWidth;
const scaleY = canvasHeight / bgHeight;
const scale = Math.max(scaleX, scaleY);
const newWidth = bgWidth * scale;
const newHeight = bgHeight * scale;
const xOffset = (canvasWidth - newWidth) / 2;
const yOffset = (canvasHeight - newHeight) / 2;
ctx.drawImage(canvasBg, 0, 0, bgWidth, bgHeight, xOffset, yOffset, newWidth, newHeight);
}
}
function importBackground(image) {
if (image == null) {
canvasBg = null;
drawGrid();
return;
}
let m = new Image();
m.src = image;
m.onload = function () {
canvasBg = m;
drawGrid();
}
}
function read_js_Data() {
console.log("read_js_Data");
console.log("read_js_Data");
console.log("read_js_Data");
console.log("read_js_Data");
console.log("read_js_Data");
return grid;
}
function set_grid_from_data(data) {
if (data.length !== gridSize || data[0].length !== gridSize) {
throw new Error('Invalid data dimensions. Expected ' + gridSize + 'x' + gridSize);
}
selectedCells = 0; // Reset the selected cell count
for (let row = 0; row < gridSize; row++) {
for (let col = 0; col < gridSize; col++) {
grid[row][col] = data[row][col];
if (grid[row][col]) {
selectedCells++; // Count the number of initially selected cells
}
}
}
drawGrid();
}
function clear_grid() {
console.log("clearGrid");
for (let row = 0; row < gridSize; row++) {
for (let col = 0; col < gridSize; col++) {
grid[row][col] = false;
}
}
selectedCells = 0; // Reset the selected cell count
drawGrid();
}