From 08c78f49e75d9de07f2448fbd881c9a8fd9ff42d Mon Sep 17 00:00:00 2001
From: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
Date: Thu, 4 Aug 2022 13:27:26 -0300
Subject: [PATCH] callbuttons: hide audio only

GitLab: #729

Change-Id: Ib444fdf5515f9242bbe627d695d05fafb16214d6
---
 src/app/appsettingsmanager.h                   |  1 +
 src/app/callparticipantsmodel.h                |  6 ++++++
 src/app/constant/JamiStrings.qml               |  1 +
 src/app/mainview/components/CallActionBar.qml  | 18 +++++++++++++++---
 .../mainview/components/ParticipantsLayer.qml  |  4 ++++
 5 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/app/appsettingsmanager.h b/src/app/appsettingsmanager.h
index 932985236..074fb0cf8 100644
--- a/src/app/appsettingsmanager.h
+++ b/src/app/appsettingsmanager.h
@@ -48,6 +48,7 @@ extern const QString defaultDownloadPath;
     X(BaseZoom, 1.0) \
     X(ParticipantsSide, false) \
     X(HideSelf, false) \
+    X(HideAudioOnly, false) \
     X(AutoUpdate, true) \
     X(StartMinimized, false) \
     X(ShowChatviewHorizontally, true) \
diff --git a/src/app/callparticipantsmodel.h b/src/app/callparticipantsmodel.h
index e1cc7cc0c..31e1597c8 100644
--- a/src/app/callparticipantsmodel.h
+++ b/src/app/callparticipantsmodel.h
@@ -76,6 +76,7 @@ class GenericParticipantsFilterModel final : public QSortFilterProxyModel
 {
     Q_OBJECT
     QML_PROPERTY(bool, hideSelf)
+    QML_PROPERTY(bool, hideAudioOnly)
 
 public:
     explicit GenericParticipantsFilterModel(LRCInstance* lrcInstance,
@@ -98,6 +99,11 @@ public:
             sourceModel()->rowCount() > 1 &&
             sourceModel()->data(index, CallParticipant::Role::IsLocal).toBool())
             acceptState = false;
+        if (acceptState &&
+            hideAudioOnly_ &&
+            sourceModel()->rowCount() > 1 &&
+            sourceModel()->data(index, CallParticipant::Role::VideoMuted).toBool())
+            acceptState = false;
 
         return acceptState;
     }
diff --git a/src/app/constant/JamiStrings.qml b/src/app/constant/JamiStrings.qml
index cfffa2478..9d6ca31b3 100644
--- a/src/app/constant/JamiStrings.qml
+++ b/src/app/constant/JamiStrings.qml
@@ -253,6 +253,7 @@ Item {
     property string participantsSide: qsTr("On the side")
     property string participantsTop: qsTr("On the top")
     property string hideSelf: qsTr("Hide self")
+    property string hideAudioOnly: qsTr("Hide participant without video")
 
     // LineEditContextMenu
     property string copy: qsTr("Copy")
diff --git a/src/app/mainview/components/CallActionBar.qml b/src/app/mainview/components/CallActionBar.qml
index f7d46453b..7f9e8fa5c 100644
--- a/src/app/mainview/components/CallActionBar.qml
+++ b/src/app/mainview/components/CallActionBar.qml
@@ -176,19 +176,25 @@ Control {
                   case JamiStrings.hideSelf:
                         UtilsAdapter.setAppValue(Settings.HideSelf, !layoutModel.get(index).ActiveSetting)
                         GenericParticipantsFilterModel.hideSelf = UtilsAdapter.getAppValue(Settings.HideSelf)
+                        GenericParticipantsFilterModel.hideAudioOnly = UtilsAdapter.getAppValue(Settings.HideAudioOnly)
+                        GenericParticipantsFilterModel.reset()
+                        break
+                  case JamiStrings.hideAudioOnly:
+                        UtilsAdapter.setAppValue(Settings.HideAudioOnly, !layoutModel.get(index).ActiveSetting)
+                        GenericParticipantsFilterModel.hideSelf = UtilsAdapter.getAppValue(Settings.HideSelf)
+                        GenericParticipantsFilterModel.hideAudioOnly = UtilsAdapter.getAppValue(Settings.HideAudioOnly)
                         GenericParticipantsFilterModel.reset()
                         break
                 }
             }
             onTriggered: {
                 layoutModel.clear()
-                if (!isGrid && isConference) {
+                if (isConference) {
                     layoutModel.append({"Name": JamiStrings.mosaic,
                                         "IconSource": JamiResources.mosaic_black_24dp_svg,
                                         "ActiveSetting": isGrid})
                     layoutModel.append({})
-                }
-                if (isConference) {
+
                     var onTheSide = UtilsAdapter.getAppValue(Settings.ParticipantsSide)
                     layoutModel.append({"Name": onTheSide ? JamiStrings.participantsSide : JamiStrings.participantsTop,
                                         "IconSource": onTheSide ? JamiResources.ontheside_black_24dp_svg : JamiResources.onthetop_black_24dp_svg,
@@ -202,6 +208,12 @@ Control {
                 layoutModel.append({"Name": JamiStrings.viewFullScreen,
                                     "IconSource": JamiResources.open_in_full_24dp_svg,
                                     "ActiveSetting": layoutManager.isCallFullscreen})
+                if (isConference) {
+                    layoutModel.append({})
+                    layoutModel.append({"Name": JamiStrings.hideAudioOnly,
+                                        "IconSource": JamiResources.videocam_off_24dp_svg,
+                                        "ActiveSetting": UtilsAdapter.getAppValue(Settings.HideAudioOnly)})
+                }
             }
         },
         Action {
diff --git a/src/app/mainview/components/ParticipantsLayer.qml b/src/app/mainview/components/ParticipantsLayer.qml
index 87d22ae58..c8a1b01f7 100644
--- a/src/app/mainview/components/ParticipantsLayer.qml
+++ b/src/app/mainview/components/ParticipantsLayer.qml
@@ -37,6 +37,7 @@ Item {
 
     onVisibleChanged: {
         GenericParticipantsFilterModel.hideSelf = UtilsAdapter.getAppValue(Settings.HideSelf)
+        GenericParticipantsFilterModel.hideAudioOnly = UtilsAdapter.getAppValue(Settings.HideAudioOnly)
     }
 
     Connections {
@@ -45,6 +46,9 @@ Item {
         function onHideSelfChanged() {
             GenericParticipantsFilterModel.reset()
         }
+        function onHideAudioOnlyChanged() {
+            GenericParticipantsFilterModel.reset()
+        }
     }
 
     Component {
-- 
GitLab