From 96af7dec59435919cff41c6bdbca849d98018b11 Mon Sep 17 00:00:00 2001 From: rhenck <richard.henck@iqb.hu-berlin.de> Date: Thu, 28 Oct 2021 14:52:20 +0200 Subject: [PATCH] [editor] Fix resize dragging in dynamic section mode Some things had to be tweaked in regards to positioning and sizing of elements. The drag preview is now done with a separate div, which only shows while dragging and has the temporary dimensions of the element. When dropped it sets the grid values if the dropzone as before. --- .../dynamic-canvas-overlay.component.ts | 38 ++++++++++++++----- .../canvas/section-dynamic.component.ts | 10 +---- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/projects/editor/src/app/unit-view/page-view/canvas/dynamic-canvas-overlay.component.ts b/projects/editor/src/app/unit-view/page-view/canvas/dynamic-canvas-overlay.component.ts index ea04c33e5..44fcb3bdf 100644 --- a/projects/editor/src/app/unit-view/page-view/canvas/dynamic-canvas-overlay.component.ts +++ b/projects/editor/src/app/unit-view/page-view/canvas/dynamic-canvas-overlay.component.ts @@ -12,22 +12,29 @@ import { UIElement } from '../../../../../../common/models/uI-element'; cdkDrag [cdkDragData]="{dragType: 'move', element: element}" [cdkDragDisabled]="!isSelected" (click)="selectElement($event.shiftKey)" (dblclick)="openEditDialog()" (cdkDragStarted)="!isSelected && selectElement()" - [style.height.%]="100" - [style.border]="isSelected ? '1px solid' : ''"> - <div *ngIf="isSelected" class="resizeHandle" + [style.outline]="isSelected ? 'purple solid 1px' : ''"> + <div *ngIf="isSelected" + [style.width.%]="dragging ? 100 : 0" + [style.height.%]="dragging ? 100 : 0" cdkDrag [cdkDragData]="{dragType: 'resize', element: element}" - (cdkDragStarted)="dragStart()" (cdkDragEnded)="dragEnd()" (cdkDragMoved)="resizeElement($event)" - cdkDragBoundary=".section-wrapper" - [style.right.px]="2" [style.bottom.px]="-3"> - <mat-icon>aspect_ratio</mat-icon> - <div *cdkDragPlaceholder></div> + (cdkDragStarted)="dragStart()" (cdkDragEnded)="dragEnd()" (cdkDragMoved)="resizeElement($event)"> + <div class="resizeHandle"> + <mat-icon>aspect_ratio</mat-icon> + <div *cdkDragPlaceholder></div> + </div> </div> <ng-template #elementContainer></ng-template> </div> + <div [style.position]="'relative'" + [style.width.px]="dragging ? elementWidth : 0" + [style.height.px]="dragging ? elementHeight : 0" + [style.border]="'1px solid purple'"> + </div> `, styles: [ - '.draggable-element {position: relative}', - '.resizeHandle {position: absolute}' + '.draggable-element {position: relative; width: 100%; height: 100%}', + '.resizeHandle {position: absolute; right: 3px; bottom: 3px; z-index: 1; height: 25px}', + '.cdk-drag {position: absolute; bottom: 0; right: 0}' ] }) export class DynamicCanvasOverlayComponent extends CanvasElementOverlay { @@ -37,10 +44,17 @@ export class DynamicCanvasOverlayComponent extends CanvasElementOverlay { @ViewChild('draggableElement') dragElement!: ElementRef; private gridElementWidth: number = 0; private gridElementHeight: number = 0; + elementWidth: number = 0; + elementHeight: number = 0; + + dragging = false; dragStart(): void { + this.dragging = true; this.gridElementWidth = this.dragElement.nativeElement.offsetWidth - 2; this.gridElementHeight = this.dragElement.nativeElement.offsetHeight - 2; + this.elementWidth = this.dragElement.nativeElement.offsetWidth - 2; + this.elementHeight = this.dragElement.nativeElement.offsetHeight - 2; this.resize.emit({ dragging: true, @@ -50,6 +64,9 @@ export class DynamicCanvasOverlayComponent extends CanvasElementOverlay { } resizeElement(event: CdkDragMove<{ dragType: string; element: UIElement }>): void { + this.dragging = true; + this.elementWidth = this.gridElementWidth + event.distance.x; + this.elementHeight = this.gridElementHeight + event.distance.y; this.resize.emit({ dragging: true, elementWidth: this.gridElementWidth + event.distance.x, @@ -58,6 +75,7 @@ export class DynamicCanvasOverlayComponent extends CanvasElementOverlay { } dragEnd(): void { + this.dragging = false; this.resize.emit({ dragging: false }); diff --git a/projects/editor/src/app/unit-view/page-view/canvas/section-dynamic.component.ts b/projects/editor/src/app/unit-view/page-view/canvas/section-dynamic.component.ts index 09e1af999..f0f54c04e 100644 --- a/projects/editor/src/app/unit-view/page-view/canvas/section-dynamic.component.ts +++ b/projects/editor/src/app/unit-view/page-view/canvas/section-dynamic.component.ts @@ -53,10 +53,8 @@ import { UIElementType } from '../../../../../../common/models/uI-element'; [cdkDropListData]="{ sectionIndex: sectionIndex }" [cdkDropListConnectedTo]="dropListList" (resize)="resizeOverlay($event)" - [style.pointer-events]="dragging ? 'none' : 'auto'" - [style.position]="dragging ? 'absolute' : null" - [style.width.px]="dragging ? draggingElementWidth : null" - [style.height.px]="dragging ? draggingElementHeight : null"> + [style.position]="'relative'" + [style.pointer-events]="dragging ? 'none' : 'auto'"> </app-dynamic-canvas-overlay> </div> `, @@ -72,8 +70,6 @@ export class SectionDynamicComponent { @Output() transferElement = new EventEmitter<{ previousSectionIndex: number, newSectionIndex: number }>(); dragging = false; - draggingElementWidth: number | undefined = 0; - draggingElementHeight: number | undefined = 0; constructor(public unitService: UnitService) { } @@ -138,7 +134,5 @@ export class SectionDynamicComponent { resizeOverlay(event: { dragging: boolean, elementWidth?: number, elementHeight?: number }): void { this.dragging = event.dragging; - this.draggingElementWidth = event.elementWidth; - this.draggingElementHeight = event.elementHeight; } } -- GitLab