Sengi-Windows-MacOS-Linux/src/app/components/streams-selection-footer/streams-selection-footer.co...

123 lines
4.0 KiB
TypeScript

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { Store } from '@ngxs/store';
import { HotkeysService, Hotkey } from 'angular2-hotkeys';
import { StreamElement, StreamTypeEnum } from '../../states/streams.state';
import { NavigationService } from '../../services/navigation.service';
import { SettingsService } from '../../services/settings.service';
@Component({
selector: 'app-streams-selection-footer',
templateUrl: './streams-selection-footer.component.html',
styleUrls: ['./streams-selection-footer.component.scss']
})
export class StreamsSelectionFooterComponent implements OnInit {
streams: SelectableStream[] = [];
private streams$: Observable<StreamElement[]>;
constructor(
private readonly settingsService: SettingsService,
private readonly hotkeysService: HotkeysService,
private readonly navigationService: NavigationService,
private readonly store: Store) {
this.streams$ = this.store.select(state => state.streamsstatemodel.streams);
const settings = this.settingsService.getSettings();
if(!settings.columnSwitchingWinAlt) {
this.hotkeysService.add(new Hotkey('ctrl+right', (event: KeyboardEvent): boolean => {
this.nextColumnSelected();
return false;
}));
this.hotkeysService.add(new Hotkey('ctrl+left', (event: KeyboardEvent): boolean => {
this.previousColumnSelected();
return false;
}));
} else {
this.hotkeysService.add(new Hotkey('meta+alt+right', (event: KeyboardEvent): boolean => {
this.nextColumnSelected();
return false;
}));
this.hotkeysService.add(new Hotkey('meta+alt+left', (event: KeyboardEvent): boolean => {
this.previousColumnSelected();
return false;
}));
}
}
ngOnInit() {
this.streams$.subscribe((streams: StreamElement[]) => {
this.streams = streams.map(x => new SelectableStream(x));
});
}
private nextColumnSelected() {
const nbStreams = this.streams.length;
const selectedElement = this.streams.find(x => x.isSelected);
let currentSelectionIndex = 0;
if (selectedElement) {
currentSelectionIndex = this.streams.indexOf(selectedElement);
}
if(currentSelectionIndex < nbStreams - 1){
this.onColumnSelection(currentSelectionIndex + 1);
}
}
private previousColumnSelected() {
const selectedElement = this.streams.find(x => x.isSelected);
let currentSelectionIndex = 0;
if (selectedElement) {
currentSelectionIndex = this.streams.indexOf(selectedElement);
}
if(currentSelectionIndex > 0){
this.onColumnSelection(currentSelectionIndex - 1);
} else {
this.onColumnSelection(0);
}
}
onColumnSelection(index: number): boolean {
this.streams.forEach(x => x.isSelected = false);
const selectedStream = this.streams[index];
selectedStream.isSelected = true;
this.navigationService.columnSelected(index);
return false;
}
getDisplayableName(stream: StreamElement): string {
let prefix = '';
switch (stream.type) {
case StreamTypeEnum.local:
prefix = "local";
break;
case StreamTypeEnum.personnal:
prefix = "home";
break;
case StreamTypeEnum.global:
prefix = "federated";
break;
case StreamTypeEnum.tag:
prefix = `#${stream.tag}`;
break;
case StreamTypeEnum.list:
prefix = `${stream.list}`;
break;
}
return `${prefix}@${stream.instance}`;
}
}
class SelectableStream {
constructor(public readonly stream: StreamElement) {
}
isSelected: boolean;
}