aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/stores/NodeCollectionStore.ts3
-rw-r--r--src/util/DragManager.ts62
-rw-r--r--src/views/freeformcanvas/FreeFormCanvas.tsx2
-rw-r--r--src/views/nodes/DocumentView.tsx2
4 files changed, 58 insertions, 11 deletions
diff --git a/src/stores/NodeCollectionStore.ts b/src/stores/NodeCollectionStore.ts
index ac4f515f1..7fac83d51 100644
--- a/src/stores/NodeCollectionStore.ts
+++ b/src/stores/NodeCollectionStore.ts
@@ -15,7 +15,8 @@ export class NodeCollectionStore extends NodeStore {
@computed
public get Transform(): string {
- return "translate(" + this.X + "px," + this.Y + "px) scale(" + this.Scale + "," + this.Scale + ")";
+ const halfWidth = window.innerWidth / 2, halfHeight = window.innerHeight / 2;
+ return `translate(${this.X + halfWidth}px, ${this.Y + halfHeight}px) scale(${this.Scale}) translate(${-halfWidth}px, ${-halfHeight}px)`;
}
@action
diff --git a/src/util/DragManager.ts b/src/util/DragManager.ts
index 1da590072..3111d589f 100644
--- a/src/util/DragManager.ts
+++ b/src/util/DragManager.ts
@@ -14,7 +14,7 @@ export namespace DragManager {
buttons: number;
}
- export interface DragDisposer {
+ export interface DragDropDisposer {
(): void;
}
@@ -34,7 +34,19 @@ export namespace DragManager {
dragComplete: (e: DragCompleteEvent) => void;
}
- export function MakeDraggable(element: HTMLElement, options: DragOptions): DragDisposer {
+ export interface DropOptions {
+ handlers: DropHandlers;
+ }
+
+ export class DropEvent {
+ constructor(readonly x: number, readonly y: number) { }
+ }
+
+ export interface DropHandlers {
+ drop: (e: DropEvent) => void;
+ }
+
+ export function MakeDraggable(element: HTMLElement, options: DragOptions): DragDropDisposer {
if ("draggable" in element.dataset) {
throw new Error("Element is already draggable, can't make it draggable again");
}
@@ -53,6 +65,7 @@ export namespace DragManager {
dispose();
};
const downHandler = (e: PointerEvent) => {
+ e.stopPropagation();
document.addEventListener("pointermove", startDragHandler);
document.addEventListener("pointerup", upHandler);
};
@@ -60,10 +73,26 @@ export namespace DragManager {
return () => {
element.removeEventListener("pointerdown", downHandler);
- element.dataset["draggable"] = undefined;
+ delete element.dataset["draggable"];
}
}
+ export function MakeDropTarget(element: HTMLElement, options: DropOptions): DragDropDisposer {
+ if ("draggable" in element.dataset) {
+ throw new Error("Element is already droppable, can't make it droppable again");
+ }
+ element.dataset["canDrop"] = "true";
+ const handler = (e: Event) => {
+ const ce = e as CustomEvent<DropEvent>;
+ options.handlers.drop(ce.detail);
+ };
+ element.addEventListener("dashOnDrop", handler);
+ return () => {
+ element.removeEventListener("dashOnDrop", handler);
+ delete element.dataset["canDrop"]
+ };
+ }
+
function StartDrag(ele: HTMLElement, e: PointerEvent, options: DragOptions) {
if (!dragDiv) {
const root = document.getElementById(rootId);
@@ -81,10 +110,16 @@ export namespace DragManager {
if (event.cancelled) {
return;
}
- let x = e.x, y = e.y;
+ const w = ele.offsetWidth, h = ele.offsetHeight;
+ const rect = ele.getBoundingClientRect();
+ const scaleX = rect.width / w, scaleY = rect.height / h;
+ let x = rect.left, y = rect.top;
+ // const offsetX = e.x - rect.left, offsetY = e.y - rect.top;
let dragElement = ele.cloneNode(true) as HTMLElement;
+ dragElement.style.opacity = "0.7";
dragElement.style.position = "absolute";
- dragElement.style.transform = `translate(${x}px, ${y}px)`;
+ dragElement.style.transformOrigin = "0 0";
+ dragElement.style.transform = `translate(${x}px, ${y}px) scale(${scaleX}, ${scaleY})`;
dragDiv.appendChild(dragElement);
const moveHandler = (e: PointerEvent) => {
@@ -92,18 +127,29 @@ export namespace DragManager {
e.preventDefault();
x += e.movementX;
y += e.movementY;
- dragElement.style.transform = `translate(${x}px, ${y}px)`;
+ dragElement.style.transform = `translate(${x}px, ${y}px) scale(${scaleX}, ${scaleY})`;
};
const upHandler = (e: PointerEvent) => {
document.removeEventListener("pointermove", moveHandler, true);
document.removeEventListener("pointerup", upHandler);
- FinishDrag(dragElement, options);
+ FinishDrag(dragElement, e, options);
};
document.addEventListener("pointermove", moveHandler, true);
document.addEventListener("pointerup", upHandler);
}
- function FinishDrag(ele: HTMLElement, options: DragOptions) {
+ function FinishDrag(ele: HTMLElement, e: PointerEvent, options: DragOptions) {
dragDiv.removeChild(ele);
+ const target = document.elementFromPoint(e.x, e.y);
+ if (!target) {
+ return;
+ }
+ target.dispatchEvent(new CustomEvent<DropEvent>("dashOnDrop", {
+ bubbles: true,
+ detail: {
+ x: e.x,
+ y: e.y,
+ }
+ }));
}
} \ No newline at end of file
diff --git a/src/views/freeformcanvas/FreeFormCanvas.tsx b/src/views/freeformcanvas/FreeFormCanvas.tsx
index e051fd97c..13e923736 100644
--- a/src/views/freeformcanvas/FreeFormCanvas.tsx
+++ b/src/views/freeformcanvas/FreeFormCanvas.tsx
@@ -77,7 +77,7 @@ export class FreeFormCanvas extends React.Component<IProps> {
let store = this.props.store;
return (
<div className="freeformcanvas-container" onPointerDown={this.onPointerDown} onWheel={this.onPointerWheel} onContextMenu={(e) => e.preventDefault()}>
- <div className="freeformcanvas" style={{ transform: store.Transform, transformOrigin: '50% 50%' }}>
+ <div className="freeformcanvas" style={{ transform: store.Transform}}>
<div className="node-container">
{this.props.store.Docs.map(doc => {
return (<DocumentView key={doc.Id} dvm={doc} />);
diff --git a/src/views/nodes/DocumentView.tsx b/src/views/nodes/DocumentView.tsx
index 648ea7f50..772c272bd 100644
--- a/src/views/nodes/DocumentView.tsx
+++ b/src/views/nodes/DocumentView.tsx
@@ -130,7 +130,6 @@ export class DocumentView extends React.Component<IProps> {
private _isPointerDown = false;
componentDidMount() {
- return;
// if(this._mainCont.current) {
// DragManager.MakeDraggable(this._mainCont.current, {
// buttons: 2,
@@ -143,6 +142,7 @@ export class DocumentView extends React.Component<IProps> {
}
onPointerDown = (e: React.PointerEvent): void => {
+ // return;
e.stopPropagation();
if (e.button === 2) {
this._isPointerDown = true;