From 5d6c7533c2faf500ead7382ec1a8d4e79da43600 Mon Sep 17 00:00:00 2001
From: jojohoch <joachim.hoch@iqb.hu-berlin.de>
Date: Tue, 23 Nov 2021 16:24:41 +0100
Subject: [PATCH] Add minVolume, defaultVolume and muteControl to audios an
 videos

---
 docs/release-notes-player.txt                    |  3 +++
 .../control-bar/control-bar.component.html       |  6 ++++--
 .../control-bar/control-bar.component.ts         | 16 +++++++++-------
 .../common/interfaces/UIElementInterfaces.ts     |  3 +++
 projects/common/models/audio-element.ts          |  3 +++
 projects/common/models/video-element.ts          |  3 +++
 .../common/util/unit-interface-initializer.ts    |  3 +++
 .../dialogs/player-edit-dialog.component.ts      | 16 ++++++++++++++++
 projects/editor/src/assets/i18n/de.json          |  3 +++
 9 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/docs/release-notes-player.txt b/docs/release-notes-player.txt
index f6d549939..c55c0d15f 100644
--- a/docs/release-notes-player.txt
+++ b/docs/release-notes-player.txt
@@ -7,6 +7,9 @@ Player
  - Fix problem with truncated text in text components when using large font sizes
  - Hide audio and video control bar when no control is marked for display
  - Add the floating variant of the virtual keyboard for numbers and numbers + operators
+ - Hide mute control if wanted
+ - Use minimum volume value (value between 0 and 1)
+ - Use default volume value  (value between 0 and 1)
 
 1.5.0
  - Show the magnifier only when the mouse is over the image
diff --git a/projects/common/element-components/control-bar/control-bar.component.html b/projects/common/element-components/control-bar/control-bar.component.html
index d4e076af0..b6c4a786c 100644
--- a/projects/common/element-components/control-bar/control-bar.component.html
+++ b/projects/common/element-components/control-bar/control-bar.component.html
@@ -57,7 +57,7 @@
       -{{currentRestTime | playerTimeFormat}}
     </div>
   </ng-container>
-  <ng-container *ngIf="elementModel.volumeControl">
+  <ng-container *ngIf="elementModel.muteControl">
     <button mat-button
             type="button"
             class="control-button enabled-control"
@@ -65,10 +65,12 @@
       <mat-icon *ngIf="!player.muted">volume_up</mat-icon>
       <mat-icon *ngIf="player.muted">volume_off</mat-icon>
     </button>
+  </ng-container>
+  <ng-container *ngIf="elementModel.volumeControl">
     <mat-slider class="volume"
                 min="0"
                 step="0.01"
-                [max]="1"
+                max="1"
                 [value]="player.volume"
                 (input)="onVolumeChange($event)">
     </mat-slider>
diff --git a/projects/common/element-components/control-bar/control-bar.component.ts b/projects/common/element-components/control-bar/control-bar.component.ts
index 8971a1ffa..510f87f98 100644
--- a/projects/common/element-components/control-bar/control-bar.component.ts
+++ b/projects/common/element-components/control-bar/control-bar.component.ts
@@ -69,7 +69,7 @@ export class ControlBarComponent implements OnInit, OnChanges, OnDestroy {
     this.player.onvolumechange = () => {
       this.player.muted = !this.player.volume;
     };
-    this.player.volume = 0.8;
+    this.player.volume = this.elementModel.defaultVolume;
     this.lastVolume = this.player.volume;
   }
 
