From d3b4b49274c63ba2d53cfa0fa06cf18c4824be0c Mon Sep 17 00:00:00 2001
From: Jaon EarlWolf <jamonsterr@gmail.com>
Date: Thu, 7 Jan 2016 15:50:35 -0300
Subject: [PATCH] Settings modal rework -> panel slider at top

---
 .../verto_communicator/src/css/verto.css      |  48 +++++-
 html5/verto/verto_communicator/src/index.html |   3 +-
 .../verto_communicator/src/partials/menu.html |   2 +-
 .../src/partials/modal_settings.html          | 159 ------------------
 .../src/partials/settings.html                | 159 ++++++++++++++++++
 .../controllers/MainController.js             |   6 +
 ...ngsController.js => SettingsController.js} |  23 +--
 7 files changed, 228 insertions(+), 172 deletions(-)
 delete mode 100644 html5/verto/verto_communicator/src/partials/modal_settings.html
 create mode 100644 html5/verto/verto_communicator/src/partials/settings.html
 rename html5/verto/verto_communicator/src/vertoControllers/controllers/{ModalSettingsController.js => SettingsController.js} (88%)

diff --git a/html5/verto/verto_communicator/src/css/verto.css b/html5/verto/verto_communicator/src/css/verto.css
index a69d645600..d2d3b7add3 100644
--- a/html5/verto/verto_communicator/src/css/verto.css
+++ b/html5/verto/verto_communicator/src/css/verto.css
@@ -764,7 +764,7 @@ body .modal-body .btn-group .btn.active {
 }
 
 #sidebar-wrapper {
-    z-index: 1000;
+    z-index: 8;
     position: fixed;
     width: 0;
     height: calc(100% - 60px);
@@ -1686,3 +1686,49 @@ body:-webkit-full-screen #incall .video-footer {
   from { max-height:2000px;}
   to { max-height:0px;}
 }
+
+#settings {
+  z-index: 9;
+  position: fixed;
+  background: rgba(10, 56, 127, 0.9);
+  width: 100%;
+  transition: .4s ease-out;
+  color: white;
+  max-height: 80%;
+  overflow: auto;
+  top: -100%;
+  padding: 15px 0;
+}
+
+#settings select {
+  color: white;
+}
+
+#settings option {
+  color: #000;
+}
+
+#settings .content {
+  width: 80%;
+  height: 100%;
+  margin: auto;
+}
+
+#settings.toggled {
+  top: 67px;
+}
+
+#settings .form-group .form-control:focus {
+  background-image: linear-gradient(#d2d2d2, #d2d2d2), linear-gradient(#d2d2d2, #d2d2d2)
+}
+
+#settings .checkbox input[type=checkbox]:checked + .checkbox-material .check,
+#settings .checkbox input[type=checkbox]:checked + .checkbox-material .check:before,
+#settings .checkbox-default input[type=checkbox]:checked + .checkbox-material .check:before {
+  color: white;
+}
+
+#settings .btn {
+  color: rgba(0, 10, 66, 0.84);
+  background-color: #E8E8E8;
+}
diff --git a/html5/verto/verto_communicator/src/index.html b/html5/verto/verto_communicator/src/index.html
index ecbb15c64f..e10df64552 100644
--- a/html5/verto/verto_communicator/src/index.html
+++ b/html5/verto/verto_communicator/src/index.html
@@ -49,6 +49,7 @@
   <body>
 
     <div ng-include="'partials/menu.html'"></div>
+    <div ng-include="'partials/settings.html'"></div>
 
     <div id="wrapper" class="toggled">
       <!-- Sidebar -->
@@ -125,7 +126,7 @@
     <script type="text/javascript" src="src/vertoControllers/controllers/ModalDialpadController.js"></script>
     <script type="text/javascript" src="src/vertoControllers/controllers/ModalWsReconnectController.js"></script>
     <script type="text/javascript" src="src/vertoControllers/controllers/ModalLoginInformationController.js"></script>
-    <script type="text/javascript" src="src/vertoControllers/controllers/ModalSettingsController.js"></script>
+    <script type="text/javascript" src="src/vertoControllers/controllers/SettingsController.js"></script>
     <script type="text/javascript" src="src/vertoControllers/controllers/PreviewController.js"></script>
 
     <script type="text/javascript" src="src/vertoDirectives/vertoDirectives.module.js"></script>
