From 05f3885227d69f9ce0f834084900108a11d43c57 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Thu, 24 Mar 2022 12:06:28 -0400
Subject: [PATCH] video-split: fix maximize/minimize

Change-Id: I7e6093e26546d8207261689069505f1afea2bfbf
GitLab: #476
---
 src/calladapter.cpp                           | 22 +++++++++++++------
 .../components/ParticipantOverlay.qml         |  5 ++++-
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/calladapter.cpp b/src/calladapter.cpp
index 58f33f780..c57c3e5e6 100644
--- a/src/calladapter.cpp
+++ b/src/calladapter.cpp
@@ -739,16 +739,18 @@ CallAdapter::maximizeParticipant(const QString& uri)
     if (confId.isEmpty())
         confId = convInfo.callId;
     try {
+        const auto call = callModel->getCall(confId);
         auto participants = getConferencesInfos();
         for (auto part : participants) {
             auto participant = part.toJsonObject();
             if (participant["uri"].toString() == uri) {
-                participant["active"] = !participant["active"].toBool();
-                if (participant["active"].toBool()) {
+                auto active = participant["active"].toBool();
+                // Else, continue.
+                if (!active) {
                     callModel->setActiveParticipant(confId, uri);
                     callModel->setConferenceLayout(confId, lrc::api::call::Layout::ONE_WITH_SMALL);
-                } else {
-                    callModel->setConferenceLayout(confId, lrc::api::call::Layout::GRID);
+                } else if (call.layout == lrc::api::call::Layout::ONE_WITH_SMALL) {
+                    callModel->setConferenceLayout(confId, lrc::api::call::Layout::ONE);
                 }
                 return;
             }
@@ -768,13 +770,19 @@ CallAdapter::minimizeParticipant(const QString& uri)
     if (confId.isEmpty())
         confId = convInfo.callId;
     try {
+        const auto call = callModel->getCall(confId);
         auto participants = getConferencesInfos();
         for (auto& part : participants) {
             auto participant = part.toJsonObject();
             if (participant["uri"].toString() == uri) {
-                if (participant["active"].toBool()) {
-                    participant["active"] = !participant["active"].toBool();
-                    callModel->setConferenceLayout(confId, lrc::api::call::Layout::GRID);
+                auto active = participant["active"].toBool();
+                if (active) {
+                    if (call.layout == lrc::api::call::Layout::ONE) {
+                        callModel->setConferenceLayout(confId,
+                                                       lrc::api::call::Layout::ONE_WITH_SMALL);
+                    } else {
+                        callModel->setConferenceLayout(confId, lrc::api::call::Layout::GRID);
+                    }
                 }
                 return;
             }
diff --git a/src/mainview/components/ParticipantOverlay.qml b/src/mainview/components/ParticipantOverlay.qml
index 62b9bbe38..406763003 100644
--- a/src/mainview/components/ParticipantOverlay.qml
+++ b/src/mainview/components/ParticipantOverlay.qml
@@ -46,6 +46,9 @@ Item {
     property string bestName: ""
     property string sinkId: ""
     property bool participantIsActive: false
+    property bool canMaximize: root.meModerator &&
+                                    (!root.participantIsActive
+                                    || CallParticipantsModel.conferenceLayout === CallParticipantsModel.ONE_WITH_SMALL)
     property bool participantIsHost: CallAdapter.participantIsHost(uri)
     property bool participantIsModerator: false
     property bool participantIsMuted: isLocalMuted || participantIsModeratorMuted
@@ -166,7 +169,7 @@ Item {
                     showUnsetModerator: root.meHost && !root.isMe && root.participantIsModerator
                     showModeratorMute: root.meModerator && !root.participantIsModeratorMuted
                     showModeratorUnmute: (root.meModerator || root.isMe) && root.participantIsModeratorMuted
-                    showMaximize: root.meModerator && !root.participantIsActive
+                    showMaximize: root.canMaximize
                     showMinimize: root.meModerator && root.participantIsActive
                     showHangup: root.meModerator && !root.isMe && !root.participantIsHost
                 }
-- 
GitLab