@@ -93,7 +93,8 @@ export class ControlBarComponent implements OnInit, OnChanges, OnDestroy {
   }
 
   onVolumeChange(event: MatSliderChange): void {
-    this.player.volume = event.value ? event.value : 0;
+    event.source.value = event.value && event.value > this.elementModel.minVolume ?
+      event.value : this.elementModel.minVolume;
   }
 
   toggleTime(): void {
@@ -101,9 +102,9 @@ export class ControlBarComponent implements OnInit, OnChanges, OnDestroy {
   }
 
   toggleVolume(): void {
-    if (this.player.volume) {
+    if (this.player.volume > this.elementModel.minVolume) {
       this.lastVolume = this.player.volume;
-      this.player.volume = 0;
+      this.player.volume = this.elementModel.minVolume;
     } else {
       this.player.volume = this.lastVolume;
     }
@@ -143,9 +144,10 @@ export class ControlBarComponent implements OnInit, OnChanges, OnDestroy {
   }
 
   private _play(): void {
-    this.player.play().then(() => {},
-      // eslint-disable-next-line no-console
-      () => console.error('player: cannot play this media file'));
+    this.player.play().then(() => {
+    },
+    // eslint-disable-next-line no-console
+    () => console.error('player: cannot play this media file'));
   }
 
   private sendPlaybackTimeChanged() {
diff --git a/projects/common/interfaces/UIElementInterfaces.ts b/projects/common/interfaces/UIElementInterfaces.ts
index aee4e675d..5f7c42a7f 100644
--- a/projects/common/interfaces/UIElementInterfaces.ts
+++ b/projects/common/interfaces/UIElementInterfaces.ts
@@ -23,6 +23,9 @@ export interface PlayerElement {
   progressBar: boolean;
   interactiveProgressbar: boolean;
   volumeControl: boolean;
+  defaultVolume: number;
+  minVolume: number;
+  muteControl: boolean;
   hintLabel: string;
   hintLabelDelay: number;
   uninterruptible: boolean;
diff --git a/projects/common/models/audio-element.ts b/projects/common/models/audio-element.ts
index 70bc57d96..9bfab2aa2 100644
--- a/projects/common/models/audio-element.ts
+++ b/projects/common/models/audio-element.ts
@@ -13,6 +13,9 @@ export class AudioElement extends UIElement implements PlayerElement {
   progressBar: boolean = true;
   interactiveProgressbar: boolean = false;
   volumeControl: boolean = true;
+  defaultVolume: number = 0.8;
+  minVolume: number = 0;
+  muteControl: boolean = true;
   hintLabel: string = '';
   hintLabelDelay: number = 0;
   uninterruptible: boolean = false;
diff --git a/projects/common/models/video-element.ts b/projects/common/models/video-element.ts
index f96047378..987fea472 100644
--- a/projects/common/models/video-element.ts
+++ b/projects/common/models/video-element.ts
@@ -13,6 +13,9 @@ export class VideoElement extends UIElement implements PlayerElement {
   progressBar: boolean = true;
   interactiveProgressbar: boolean = false;
   volumeControl: boolean = true;
+  defaultVolume: number = 0.8;
+  minVolume: number = 0;
+  muteControl: boolean = true;
   hintLabel: string = '';
   hintLabelDelay: number = 0;
   uninterruptible: boolean = false;
diff --git a/projects/common/util/unit-interface-initializer.ts b/projects/common/util/unit-interface-initializer.ts
index c2850463c..4b5d5ca7e 100644
--- a/projects/common/util/unit-interface-initializer.ts
+++ b/projects/common/util/unit-interface-initializer.ts
@@ -28,6 +28,9 @@ export function initPlayerElement(serializedElement: UIElement): PlayerElement {
     interactiveProgressbar: serializedElement.interactiveProgressbar !== undefined ?
       serializedElement.interactiveProgressbar as boolean : false,
     volumeControl: serializedElement.volumeControl !== undefined ? serializedElement.volumeControl as boolean : true,
+    defaultVolume: serializedElement.defaultVolume !== undefined ? serializedElement.defaultVolume as number : 0.8,
+    minVolume: serializedElement.minVolume !== undefined ? serializedElement.minVolume as number : 0,
+    muteControl: serializedElement.muteControl !== undefined ? serializedElement.muteControl as boolean : true,
     hintLabel: serializedElement.hintLabel as string || '',
     hintLabelDelay: serializedElement.hintLabelDelay !== undefined ? serializedElement.hintLabelDelay as number : 0,
     uninterruptible:
diff --git a/projects/editor/src/app/components/dialogs/player-edit-dialog.component.ts b/projects/editor/src/app/components/dialogs/player-edit-dialog.component.ts
index a79fc6859..c74ea895a 100644
--- a/projects/editor/src/app/components/dialogs/player-edit-dialog.component.ts
+++ b/projects/editor/src/app/components/dialogs/player-edit-dialog.component.ts
@@ -29,6 +29,22 @@ import { PlayerElement } from '../../../../../common/interfaces/UIElementInterfa
                           (change)="newPlayerConfig.volumeControl = $event.checked">
               {{ 'player.volumeControl' | translate }}
             </mat-checkbox>
+            <mat-form-field appearance="fill">
+              <mat-label>{{ 'player.defaultVolume' | translate }}</mat-label>
+              <input matInput type="number" min="0" max="1" step="0.1"
+                     [ngModel]="newPlayerConfig.defaultVolume || data.player.defaultVolume"
+                     (ngModelChange)="newPlayerConfig.defaultVolume = $event">
+            </mat-form-field>
+            <mat-form-field appearance="fill">
+              <mat-label>{{ 'player.minVolume' | translate }}</mat-label>
+              <input matInput type="number" min="0" max="1" step="0.1"
+                     [ngModel]="newPlayerConfig.minVolume || data.player.minVolume"
+                     (ngModelChange)="newPlayerConfig.minVolume = $event">
+            </mat-form-field>
+            <mat-checkbox [checked]="newPlayerConfig.muteControl || data.player.muteControl"
+                          (change)="newPlayerConfig.muteControl = $event.checked">
+              {{ 'player.muteControl' | translate }}
+            </mat-checkbox>
             <mat-checkbox [checked]="newPlayerConfig.showRestTime || data.player.showRestTime"
                           (change)="newPlayerConfig.showRestTime = $event.checked">
               {{ 'player.showRestTime' | translate }}
diff --git a/projects/editor/src/assets/i18n/de.json b/projects/editor/src/assets/i18n/de.json
index 237c76f48..408f8486d 100644
--- a/projects/editor/src/assets/i18n/de.json
+++ b/projects/editor/src/assets/i18n/de.json
@@ -129,6 +129,9 @@
     "progressBar": "Fortschrittsbalken",
     "interactiveProgressbar": "Fortschrittsbalken (steuerbar)",
     "volumeControl": "Lautstärkeregelung",
+    "muteControl": "Stummschaltung",
+    "minVolume": "Minimale Lautstärke",
+    "defaultVolume": "Voreingestellte Lautstärke",
     "uninterruptible": "Unterbrechen verbieten",
     "hideOtherPages": "Weitere Seiten verbergen",
     "showRestTime": "Verbleibende Zeit anzeigen",
-- 
GitLab