Skip to content
Snippets Groups Projects
selection.service.ts 1.74 KiB
Newer Older
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { UIElement } from 'common/models/elements/element';
rhenck's avatar
rhenck committed
import { CanvasElementOverlay } from 'editor/src/app/components/canvas/overlays/canvas-element-overlay';
import {
  CompoundChildOverlayComponent
} from 'common/components/compound-elements/cloze/compound-child-overlay.component';

@Injectable({
  providedIn: 'root'
})
export class SelectionService {
  selectedPageIndex: number = 0;
  selectedPageSectionIndex: number = 0;
  private _selectedElements!: BehaviorSubject<UIElement[]>;
rhenck's avatar
rhenck committed
  selectedElementComponents: (CanvasElementOverlay | CompoundChildOverlayComponent)[] = [];
  selectedCompoundChild: { element: UIElement, nativeElement: HTMLElement } | null = null;
  constructor() {
    this._selectedElements = new BehaviorSubject([] as UIElement[]);
  get selectedElements(): Observable<UIElement[]> {
    return this._selectedElements.asObservable();
  }

  getSelectedElements(): UIElement[] {
    return this._selectedElements.value;
  }

rhenck's avatar
rhenck committed
  selectElement(event: { elementComponent: CanvasElementOverlay | CompoundChildOverlayComponent; multiSelect: boolean }): void {
    if (!event.multiSelect) {
      this.clearElementSelection();
    }
rhenck's avatar
rhenck committed
    this.selectedElementComponents.push(event.elementComponent);
    event.elementComponent.setSelected(true);
    this._selectedElements.next(this.selectedElementComponents.map(componentElement => componentElement.element));
  }

  clearElementSelection(): void {
rhenck's avatar
rhenck committed
    this.selectedElementComponents.forEach((overlayComponent: CanvasElementOverlay | CompoundChildOverlayComponent) => {
      overlayComponent.setSelected(false);
    });
    this.selectedElementComponents = [];
    this._selectedElements.next([]);