Skip to content

Commit b7a393d

Browse files
committed
Very rough drag and drop.
1 parent 6925831 commit b7a393d

File tree

2 files changed

+75
-7
lines changed

2 files changed

+75
-7
lines changed

src/pg/tree/tree.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export default class PgTree extends HTMLElement {
7474
});
7575
this.$items.addEventListener('itemdragstart', (e: any) => {
7676
const { indexes, callback, ctrlKey, shiftKey } = e.detail;
77-
console.log('testing', indexes);
77+
console.log('drag valid', indexes);
7878
const item = this.#getItem(indexes);
7979
const unproxyItem = getProxyValue(item);
8080
if (!ctrlKey && this.#selectedIndexes.size) {
@@ -84,12 +84,23 @@ export default class PgTree extends HTMLElement {
8484
item.selected = true;
8585
this.#selectedIndexes.set(unproxyItem, indexes);
8686
callback(this.#selectedIndexes.size);
87-
this.#calculateDragExcludes();
8887
this.$items.classList.toggle('dragging', true);
8988
});
9089
this.$items.addEventListener('itemdragend', (e: any) => {
9190
this.$items.classList.toggle('dragging', false);
9291
});
92+
this.$items.addEventListener('itemdropenter', this.#handleDropEnter.bind(this));
93+
}
94+
95+
#handleDropEnter(e: any) {
96+
const { indexes, callback } = e.detail;
97+
const excludes = this.#calculateDragExcludes();
98+
console.log('valid???', indexes, excludes);
99+
const joined = indexes.join(',') as string;
100+
const isInvalid = excludes.some(exclude => joined.startsWith(exclude));
101+
callback(!isInvalid, (dropEffect) => {
102+
e.dataTransfer.effectAllowed = dropEffect;
103+
});
93104
}
94105

95106
#getItem(indexes: number[]) {

src/pg/treeItem/treeItem.ts

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,21 @@ export default class PgTreeItem extends HTMLElement {
5858
this.$items.addEventListener('down', this.#handleDown.bind(this));
5959
this.$items.addEventListener('itemdragstart', this.#handleItemDragStart.bind(this));
6060
this.$items.addEventListener('itemdragend', this.#handleItemDragEnd.bind(this));
61-
// Drag
61+
this.$items.addEventListener('itemdropenter', this.#handleItemDropEnter.bind(this));
62+
// Drop
6263
this.$dropabove.addEventListener('dragenter', this.#handleDropAboveEnter.bind(this));
6364
this.$dropabove.addEventListener('dragleave', this.#handleDropAboveLeave.bind(this));
65+
this.$dropabove.addEventListener('dragover', this.#handleDropOver.bind(this));
66+
this.$dropabove.addEventListener('drop', this.#handleDrop.bind(this));
6467
this.$dropon.addEventListener('dragenter', this.#handleDropOnEnter.bind(this));
6568
this.$dropon.addEventListener('dragleave', this.#handleDropOnLeave.bind(this));
69+
this.$dropon.addEventListener('dragover', this.#handleDropOver.bind(this));
70+
this.$dropon.addEventListener('drop', this.#handleDrop.bind(this));
6671
this.$dropbelow.addEventListener('dragenter', this.#handleDropBelowEnter.bind(this));
6772
this.$dropbelow.addEventListener('dragleave', this.#handleDropBelowLeave.bind(this));
73+
this.$dropbelow.addEventListener('dragover', this.#handleDropOver.bind(this));
74+
this.$dropbelow.addEventListener('drop', this.#handleDrop.bind(this));
75+
6876
forEach({
6977
container: this.$actions,
7078
items: this.actions,
@@ -219,6 +227,10 @@ export default class PgTreeItem extends HTMLElement {
219227
e.detail.indexes.unshift(this.index);
220228
}
221229

230+
#handleItemDropEnter(e: any) {
231+
e.detail.indexes.unshift(this.index);
232+
}
233+
222234
#handleContextMenu(e) {
223235
e.preventDefault();
224236
}
@@ -344,7 +356,7 @@ export default class PgTreeItem extends HTMLElement {
344356
canvas.height = 40 * size;
345357
canvas.style.width = `${canvas.width / size}px`;
346358
// overlap cursor offset
347-
const offsetInline = 10;
359+
const offsetInline = 20;
348360
const fontSize = 16;
349361
const paddingBlock = 6;
350362
const paddingInline = 6;
@@ -394,7 +406,6 @@ export default class PgTreeItem extends HTMLElement {
394406
this.#canvas.remove();
395407
}
396408

397-
398409
#handleItemDragStart(e: any) {
399410
e.detail.indexes.unshift(this.index);
400411
}
@@ -405,7 +416,20 @@ export default class PgTreeItem extends HTMLElement {
405416

406417
#handleDropAboveEnter(e: any) {
407418
console.log('darg above');
419+
this.dispatchEvent(new CustomEvent('itemdropenter', {
420+
bubbles: true,
421+
composed: true,
422+
detail: {
423+
indexes: [this.index],
424+
callback: (isValid) => {
425+
console.log('is valid', isValid);
426+
e.dataTransfer.dropEffect = 'move';
427+
}
428+
}
429+
}));
408430
e.target.classList.toggle('drop', true);
431+
e.dataTransfer.setData("text", 'test');
432+
e.dataTransfer.effectAllowed = 'move';
409433
}
410434

411435
#handleDropAboveLeave(e: any) {
@@ -414,7 +438,18 @@ export default class PgTreeItem extends HTMLElement {
414438
}
415439

416440
#handleDropOnEnter(e: any) {
417-
console.log('darg above');
441+
console.log('darg on');
442+
this.dispatchEvent(new CustomEvent('itemdropenter', {
443+
bubbles: true,
444+
composed: true,
445+
detail: {
446+
indexes: [this.index],
447+
callback: (isValid) => {
448+
console.log('is valid', isValid);
449+
e.dataTransfer.dropEffect = 'move';
450+
}
451+
}
452+
}));
418453
e.target.classList.toggle('drop', true);
419454
}
420455

@@ -424,7 +459,20 @@ export default class PgTreeItem extends HTMLElement {
424459
}
425460

426461
#handleDropBelowEnter(e: any) {
427-
console.log('darg above');
462+
console.log('darg below');
463+
this.dispatchEvent(new CustomEvent('itemdropenter', {
464+
bubbles: true,
465+
composed: true,
466+
detail: {
467+
indexes: [this.index],
468+
callback: (isValid, setDropEffect) => {
469+
console.log('is valid', isValid);
470+
if (isValid) {
471+
e.dataTransfer.dropEffect = 'move';
472+
}
473+
}
474+
}
475+
}));
428476
e.target.classList.toggle('drop', true);
429477
}
430478

@@ -433,4 +481,13 @@ export default class PgTreeItem extends HTMLElement {
433481
e.target.classList.toggle('drop', false);
434482
}
435483

484+
#handleDropOver(e: any) {
485+
e.preventDefault();
486+
e.dataTransfer.dropEffect = 'move';
487+
}
488+
489+
#handleDrop(e: any) {
490+
console.log('dropped!!!');
491+
}
492+
436493
}

0 commit comments

Comments
 (0)