diff --git a/html5/verto/verto_communicator/src/partials/menu.html b/html5/verto/verto_communicator/src/partials/menu.html
index bd62f8fe17..e4d190fb12 100644
--- a/html5/verto/verto_communicator/src/partials/menu.html
+++ b/html5/verto/verto_communicator/src/partials/menu.html
@@ -42,7 +42,7 @@
           </a>
         </li>
         <li class="navbar-item-icon" ng-show="verto.data.connected">
-          <a href="" ng-click="openModal('partials/modal_settings.html', 'ModalSettingsController')">
+          <a href="" ng-click="toggleSettings()">
             <i class="mdi-action-settings"></i>
           </a>
         </li>
diff --git a/html5/verto/verto_communicator/src/partials/modal_settings.html b/html5/verto/verto_communicator/src/partials/modal_settings.html
deleted file mode 100644
index e4aa9021f1..0000000000
--- a/html5/verto/verto_communicator/src/partials/modal_settings.html
+++ /dev/null
@@ -1,159 +0,0 @@
-<div class="modal-header">
-  <h3 class="modal-title">Device Settings</h3>
-</div>
-<div class="modal-body">
-  <div class="form-group" ng-show="mydata.useVideo">
-    <label for="settings-camera">Camera:</label>
-    <select name="camera" id="settings-camera" class="form-control"
-            ng-model="mydata.selectedVideo" ng-options="item.id as item.label for item in verto.data.videoDevices">
-    </select>
-  </div>
-
-  <div class="form-group" ng-show="mydata.useVideo">
-    <label for="settings-share-device">Share device:</label>
-    <select name="share-device" id="settings-share-device" class="form-control"
-            ng-model="mydata.selectedShare" ng-options="item.id as item.label for item in verto.data.shareDevices">
-    </select>
-  </div>
-
-  <div class="form-group">
-    <label for="settings-microphone">Microphone:</label>
-    <select name="microphone" id="settings-microphone" class="form-control"
-            ng-model="mydata.selectedAudio" ng-options="item.id as item.label for item in verto.data.audioDevices">
-    </select>
-  </div>
-
-  <div class="form-group">
-    <label for="settings-microphone">
-      Speaker:
-      <span ng-show="!speakerFeature" class="unsupported">
-        Your browser doesn't seem to support this feature
-      </span>
-    </label>
-    <select name="microphone" id="settings-microphone" class="form-control" ng-disabled="!speakerFeature"
-            ng-model="mydata.selectedSpeaker" ng-options="item.id as item.label for item in verto.data.speakerDevices">
-    </select>
-  </div>
-
-  <a class="btn btn-primary" href="" ng-click="showPreview()">Preview Settings</a>
-  <a class="btn btn-primary" href="" ng-click="refreshDeviceList()">Refresh device list</a>
-
-  <div class="form-group">
-    <label for="settings-microphone">General settings:</label>
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" name="use_video" value="mydata.useVideo" ng-model="mydata.useVideo">
-        Use Video
-      </label>
-    </div>
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" name="use_stereo_audio" ng-value="mydata.useStereo" ng-model="mydata.useStereo">
-        Stereo Audio
-      </label>
-    </div>
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" name="use_stun" ng-value="mydata.useSTUN" ng-model="mydata.useSTUN">
-        Use STUN
-      </label>
-    </div>
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" name="mirror_input" ng-value="mydata.mirrorInput" ng-model="mydata.mirrorInput">
-        Scale Remote Video To Match Camera Resolution
-      </label>
-    </div>
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" name="ask_recover_call" ng-value="mydata.askRecoverCall" ng-model="mydata.askRecoverCall">
-        Ask before recovering call
-      </label>
-    </div>
-
-  </div>
-
-  <div class="form-group">
-    <label for="settings-framerate">Best frame rate:</label>
-    <select name="settings-framerate" id="settings-framerate" class="form-control"
-            ng-model="mydata.bestFrameRate"
-            ng-options="item.id as item.label for item in verto.framerate"></select>
-  </div>
-
-  <div class="form-group">
-    <label for="settings-microphone">Audio settings:</label>
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" name="googEchoCancellation" value="mydata.googEchoCancellation" ng-model="mydata.googEchoCancellation">
-        Echo Cancellation
-      </label>
-    </div>
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" name="googNoiseSuppression" value="mydata.googNoiseSuppression" ng-model="mydata.googNoiseSuppression">
-        Noise Suppression
-      </label>
-    </div>
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" name="googHighpassFilter" value="mydata.googHighpassFilter" ng-model="mydata.googHighpassFilter">
-        Highpass Filter
-      </label>
-    </div>
-  </div>
-
-  <div class="form-group">
-    <label>Video settings:</label> <br>
-    <input type="hidden" name="use_dedenc" ng-value="mydata.useDedenc" ng-model="mydata.useDedenc">
-
-
-    <div ng-show="mydata.useDedenc" class="dedicated_encoder">
-      <p>Dedicated Remote Encoder enabled.</b>
-    </div>
-
-    <div class="checkbox">
-      <label>
-        <input type="checkbox" ng-model="mydata.autoBand" ng-change="checkAutoBand(mydata.autoBand)">
-        Automatically determine speed and resolution settings
-      </label>
-    </div>
-
-    <div class="checkbox" ng-show="mydata.autoBand">
-      <label>
-        <input type="checkbox" ng-model="mydata.testSpeedJoin">
-        Recheck bandwidth before each outgoing call
-      </label>
-    </div>
-
-    <a ng-show="mydata.autoBand" class="btn btn-primary" href="" ng-click="testSpeed()">Check Network Speed</a> <span ng-bind="speedMsg"></span>
-
-    <div ng-show="!mydata.autoBand">
-      <label for="video-quality">Video quality:</label>
-      <select name="video_quality" id="video-quality" class="form-control"
-              ng-disabled="mydata.autoBand"
-              ng-model="mydata.vidQual"
-              ng-change="checkVideoQuality(mydata.vidQual)"
-              ng-options="item.id as item.label for item in verto.videoQuality"></select>
-    </div>
-
-    <div ng-show="!mydata.autoBand">
-      <label for="incoming-bandwidth">Max incoming bandwidth:</label>
-      <select name="incoming_bandwidth" id="incoming-bandwidth" class="form-control"
-              ng-model="mydata.incomingBandwidth"
-  	    ng-change="checkUseDedRemoteEncoder(mydata.incomingBandwidth)"
-              ng-options="item.id as item.label for item in verto.bandwidth"></select>
-    </div>
-
-    <div ng-show="!mydata.autoBand">
-      <label for="outgoing-bandwidth">Max outgoing bandwidth:</label>
-      <select name="outgoing_bandwidth" id="outgoing-bandwidth" class="form-control"
-              ng-model="mydata.outgoingBandwidth"
-              ng-options="item.id as item.label for item in verto.bandwidth"></select>
-    </div>
-  </div>
-</div>
-<div class="modal-footer">
-  <button class="btn btn-danger pull-left btn-pull-left" ng-click="resetSettings()">Factory reset</button>
-  <!-- <button class="btn btn-primary" ng-click="cancel()">Cancel</button> -->
-  <button class="btn btn-primary" ng-click="ok()">Save Device Settings</button>
-</div>
diff --git a/html5/verto/verto_communicator/src/partials/settings.html b/html5/verto/verto_communicator/src/partials/settings.html
new file mode 100644
index 0000000000..4fc7a2010c
--- /dev/null
+++ b/html5/verto/verto_communicator/src/partials/settings.html
@@ -0,0 +1,159 @@
+<div id="settings" ng-controller="SettingsController">
+  <div class="content">
+    <div class="col-md-4">
+
+      <div class="form-group" ng-show="mydata.useVideo">
+        <label for="settings-camera">Camera:</label>
+        <select name="camera" id="settings-camera" class="form-control"
+                ng-model="mydata.selectedVideo" ng-options="item.id as item.label for item in verto.data.videoDevices">
+        </select>
+      </div>
+
+      <div class="form-group" ng-show="mydata.useVideo">
+        <label for="settings-share-device">Share device:</label>
+        <select name="share-device" id="settings-share-device" class="form-control"
+                ng-model="mydata.selectedShare" ng-options="item.id as item.label for item in verto.data.shareDevices">
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="settings-microphone">Microphone:</label>
+        <select name="microphone" id="settings-microphone" class="form-control"
+                ng-model="mydata.selectedAudio" ng-options="item.id as item.label for item in verto.data.audioDevices">
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="settings-microphone">
+          Speaker:
+          <span ng-show="!speakerFeature" class="unsupported">
+            Your browser doesn't seem to support this feature
+          </span>
+        </label>
+        <select name="microphone" id="settings-microphone" class="form-control" ng-disabled="!speakerFeature"
+                ng-model="mydata.selectedSpeaker" ng-options="item.id as item.label for item in verto.data.speakerDevices">
+        </select>
+      </div>
+
+      <div class="form-group">
+        <label for="settings-framerate">Best frame rate:</label>
+        <select name="settings-framerate" id="settings-framerate" class="form-control"
+                ng-model="mydata.bestFrameRate"
+                ng-options="item.id as item.label for item in verto.framerate"></select>
+      </div>
+
+      <a class="btn btn-primary" href="" ng-click="showPreview()">Preview Settings</a>
+      <a class="btn btn-primary" href="" ng-click="refreshDeviceList()">Refresh device list</a>
+    </div>
+    <div class="col-md-4">
+      <div class="form-group">
+        <label for="settings-microphone">General settings:</label>
+        <div class="checkbox">
+          <label>
+            <input type="checkbox" name="use_video" value="mydata.useVideo" ng-model="mydata.useVideo">
+            Use Video
+          </label>
+        </div>
+        <div class="checkbox">
+          <label>
+            <input type="checkbox" name="use_stereo_audio" ng-value="mydata.useStereo" ng-model="mydata.useStereo">
+            Stereo Audio
+          </label>
+        </div>
+        <div class="checkbox">
+          <label>
+            <input type="checkbox" name="use_stun" ng-value="mydata.useSTUN" ng-model="mydata.useSTUN">
+            Use STUN
+          </label>
+        </div>
+        <div class="checkbox">
+          <label>
+            <input type="checkbox" name="mirror_input" ng-value="mydata.mirrorInput" ng-model="mydata.mirrorInput">
+            Scale Remote Video To Match Camera Resolution
+          </label>
+        </div>
+        <div class="checkbox">
+          <label>
+            <input type="checkbox" name="ask_recover_call" ng-value="mydata.askRecoverCall" ng-model="mydata.askRecoverCall">
+            Ask before recovering call
+          </label>
+        </div>
+
+        <div class="form-group">
+          <label for="settings-microphone">Audio settings:</label>
+          <div class="checkbox">
+            <label>
+              <input type="checkbox" name="googEchoCancellation" value="mydata.googEchoCancellation" ng-model="mydata.googEchoCancellation">
+              Echo Cancellation
+            </label>
+          </div>
+          <div class="checkbox">
+            <label>
+              <input type="checkbox" name="googNoiseSuppression" value="mydata.googNoiseSuppression" ng-model="mydata.googNoiseSuppression">
+              Noise Suppression
+            </label>
+          </div>
+          <div class="checkbox">
+            <label>
+              <input type="checkbox" name="googHighpassFilter" value="mydata.googHighpassFilter" ng-model="mydata.googHighpassFilter">
+              Highpass Filter
+            </label>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="col-md-4">
+
+      <div class="form-group">
+        <label>Video settings:</label> <br>
+        <input type="hidden" name="use_dedenc" ng-value="mydata.useDedenc" ng-model="mydata.useDedenc">
+
+
+        <div ng-show="mydata.useDedenc" class="dedicated_encoder">
+          <p>Dedicated Remote Encoder enabled.</b>
+        </div>
+
+        <div class="checkbox">
+          <label>
+            <input type="checkbox" ng-model="mydata.autoBand" ng-change="checkAutoBand(mydata.autoBand)">
+            Automatically determine speed and resolution settings
+          </label>
+        </div>
+
+        <div class="checkbox" ng-show="mydata.autoBand">
+          <label>
+            <input type="checkbox" ng-model="mydata.testSpeedJoin">
+            Recheck bandwidth before each outgoing call
+          </label>
+        </div>
+
+        <a ng-show="mydata.autoBand" class="btn btn-primary" href="" ng-click="testSpeed()">Check Network Speed</a> <span ng-bind="speedMsg"></span>
+
+        <div ng-show="!mydata.autoBand">
+          <label for="video-quality">Video quality:</label>
+          <select name="video_quality" id="video-quality" class="form-control"
+                  ng-disabled="mydata.autoBand"
+                  ng-model="mydata.vidQual"
+                  ng-change="checkVideoQuality(mydata.vidQual)"
+                  ng-options="item.id as item.label for item in verto.videoQuality"></select>
+        </div>
+
+        <div ng-show="!mydata.autoBand">
+          <label for="incoming-bandwidth">Max incoming bandwidth:</label>
+          <select name="incoming_bandwidth" id="incoming-bandwidth" class="form-control"
+                  ng-model="mydata.incomingBandwidth"
+      	    ng-change="checkUseDedRemoteEncoder(mydata.incomingBandwidth)"
+                  ng-options="item.id as item.label for item in verto.bandwidth"></select>
+        </div>
+
+        <div ng-show="!mydata.autoBand">
+          <label for="outgoing-bandwidth">Max outgoing bandwidth:</label>
+          <select name="outgoing_bandwidth" id="outgoing-bandwidth" class="form-control"
+                  ng-model="mydata.outgoingBandwidth"
+                  ng-options="item.id as item.label for item in verto.bandwidth"></select>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js b/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js
index 70c43d72ac..dc21cb1077 100644
--- a/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js
+++ b/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js
@@ -278,6 +278,12 @@
         angular.element('#wrapper').addClass('toggled');
       };
 
