Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add bulk deletion variant of eraser #41

Open
wants to merge 28 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
d8fa4ca
Added 2D.js
rdbeach Apr 25, 2020
0b6d62f
prevent type coersions and replace new Array() with []
finnboeger Apr 25, 2020
3e3dcda
Added tool to delete multiple elements at once as alternative functio…
finnboeger Apr 26, 2020
48f8b89
Change var to let or const, prevent type coersions, replace jquery wi…
finnboeger Apr 26, 2020
f236c79
Improve detection of contained shapes.
finnboeger Apr 25, 2020
6177d71
let eraser ignore layers for now
finnboeger Apr 25, 2020
2e7d9ba
fix icons
finnboeger Apr 26, 2020
614a3c0
toggle name
finnboeger Apr 26, 2020
cba3ea0
ignore layers on mobile as well
finnboeger Apr 26, 2020
dc54c13
Handle bulk delete on the server side
rdbeach Apr 26, 2020
557c9d2
remove 2d.js
finnboeger Apr 26, 2020
8b8529a
search for objects inside a circle where the current pencil size is t…
finnboeger Apr 26, 2020
bd6b5f3
Merge remote-tracking branch 'og/master' into tool/eraser
finnboeger Apr 28, 2020
d2242bc
move multi eraser to seperate tool
finnboeger Apr 28, 2020
84b2c83
change let and const back to var
finnboeger Apr 28, 2020
8f5d4f4
created new icons
finnboeger Apr 28, 2020
7253cb5
correct search area size. Fixes #8
finnboeger Apr 28, 2020
8933bb3
Merge branch 'lovasoa/whitebophir' into tool/eraser
finnboeger May 1, 2020
a772280
remove conflict leftover
finnboeger May 1, 2020
b8a92a4
Merge branch 'lovasoa/whitebophir' into tool/eraser
finnboeger May 2, 2020
2691693
added todo
finnboeger May 2, 2020
83137a0
fix multi eraser
finnboeger May 2, 2020
bdb0fd2
updated todo / problem description
finnboeger May 3, 2020
19b564b
Merge branch 'lovasoa/whitebophir' into tool/eraser
finnboeger May 5, 2020
e905052
fix toggling for eraser
finnboeger May 5, 2020
78f748f
remove debug logging
finnboeger May 6, 2020
1b3ef74
only delete first shape encountered
finnboeger May 6, 2020
3437bc4
start search in the middle of the cursor and then gradually move outw…
finnboeger May 6, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions client-data/board.html
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
<script src="../tools/ellipse/ellipse.js"></script>
<script src="../tools/text/text.js"></script>
<script src="../tools/eraser/eraser.js"></script>
<script src="../tools/multi-eraser/multi-eraser.js"></script>
<script src="../tools/hand/hand.js"></script>
<script src="../tools/grid/grid.js"></script>
<script src="../tools/zoom/zoom.js"></script>
Expand Down
110 changes: 92 additions & 18 deletions client-data/tools/eraser/eraser.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,29 @@

var erasing = false;

var currShape = null;
var curTool = "click";
var icons = ["tools/eraser/icon-click.svg", "tools/eraser/icon-drag.svg",];
var toolNames = ["Remove single shape", "Remove all contacted shapes"];

var msg = {
"type": "delete",
"id": null,
"x": 0,
"y": 0
};

function startErasing(x, y, evt) {
//Prevent the press from being interpreted by the browser
evt.preventDefault();

erasing = true;
erase(x, y, evt);
}

var msg = {
"type": "delete",
"id": ""
};
function stopErasing(x, y) {
erasing = false;
}

function inDrawingArea(elem) {
return Tools.drawingArea.contains(elem);
Expand All @@ -53,45 +65,107 @@
var touch = evt.touches[0];
target = document.elementFromPoint(touch.clientX, touch.clientY);
}
if (erasing && target !== Tools.svg && target !== Tools.drawingArea && inDrawingArea(target)) {
msg.id = target.id;
Tools.drawAndSend(msg);
}
}
if (erasing) {
// get points all within a circle of a given radius
// https://stackoverflow.com/a/26802146
// TODO: This can be very slow if dragging is enabled, a large tool size has been chosen and the cursor
// is inside the bounding box of a svg path or the board is zommed out and the cursor is allowed to
// cover a large distance.
var radius = Tools.getSize()/2;

function stopErasing() {
erasing = false;
var erased = scanForObject(x, y, target, 0,0);
for (var i = 0; i <= radius; i++) {
for (var dx = 0; dx <= i; dx++) {
if (erased) break;
var h = Math.sqrt(i*i - dx * dx) | 0;
for (var dy = 1; dy <= h; dy++) {
if (Math.sqrt(dx * dx + dy * dy) > (i - 1)) {
if (scanForObject(x, y, target, dx, dy)
|| scanForObject(x, y, target, dy, -dx)
|| scanForObject(x, y, target, -dx, -dy)
|| scanForObject(x, y, target, -dy, dx)) {
erased = true;
break;
}
}
}
}
}

if (curTool === "click") {
erasing = false;
}
}
}

function draw(data) {
var elem;
switch (data.type) {
//TODO: add the ability to erase only some points in a line
case "delete":
elem = svg.getElementById(data.id);
if (elem === null) console.error("Eraser: Tried to delete an element that does not exist.");
else Tools.drawingArea.removeChild(elem);
if (Array.isArray(data.id)) {
for(var i = 0; i<data.id.length; i++){
elem = svg.getElementById(data.id[i]);
if (elem !== null){ //console.error("Eraser: Tried to delete an element that does not exist.");
Tools.drawingArea.removeChild(elem);
}
}
} else {
elem = svg.getElementById(data.id);
if (elem === null) return; //console.error("Eraser: Tried to delete an element that does not exist.");
Tools.drawingArea.removeChild(elem);
}
break;
default:
console.error("Eraser: 'delete' instruction with unknown type. ", data);
break;
}
}

function scanForObject(x,y,target, i,j){
target=document.elementFromPoint((x+i)*Tools.scale-document.documentElement.scrollLeft, (y+j)*Tools.scale-document.documentElement.scrollTop);

if (target && target !== Tools.svg && target !== Tools.drawingArea && inDrawingArea(target)) {
msg.id = target.id;
msg.x = x+i;
msg.y = y+j;
msg.target = target;
var elem = svg.getElementById(msg.id);
if (elem !== null) Tools.drawAndSend(msg);
return true;
}
return false;
}

var svg = Tools.svg;

Tools.add({ //The new tool
"name": "Eraser",
function toggle(){
var index = 0;
if (curTool === "click") {
curTool = "drag";
index = 1;
} else {
curTool = "click";
}
document.getElementById("toolID-" + eraserTool.name).getElementsByClassName("tool-icon")[0].src = icons[index];
document.getElementById("toolID-" + eraserTool.name).getElementsByClassName("tool-name")[0].textContent = toolNames[index];
}


var eraserTool = { //The new tool
"name": toolNames[0],
"shortcut": "e",
"toggle": toggle,
"listeners": {
"press": startErasing,
"move": erase,
"release": stopErasing,
},
"draw": draw,
"icon": "tools/eraser/icon.svg",
"icon": icons[0],
"mouseCursor": "crosshair",
"showMarker": true,
});
};
Tools.add(eraserTool);

})(); //End of code isolation
94 changes: 94 additions & 0 deletions client-data/tools/eraser/icon-click.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
94 changes: 94 additions & 0 deletions client-data/tools/eraser/icon-drag.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 0 additions & 7 deletions client-data/tools/eraser/icon.svg

This file was deleted.