|
|
|
|
@ -104,26 +104,39 @@ function generateShape(element) {
@@ -104,26 +104,39 @@ function generateShape(element) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function setSelection(selection) { |
|
|
|
|
// Fix up negative width and height when dragging from right to left
|
|
|
|
|
// Note: it's a lot harder to do on mouse move because of rounding issues
|
|
|
|
|
let { x, y, width, height } = selection; |
|
|
|
|
if (width < 0) { |
|
|
|
|
x += width; |
|
|
|
|
width = -width; |
|
|
|
|
} |
|
|
|
|
if (height < 0) { |
|
|
|
|
y += height; |
|
|
|
|
height = -height; |
|
|
|
|
} |
|
|
|
|
// If the element is created from right to left, the width is going to be negative
|
|
|
|
|
// This set of functions retrieves the absolute position of the 4 points.
|
|
|
|
|
// We can't just always normalize it since we need to remember the fact that an arrow
|
|
|
|
|
// is pointing left or right.
|
|
|
|
|
function getElementAbsoluteX1(element) { |
|
|
|
|
return element.width >= 0 ? element.x : element.x + element.width; |
|
|
|
|
} |
|
|
|
|
function getElementAbsoluteX2(element) { |
|
|
|
|
return element.width >= 0 ? element.x + element.width : element.x; |
|
|
|
|
} |
|
|
|
|
function getElementAbsoluteY1(element) { |
|
|
|
|
return element.height >= 0 ? element.y : element.y + element.height; |
|
|
|
|
} |
|
|
|
|
function getElementAbsoluteY2(element) { |
|
|
|
|
return element.height >= 0 ? element.y + element.height : element.y; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function setSelection(selection) { |
|
|
|
|
const selectionX1 = getElementAbsoluteX1(selection); |
|
|
|
|
const selectionX2 = getElementAbsoluteX2(selection); |
|
|
|
|
const selectionY1 = getElementAbsoluteY1(selection); |
|
|
|
|
const selectionY2 = getElementAbsoluteY2(selection); |
|
|
|
|
elements.forEach(element => { |
|
|
|
|
const elementX1 = getElementAbsoluteX1(element); |
|
|
|
|
const elementX2 = getElementAbsoluteX2(element); |
|
|
|
|
const elementY1 = getElementAbsoluteY1(element); |
|
|
|
|
const elementY2 = getElementAbsoluteY2(element); |
|
|
|
|
element.isSelected = |
|
|
|
|
element.type !== "selection" && |
|
|
|
|
x <= element.x && |
|
|
|
|
y <= element.y && |
|
|
|
|
x + width >= element.x + element.width && |
|
|
|
|
y + height >= element.y + element.height; |
|
|
|
|
selectionX1 <= elementX1 && |
|
|
|
|
selectionY1 <= elementY1 && |
|
|
|
|
selectionX2 >= elementX2 && |
|
|
|
|
selectionY2 >= elementY2; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -231,16 +244,6 @@ function App() {
@@ -231,16 +244,6 @@ function App() {
|
|
|
|
|
elements.pop(); |
|
|
|
|
setSelection(draggingElement); |
|
|
|
|
} |
|
|
|
|
// Fix up negative width and height when dragging from right to left
|
|
|
|
|
// Note: it's a lot harder to do on mouse move because of rounding issues
|
|
|
|
|
if (draggingElement.width < 0) { |
|
|
|
|
draggingElement.x += draggingElement.width; |
|
|
|
|
draggingElement.width = -draggingElement.width; |
|
|
|
|
} |
|
|
|
|
if (draggingElement.height < 0) { |
|
|
|
|
draggingElement.y += draggingElement.height; |
|
|
|
|
draggingElement.height = -draggingElement.height; |
|
|
|
|
} |
|
|
|
|
drawScene(); |
|
|
|
|
}} |
|
|
|
|
onMouseMove={e => { |
|
|
|
|
@ -277,13 +280,18 @@ function drawScene() {
@@ -277,13 +280,18 @@ function drawScene() {
|
|
|
|
|
element.draw(rc, context); |
|
|
|
|
if (element.isSelected) { |
|
|
|
|
const margin = 4; |
|
|
|
|
|
|
|
|
|
const elementX1 = getElementAbsoluteX1(element); |
|
|
|
|
const elementX2 = getElementAbsoluteX2(element); |
|
|
|
|
const elementY1 = getElementAbsoluteY1(element); |
|
|
|
|
const elementY2 = getElementAbsoluteY2(element); |
|
|
|
|
const lineDash = context.getLineDash(); |
|
|
|
|
context.setLineDash([8, 4]); |
|
|
|
|
context.strokeRect( |
|
|
|
|
element.x - margin, |
|
|
|
|
element.y - margin, |
|
|
|
|
element.width + margin * 2, |
|
|
|
|
element.height + margin * 2 |
|
|
|
|
elementX1 - margin, |
|
|
|
|
elementY1 - margin, |
|
|
|
|
elementX2 - elementX1 + margin * 2, |
|
|
|
|
elementY2 - elementY1 + margin * 2 |
|
|
|
|
); |
|
|
|
|
context.setLineDash(lineDash); |
|
|
|
|
} |
|
|
|
|
|