Files
ArtPlayer/packages/artplayer/src/control/index.js
T
2019-12-09 17:34:55 +08:00

176 lines
4.8 KiB
JavaScript

import { errorHandle, addClass } from '../utils';
import Component from '../utils/component';
import fullscreen from './fullscreen';
import fullscreenWeb from './fullscreenWeb';
import pip from './pip';
import playAndPause from './playAndPause';
import progress from './progress';
import subtitle from './subtitle';
import time from './time';
import volume from './volume';
import setting from './setting';
import thumbnails from './thumbnails';
import screenshot from './screenshot';
import quality from './quality';
export default class Control extends Component {
constructor(art) {
super(art);
this.name = 'control';
const { option } = art;
art.on('ready', () => {
this.add(
progress({
name: 'progress',
disable: option.isLive,
position: 'top',
index: 10,
}),
);
this.add(
thumbnails({
name: 'thumbnails',
disable: !option.thumbnails.url || option.isLive,
position: 'top',
index: 20,
}),
);
this.add(
playAndPause({
name: 'playAndPause',
disable: false,
position: 'left',
index: 10,
}),
);
this.add(
volume({
name: 'volume',
disable: false,
position: 'left',
index: 20,
}),
);
this.add(
time({
name: 'time',
disable: option.isLive,
position: 'left',
index: 30,
}),
);
this.add(
quality({
name: 'quality',
disable: option.quality.length === 0,
position: 'right',
index: 10,
}),
);
this.add(
screenshot({
name: 'screenshot',
disable: !option.screenshot,
position: 'right',
index: 20,
}),
);
this.add(
subtitle({
name: 'subtitle',
disable: !option.subtitle.url,
position: 'right',
index: 30,
}),
);
this.add(
setting({
name: 'setting',
disable: !option.setting,
position: 'right',
index: 40,
}),
);
this.add(
pip({
name: 'pip',
disable: !option.pip,
position: 'right',
index: 50,
}),
);
this.add(
fullscreenWeb({
name: 'fullscreenWeb',
disable: !option.fullscreenWeb,
position: 'right',
index: 60,
}),
);
this.add(
fullscreen({
name: 'fullscreen',
disable: !option.fullscreen,
position: 'right',
index: 70,
}),
);
option.controls.forEach(item => {
this.add(item);
});
});
}
add(getOption, callback) {
const option = typeof getOption === 'function' ? getOption(this.art) : getOption;
errorHandle(
['top', 'left', 'right'].includes(option.position),
`Control option.position must one of 'top', 'left', 'right'`,
);
const { $progress, $controlsLeft, $controlsRight } = this.art.template;
switch (option.position) {
case 'top':
this.$parent = $progress;
break;
case 'left':
this.$parent = $controlsLeft;
break;
case 'right':
this.$parent = $controlsRight;
break;
default:
break;
}
super.add(option, $ref => {
if (
!option.disable &&
option.position !== 'top' &&
!($ref.firstElementChild && $ref.firstElementChild.tagName === 'I')
) {
addClass($ref, 'art-control-onlyText');
}
if (callback) {
callback($ref, this, this.art);
}
});
}
}