summaryrefslogtreecommitdiff
path: root/javascript/videojs/src/js/control-bar/text-track-controls/text-track-button.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/videojs/src/js/control-bar/text-track-controls/text-track-button.js')
-rw-r--r--javascript/videojs/src/js/control-bar/text-track-controls/text-track-button.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/javascript/videojs/src/js/control-bar/text-track-controls/text-track-button.js b/javascript/videojs/src/js/control-bar/text-track-controls/text-track-button.js
new file mode 100644
index 0000000..0744986
--- /dev/null
+++ b/javascript/videojs/src/js/control-bar/text-track-controls/text-track-button.js
@@ -0,0 +1,93 @@
+/**
+ * @file text-track-button.js
+ */
+import TrackButton from '../track-button.js';
+import Component from '../../component.js';
+import TextTrackMenuItem from './text-track-menu-item.js';
+import OffTextTrackMenuItem from './off-text-track-menu-item.js';
+
+/** @import Player from '../../player' */
+
+/**
+ * The base class for buttons that toggle specific text track types (e.g. subtitles)
+ *
+ * @extends MenuButton
+ */
+class TextTrackButton extends TrackButton {
+
+ /**
+ * Creates an instance of this class.
+ *
+ * @param {Player} player
+ * The `Player` that this class should be attached to.
+ *
+ * @param {Object} [options={}]
+ * The key/value store of player options.
+ */
+ constructor(player, options = {}) {
+ options.tracks = player.textTracks();
+
+ super(player, options);
+ }
+
+ /**
+ * Create a menu item for each text track
+ *
+ * @param {TextTrackMenuItem[]} [items=[]]
+ * Existing array of items to use during creation
+ *
+ * @return {TextTrackMenuItem[]}
+ * Array of menu items that were created
+ */
+ createItems(items = [], TrackMenuItem = TextTrackMenuItem) {
+
+ // Label is an override for the [track] off label
+ // USed to localise captions/subtitles
+ let label;
+
+ if (this.label_) {
+ label = `${this.label_} off`;
+ }
+ // Add an OFF menu item to turn all tracks off
+ items.push(new OffTextTrackMenuItem(this.player_, {
+ kinds: this.kinds_,
+ kind: this.kind_,
+ label
+ }));
+
+ this.hideThreshold_ += 1;
+
+ const tracks = this.player_.textTracks();
+
+ if (!Array.isArray(this.kinds_)) {
+ this.kinds_ = [this.kind_];
+ }
+
+ for (let i = 0; i < tracks.length; i++) {
+ const track = tracks[i];
+
+ // only add tracks that are of an appropriate kind and have a label
+ if (this.kinds_.indexOf(track.kind) > -1) {
+
+ const item = new TrackMenuItem(this.player_, {
+ track,
+ kinds: this.kinds_,
+ kind: this.kind_,
+ // MenuItem is selectable
+ selectable: true,
+ // MenuItem is NOT multiSelectable (i.e. only one can be marked "selected" at a time)
+ multiSelectable: false
+ });
+
+ item.addClass(`vjs-${track.kind}-menu-item`);
+ items.push(item);
+ }
+ }
+
+ return items;
+ }
+
+}
+
+Component.registerComponent('TextTrackButton', TextTrackButton);
+export default TextTrackButton;