Source: ui/skip_next_button.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.ui.SkipNextButton');
  7. goog.require('shaka.ui.Controls');
  8. goog.require('shaka.ui.Element');
  9. goog.require('shaka.ui.Enums');
  10. goog.require('shaka.ui.Locales');
  11. goog.require('shaka.ui.Localization');
  12. goog.require('shaka.ui.Utils');
  13. goog.require('shaka.util.Dom');
  14. /**
  15. * @extends {shaka.ui.Element}
  16. * @final
  17. * @export
  18. */
  19. shaka.ui.SkipNextButton = class extends shaka.ui.Element {
  20. /**
  21. * @param {!HTMLElement} parent
  22. * @param {!shaka.ui.Controls} controls
  23. */
  24. constructor(parent, controls) {
  25. super(parent, controls);
  26. this.queueManager_ = this.player.getQueueManager();
  27. if (!this.queueManager_) {
  28. return;
  29. }
  30. /** @private {!HTMLButtonElement} */
  31. this.button_ = shaka.util.Dom.createButton();
  32. this.button_.classList.add('shaka-skip-next-button');
  33. this.button_.classList.add('material-icons-round');
  34. this.button_.classList.add('shaka-tooltip');
  35. this.button_.textContent = shaka.ui.Enums.MaterialDesignIcons.SKIP_NEXT;
  36. this.parent.appendChild(this.button_);
  37. this.updateAriaLabel_();
  38. this.checkAvailability_();
  39. this.eventManager.listen(
  40. this.localization, shaka.ui.Localization.LOCALE_UPDATED, () => {
  41. this.updateAriaLabel_();
  42. });
  43. this.eventManager.listen(
  44. this.localization, shaka.ui.Localization.LOCALE_CHANGED, () => {
  45. this.updateAriaLabel_();
  46. });
  47. this.eventManager.listen(this.button_, 'click', () => {
  48. if (!this.controls.isOpaque()) {
  49. return;
  50. }
  51. this.queueManager_.playItem(this.queueManager_.getCurrentItemIndex() + 1);
  52. });
  53. this.eventManager.listen(this.queueManager_, 'currentitemchanged', () => {
  54. this.checkAvailability_();
  55. });
  56. this.eventManager.listen(this.queueManager_, 'itemsinserted', () => {
  57. this.checkAvailability_();
  58. });
  59. this.eventManager.listen(this.queueManager_, 'itemsremoved', () => {
  60. this.checkAvailability_();
  61. });
  62. this.eventManager.listen(this.player, 'loading', () => {
  63. this.checkAvailability_();
  64. });
  65. }
  66. /**
  67. * @private
  68. */
  69. updateAriaLabel_() {
  70. this.button_.ariaLabel =
  71. this.localization.resolve(shaka.ui.Locales.Ids.SKIP_NEXT);
  72. }
  73. /** @private */
  74. checkAvailability_() {
  75. const itemsLength = this.queueManager_.getItems().length;
  76. const available = itemsLength > 1 &&
  77. (this.queueManager_.getCurrentItemIndex() + 1) < itemsLength;
  78. shaka.ui.Utils.setDisplay(this.button_, available);
  79. }
  80. };
  81. /**
  82. * @implements {shaka.extern.IUIElement.Factory}
  83. * @final
  84. */
  85. shaka.ui.SkipNextButton.Factory = class {
  86. /** @override */
  87. create(rootElement, controls) {
  88. return new shaka.ui.SkipNextButton(rootElement, controls);
  89. }
  90. };
  91. shaka.ui.Controls.registerElement(
  92. 'skip_next', new shaka.ui.SkipNextButton.Factory());