projects/angular-cesium/src/lib/angular-cesium/services/selection-manager/selection-manager.service.ts
Manages entity selection service for any given mouse event and modifier the service will manage the list of selected items. check out the example you must provide the service yourself
Usage :
* // provide the service in some component
* @Component({
* //...
* providers: [SelectionManagerService]
* }
*
* // Usage example:
* // init selection
* const selectedIndicator = ture; // optional default true, if true a boolean "selected" property will be added to the selected entity
* selectionManagerService.initSelection({ event: CesiumEvent.LEFT_CLICK,
* modifier: CesiumEventModifier.CTRL
* },selectedIndicator);
* // Get selected
* const selected = selectionManagerService.selected();
*
* // Or as observer
* const selected$ = selectionManagerService.selected$();
*
*
Properties |
Methods |
constructor(mapsManager: MapsManagerService)
|
||||||
Parameters :
|
Private addToSelected |
addToSelected(entity: AcEntity, addSelectedIndicator: boolean)
|
Returns :
void
|
initSelection | ||||||||||||||||||||
initSelection(selectionOptions?: SelectionOptions, addSelectedIndicator, eventPriority?: number, mapId?: string)
|
||||||||||||||||||||
Parameters :
Returns :
void
|
Private removeSelected |
removeSelected(entity: AcEntity, addSelectedIndicator: boolean)
|
Returns :
void
|
selectedEntities |
selectedEntities()
|
Returns :
AcEntity[]
|
selectedEntities$ |
selectedEntities$()
|
Returns :
Observable<AcEntity[]>
|
selectedEntity$ |
selectedEntity$()
|
Returns :
any
|
toggleSelection |
toggleSelection(entity: AcEntity, addSelectedIndicator: boolean)
|
Returns :
void
|
Private mapEventsManagerService |
mapEventsManagerService:
|
Type : MapEventsManagerService
|
selectedEntitiesItems$ |
selectedEntitiesItems$:
|
Type : BehaviorSubject<AcEntity[]>
|
Default value : new BehaviorSubject<AcEntity[]>([])
|
selectedEntitySubject$ |
selectedEntitySubject$:
|
Type : Subject<AcEntity>
|
Default value : new Subject<AcEntity>()
|
import { filter, map } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable, Subject } from 'rxjs';
import { AcEntity } from '../../models/ac-entity';
import { CesiumEvent } from '../map-events-mananger/consts/cesium-event.enum';
import { MapEventsManagerService } from '../map-events-mananger/map-events-manager';
import { PickOptions } from '../map-events-mananger/consts/pickOptions.enum';
import { CesiumEventModifier } from '../map-events-mananger/consts/cesium-event-modifier.enum';
import { MapsManagerService } from '../maps-manager/maps-manager.service';
export interface SelectionOptions {
event?: CesiumEvent;
modifier?: CesiumEventModifier;
entityType?: any;
}
/**
* Manages entity selection service for any given mouse event and modifier
* the service will manage the list of selected items.
* check out the example
* you must provide the service yourself
*
* __Usage :__
* ```
* // provide the service in some component
* @Component({
* //...
* providers: [SelectionManagerService]
* }
*
* // Usage example:
* // init selection
* const selectedIndicator = ture; // optional default true, if true a boolean "selected" property will be added to the selected entity
* selectionManagerService.initSelection({ event: CesiumEvent.LEFT_CLICK,
* modifier: CesiumEventModifier.CTRL
* },selectedIndicator);
* // Get selected
* const selected = selectionManagerService.selected();
*
* // Or as observer
* const selected$ = selectionManagerService.selected$();
*
* ```
*
*/
@Injectable()
export class SelectionManagerService {
selectedEntitiesItems$: BehaviorSubject<AcEntity[]> = new BehaviorSubject<AcEntity[]>([]);
selectedEntitySubject$: Subject<AcEntity> = new Subject<AcEntity>();
private mapEventsManagerService: MapEventsManagerService;
constructor(private mapsManager: MapsManagerService) {
}
selectedEntities$(): Observable<AcEntity[]> {
return this.selectedEntitiesItems$.asObservable();
}
selectedEntities(): AcEntity[] {
return this.selectedEntitiesItems$.getValue();
}
selectedEntity$() {
return this.selectedEntitySubject$;
}
toggleSelection(entity: AcEntity, addSelectedIndicator: boolean) {
const current = this.selectedEntities();
if (current.indexOf(entity) === -1) {
this.addToSelected(entity, addSelectedIndicator);
} else {
this.removeSelected(entity, addSelectedIndicator);
}
}
private addToSelected(entity: AcEntity, addSelectedIndicator: boolean) {
if (addSelectedIndicator) {
entity['selected'] = true;
}
const current = this.selectedEntities();
this.selectedEntitySubject$.next(entity);
this.selectedEntitiesItems$.next([...current, entity]);
}
private removeSelected(entity: AcEntity, addSelectedIndicator: boolean) {
if (addSelectedIndicator) {
entity['selected'] = false;
}
const current = this.selectedEntities();
const entityIndex = current.indexOf(entity);
if (entityIndex !== -1) {
current.splice(entityIndex, 1);
this.selectedEntitiesItems$.next(current);
this.selectedEntitySubject$.next(entity);
}
}
initSelection(selectionOptions?: SelectionOptions, addSelectedIndicator = true, eventPriority?: number, mapId?: string) {
const mapComponent = this.mapsManager.getMap(mapId);
if (!mapComponent) {
return;
}
this.mapEventsManagerService = mapComponent.getMapEventsManager();
if (!selectionOptions) {
Object.assign(selectionOptions, {event: CesiumEvent.LEFT_CLICK});
}
const eventSubscription = this.mapEventsManagerService.register({
event: selectionOptions.event,
pick: PickOptions.PICK_ONE,
modifier: selectionOptions.modifier,
entityType: selectionOptions.entityType,
priority: eventPriority,
});
eventSubscription.pipe(
map(result => result.entities),
filter(entities => entities && entities.length > 0))
.subscribe(entities => {
const entity = entities[0];
this.toggleSelection(entity, addSelectedIndicator);
});
}
}