diff --git a/resources/icons/hidemyself_black_24dp.svg b/resources/icons/hidemyself_black_24dp.svg new file mode 100644 index 00000000..afec2d58 --- /dev/null +++ b/resources/icons/hidemyself_black_24dp.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/src/app/appsettingsmanager.h b/src/app/appsettingsmanager.h index 0f13b2a3..93298523 100644 --- a/src/app/appsettingsmanager.h +++ b/src/app/appsettingsmanager.h @@ -47,6 +47,7 @@ extern const QString defaultDownloadPath; X(EnableDarkTheme, false) \ X(BaseZoom, 1.0) \ X(ParticipantsSide, false) \ + X(HideSelf, false) \ X(AutoUpdate, true) \ X(StartMinimized, false) \ X(ShowChatviewHorizontally, true) \ diff --git a/src/app/callparticipantsmodel.h b/src/app/callparticipantsmodel.h index b02d4cbc..e1cc7cc0 100644 --- a/src/app/callparticipantsmodel.h +++ b/src/app/callparticipantsmodel.h @@ -75,6 +75,7 @@ struct Item class GenericParticipantsFilterModel final : public QSortFilterProxyModel { Q_OBJECT + QML_PROPERTY(bool, hideSelf) public: explicit GenericParticipantsFilterModel(LRCInstance* lrcInstance, @@ -90,7 +91,15 @@ public: { // Accept all participants in participants list filtered with active status. auto index = sourceModel()->index(sourceRow, 0, sourceParent); - return !sourceModel()->data(index, CallParticipant::Role::Active).toBool(); + + bool acceptState = !sourceModel()->data(index, CallParticipant::Role::Active).toBool(); + if (acceptState && + hideSelf_ && + sourceModel()->rowCount() > 1 && + sourceModel()->data(index, CallParticipant::Role::IsLocal).toBool()) + acceptState = false; + + return acceptState; } Q_INVOKABLE void reset() diff --git a/src/app/constant/JamiStrings.qml b/src/app/constant/JamiStrings.qml index 8724cabb..cfffa247 100644 --- a/src/app/constant/JamiStrings.qml +++ b/src/app/constant/JamiStrings.qml @@ -252,6 +252,7 @@ Item { property string notMuted: qsTr("Not muted") property string participantsSide: qsTr("On the side") property string participantsTop: qsTr("On the top") + property string hideSelf: qsTr("Hide self") // LineEditContextMenu property string copy: qsTr("Copy") diff --git a/src/app/mainview/components/CallActionBar.qml b/src/app/mainview/components/CallActionBar.qml index e58221ad..f7d46453 100644 --- a/src/app/mainview/components/CallActionBar.qml +++ b/src/app/mainview/components/CallActionBar.qml @@ -173,25 +173,35 @@ Control { var onTheSide = UtilsAdapter.getAppValue(Settings.ParticipantsSide) UtilsAdapter.setAppValue(Settings.ParticipantsSide, !onTheSide) participantsSide = !onTheSide + case JamiStrings.hideSelf: + UtilsAdapter.setAppValue(Settings.HideSelf, !layoutModel.get(index).ActiveSetting) + GenericParticipantsFilterModel.hideSelf = UtilsAdapter.getAppValue(Settings.HideSelf) + GenericParticipantsFilterModel.reset() break } } onTriggered: { layoutModel.clear() - layoutModel.append({"Name": JamiStrings.viewFullScreen, - "IconSource": JamiResources.open_in_full_24dp_svg, - "ActiveSetting": layoutManager.isCallFullscreen}) - if (isConference) { + if (!isGrid && 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, "ActiveSetting": true}) layoutModel.append({}) - layoutModel.append({"Name": JamiStrings.mosaic, - "IconSource": JamiResources.mosaic_black_24dp_svg, - "ActiveSetting": isGrid}) + layoutModel.append({"Name": JamiStrings.hideSelf, + "IconSource": JamiResources.hidemyself_black_24dp_svg, + "ActiveSetting": UtilsAdapter.getAppValue(Settings.HideSelf)}) + layoutModel.append({}) } + layoutModel.append({"Name": JamiStrings.viewFullScreen, + "IconSource": JamiResources.open_in_full_24dp_svg, + "ActiveSetting": layoutManager.isCallFullscreen}) } }, Action { diff --git a/src/app/mainview/components/ParticipantsLayer.qml b/src/app/mainview/components/ParticipantsLayer.qml index ceac7cfc..87d22ae5 100644 --- a/src/app/mainview/components/ParticipantsLayer.qml +++ b/src/app/mainview/components/ParticipantsLayer.qml @@ -35,6 +35,18 @@ Item { property bool inLine: CallParticipantsModel.conferenceLayout === CallParticipantsModel.ONE_WITH_SMALL property bool participantsSide + onVisibleChanged: { + GenericParticipantsFilterModel.hideSelf = UtilsAdapter.getAppValue(Settings.HideSelf) + } + + Connections { + target: GenericParticipantsFilterModel + + function onHideSelfChanged() { + GenericParticipantsFilterModel.reset() + } + } + Component { id: callVideoMedia diff --git a/src/app/mainview/components/ParticipantsLayoutHorizontal.qml b/src/app/mainview/components/ParticipantsLayoutHorizontal.qml index e0fc08a0..10bc6874 100644 --- a/src/app/mainview/components/ParticipantsLayoutHorizontal.qml +++ b/src/app/mainview/components/ParticipantsLayoutHorizontal.qml @@ -133,7 +133,8 @@ SplitView { SplitView.minimumWidth: parent.width / 6 SplitView.maximumWidth: inLine? parent.width / 2 : parent.width - visible: inLine || CallParticipantsModel.conferenceLayout === CallParticipantsModel.GRID + visible: commonParticipants.count > 0 && + (inLine || CallParticipantsModel.conferenceLayout === CallParticipantsModel.GRID) color: "transparent" property int lowLimit: 0 diff --git a/src/app/mainview/components/ParticipantsLayoutVertical.qml b/src/app/mainview/components/ParticipantsLayoutVertical.qml index 6989a879..307a167c 100644 --- a/src/app/mainview/components/ParticipantsLayoutVertical.qml +++ b/src/app/mainview/components/ParticipantsLayoutVertical.qml @@ -82,7 +82,8 @@ SplitView { SplitView.minimumHeight: parent.height / 6 SplitView.maximumHeight: inLine? parent.height / 2 : parent.height - visible: inLine || CallParticipantsModel.conferenceLayout === CallParticipantsModel.GRID + visible: commonParticipants.count > 0 && + (inLine || CallParticipantsModel.conferenceLayout === CallParticipantsModel.GRID) color: "transparent" property int lowLimit: 0