+      $scope.toggleSettings = function() {
+        var settingsEl = angular.element(document.querySelector('#settings'));
+        settingsEl.toggleClass('toggled');
+        $rootScope.$emit('toggledSettings', settingsEl.hasClass('toggled'));
+      };
+
       $scope.goFullscreen = function() {
         if (storage.data.userStatus !== 'connected') {
           return;
diff --git a/html5/verto/verto_communicator/src/vertoControllers/controllers/ModalSettingsController.js b/html5/verto/verto_communicator/src/vertoControllers/controllers/SettingsController.js
similarity index 88%
rename from html5/verto/verto_communicator/src/vertoControllers/controllers/ModalSettingsController.js
rename to html5/verto/verto_communicator/src/vertoControllers/controllers/SettingsController.js
index 34fa507a35..a9adcd630f 100644
--- a/html5/verto/verto_communicator/src/vertoControllers/controllers/ModalSettingsController.js
+++ b/html5/verto/verto_communicator/src/vertoControllers/controllers/SettingsController.js
@@ -3,16 +3,25 @@
 
   angular
     .module('vertoControllers')
-    .controller('ModalSettingsController', ['$scope', '$http',
-      '$location', '$modalInstance', '$rootScope', 'storage', 'verto', 'toastr',
-      function($scope, $http, $location, $modalInstance, $rootScope, storage, verto, toastr) {
+    .controller('SettingsController', ['$scope', '$http',
+      '$location', '$rootScope', 'storage', 'verto',
+      function($scope, $http, $location, $rootScope, storage, verto) {
         console.debug('Executing ModalSettingsController.');
 
+        $.material.init();
+
+        $scope.speakerFeature = typeof document.getElementById('webcam').sinkId !== 'undefined';
         $scope.storage = storage;
         $scope.verto = verto;
         $scope.mydata = angular.copy(storage.data);
 
-        $scope.speakerFeature = typeof document.getElementById('webcam').sinkId !== 'undefined';
+        $rootScope.$on('toggledSettings', function(e, status) {
+          if (status) {
+            $scope.mydata = angular.copy(storage.data);
+          } else {
+            $scope.ok();
+          }
+        });
 
         $scope.ok = function() {
           if ($scope.mydata.selectedSpeaker != storage.data.selectedSpeaker) {
@@ -24,11 +33,6 @@
           if (storage.data.autoBand) {
             $scope.testSpeed();
           }
-          $modalInstance.close('Ok.');
-        };
-
-        $scope.cancel = function() {
-          $modalInstance.dismiss('cancel');
         };
 
         $scope.refreshDeviceList = function() {
@@ -60,7 +64,6 @@
 	  if (confirm('Factory Reset Settings?')) {
             storage.factoryReset();
             $scope.logout();
-            $modalInstance.close('Ok.');
 	    window.location.reload();
 	  };
         };