diff --git a/resources/icons/informations_black_24dp.svg b/resources/icons/informations_black_24dp.svg new file mode 100644 index 00000000..cd6609af --- /dev/null +++ b/resources/icons/informations_black_24dp.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/resources/icons/screenshot_black_24dp.svg b/resources/icons/screenshot_black_24dp.svg new file mode 100644 index 00000000..d3b513e3 --- /dev/null +++ b/resources/icons/screenshot_black_24dp.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/src/app/mainview/components/CallOverlay.qml b/src/app/mainview/components/CallOverlay.qml index d6123739..5a108d99 100644 --- a/src/app/mainview/components/CallOverlay.qml +++ b/src/app/mainview/components/CallOverlay.qml @@ -56,12 +56,12 @@ Item { hoveredOverlaySinkId, hoveredOverVideoMuted) { - callViewContextMenu.x = x - callViewContextMenu.y = y + callViewContextMenu.x = root.width - x >= callViewContextMenu.width ? x : root.width - callViewContextMenu.width + callViewContextMenu.y = root.height - y >= callViewContextMenu.height ? y : root.height - callViewContextMenu.height callViewContextMenu.hoveredOverlayUri = hoveredOverlayUri callViewContextMenu.hoveredOverlaySinkId = hoveredOverlaySinkId callViewContextMenu.hoveredOverVideoMuted = hoveredOverVideoMuted - callViewContextMenu.openMenu() + callViewContextMenu.open() } DropArea { @@ -178,18 +178,14 @@ Item { CallViewContextMenu { id: callViewContextMenu - onTransferCallButtonClicked: openContactPicker(ContactList.TRANSFER) - onPluginItemClicked: openPluginsMenu() onScreenshotTaken: { toastManager.instantiateToast(); } - onRecordCallClicked: CallAdapter.recordThisCallToggle() - onOpenSelectionWindow: { - SelectScreenWindowCreation.presentSelectScreenWindow( - appWindow, windowSelection) - } onScreenshotButtonHoveredChanged: { participantsLayer.screenshotButtonHovered = screenshotButtonHovered } } + onVisibleChanged: { + callViewContextMenu.close() + } } diff --git a/src/app/mainview/components/CallViewContextMenu.qml b/src/app/mainview/components/CallViewContextMenu.qml index 4a7aa35d..91611dad 100644 --- a/src/app/mainview/components/CallViewContextMenu.qml +++ b/src/app/mainview/components/CallViewContextMenu.qml @@ -19,6 +19,8 @@ */ import QtQuick +import QtQuick.Controls +import QtQuick.Layouts import net.jami.Models 1.1 import net.jami.Adapters 1.1 @@ -28,206 +30,119 @@ import "../../commoncomponents" import "../../commoncomponents/contextmenu" import "../js/screenrubberbandcreation.js" as ScreenRubberBandCreation -ContextMenuAutoLoader { +Popup { id: root - property bool windowSelection: false - - signal pluginItemClicked - signal transferCallButtonClicked - signal recordCallClicked - signal openSelectionWindow signal screenshotTaken - property bool screenshotButtonHovered: screenShot.itemHovered + property bool screenshotButtonHovered: false property string hoveredOverlayUri: "" property string hoveredOverlaySinkId: "" property bool hoveredOverVideoMuted: true - property list menuItems: [ - GeneralMenuItem { - id: resumePauseCall + property var listModel: ListModel { + id: actionsModel + } - canTrigger: CurrentCall.isSIP - itemName: CurrentCall.isPaused ? - JamiStrings.resumeCall : - JamiStrings.pauseCall - iconSource: CurrentCall.isPaused ? - JamiResources.play_circle_outline_24dp_svg : - JamiResources.pause_circle_outline_24dp_svg - onClicked: { - CallAdapter.holdThisCallToggle() - } - }, - GeneralMenuItem { - id: inputPanelSIP + onAboutToShow: { + actionsModel.clear() + actionsModel.append({"Top": true}) + if (hoveredOverlayUri !== "" && hoveredOverVideoMuted === false) + actionsModel.append({"Name": JamiStrings.tileScreenshot, + "IconSource" : JamiResources.screenshot_black_24dp_svg}) + actionsModel.append({"Name": JamiStrings.advancedInformation, + "IconSource": JamiResources.informations_black_24dp_svg}) + actionsModel.append({"Bottom": true}) + itemListView.implicitHeight = 20 + 45 * (actionsModel.count - 2) + } - canTrigger: CurrentCall.isSIP - itemName: JamiStrings.sipInputPanel - iconSource: JamiResources.ic_keypad_svg - onClicked: { - sipInputPanel.open() - } - }, - GeneralMenuItem { - id: callTransfer + onAboutToHide: { + screenshotButtonHovered = false + hoveredOverlayUri = "" + hoveredOverlaySinkId = "" + hoveredOverVideoMuted = true + actionsModel.clear() + } - canTrigger: CurrentCall.isSIP - itemName: JamiStrings.transferCall - iconSource: JamiResources.phone_forwarded_24dp_svg - addMenuSeparatorAfter: CurrentCall.isSIP - onClicked: { - root.transferCallButtonClicked() - } - }, - GeneralMenuItem { - id: localRecord + background: Rectangle { + color: "transparent" + } - itemName: CurrentCall.isRecordingLocally ? - JamiStrings.stopRec : - JamiStrings.startRec - iconSource: JamiResources.fiber_manual_record_24dp_svg - iconColor: JamiTheme.recordIconColor - onClicked: { - root.recordCallClicked() - } - }, - GeneralMenuItem { - id: fullScreen + contentItem: Rectangle { + id: container + width: childrenRect.width + height: childrenRect.height + color: "#c4272727" + radius: 4 - itemName: layoutManager.isCallFullscreen ? - JamiStrings.exitFullScreen : - JamiStrings.viewFullScreen - iconSource: layoutManager.isCallFullscreen ? - JamiResources.close_fullscreen_24dp_svg : - JamiResources.open_in_full_24dp_svg - onClicked: { - callStackView.toggleFullScreen() - } - }, - GeneralMenuItem { - id: stopSharing + ColumnLayout { + anchors.topMargin: 8 + anchors.bottomMargin: 8 + ListView { + id: itemListView - canTrigger: CurrentCall.isSharing - && !CurrentCall.isSIP - && !CurrentCall.isVideoMuted - itemName: JamiStrings.stopSharing - iconSource: JamiResources.share_stop_black_24dp_svg - iconColor: JamiTheme.redColor - onClicked: AvAdapter.stopSharing(CurrentCall.sharingSource) - }, - GeneralMenuItem { - id: shareScreen + orientation: ListView.Vertical + implicitWidth: 200 + implicitHeight: 100 + interactive: false - canTrigger: CurrentAccount.videoEnabled_Video - && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY - && !CurrentCall.isSIP - itemName: JamiStrings.shareScreen - iconSource: JamiResources.laptop_black_24dp_svg - onClicked: { - if (Qt.application.screens.length === 1) { - AvAdapter.shareEntireScreen(0) - } else { - windowSelection = false - openSelectionWindow() - } - } - }, - GeneralMenuItem { - id: shareWindow + model: actionsModel + delegate: ItemDelegate { + id: menuItem - canTrigger: CurrentAccount.videoEnabled_Video - && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY - && !CurrentCall.isSIP - itemName: JamiStrings.shareWindow - iconSource: JamiResources.window_black_24dp_svg - onClicked: { - AvAdapter.getListWindows() - if (AvAdapter.windowsNames.length >= 1) { - windowSelection = true - openSelectionWindow() - } - } - }, - GeneralMenuItem { - id: shareScreenArea + width: 200 + height: Top || Bottom ? 10 : 45 - canTrigger: CurrentAccount.videoEnabled_Video - && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY - && !CurrentCall.isSIP - && Qt.platform.os.toString() !== "windows" // temporarily disable for windows - itemName: JamiStrings.shareScreenArea - iconSource: JamiResources.share_area_black_24dp_svg - onClicked: { - if (Qt.platform.os !== "windows") { - AvAdapter.shareScreenArea(0, 0, 0, 0) - } else { - ScreenRubberBandCreation.createScreenRubberBandWindowObject() - ScreenRubberBandCreation.showScreenRubberBandWindow() - } - } - }, - GeneralMenuItem { - id: shareFile + background: Rectangle { + visible: !Top && !Bottom + anchors.fill: parent + color: menuItem.down ? "#c4aaaaaa" : menuItem.hovered ? "#c4777777" : "transparent" + } - canTrigger: CurrentAccount.videoEnabled_Video - && !CurrentCall.isSIP - itemName: JamiStrings.shareFile - iconSource: JamiResources.file_black_24dp_svg - onClicked: { - jamiFileDialog.open() - } - }, - GeneralMenuItem { - id: viewPlugin + RowLayout { + anchors.fill: parent + visible: !Top && !Bottom + ResponsiveImage { + Layout.leftMargin: JamiTheme.preferredMarginSize + source: IconSource + color: "white" + width: 20 + height: 20 + } + Text { + Layout.fillWidth: true + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + text: Name + elide: Text.ElideRight + font.pointSize: JamiTheme.participantFontSize + color: "white" + } + } - canTrigger: PluginAdapter.isEnabled && - PluginAdapter.callMediaHandlersListCount - itemName: JamiStrings.viewPlugin - iconSource: JamiResources.extension_24dp_svg - onClicked: { - root.pluginItemClicked() - } - }, - GeneralMenuItem { - id: advancedInformation + onClicked: { + switch(Name) { + case JamiStrings.advancedInformation: + CallAdapter.startTimerInformation() + callInformationOverlay.open() + break + case JamiStrings.tileScreenshot: + if (CallAdapter.takeScreenshot(videoProvider.captureRawVideoFrame(hoveredOverlaySinkId), + UtilsAdapter.getDirScreenshot())) { + screenshotTaken() + } + break + } + root.close() + } - canTrigger: true - itemName: JamiStrings.advancedInformation - iconSource: JamiResources.settings_24dp_svg - - onClicked: { - CallAdapter.startTimerInformation(); - callInformationOverlay.open() - } - }, - GeneralMenuItem { - id: screenShot - - canTrigger: hoveredOverlayUri !== "" && hoveredOverVideoMuted === false - itemName: JamiStrings.tileScreenshot - iconSource: JamiResources.baseline_camera_alt_24dp_svg - - MaterialToolTip { - id: tooltip - - parent: screenShot - visible: screenShot.itemHovered - delay: Qt.styleHints.mousePressAndHoldInterval - property bool isMe: CurrentAccount.uri === hoveredOverlayUri - text: isMe ? JamiStrings.me - : UtilsAdapter.getBestNameForUri(CurrentAccount.id, hoveredOverlayUri) - } - - onClicked: { - if (CallAdapter.takeScreenshot(videoProvider.captureRawVideoFrame(hoveredOverlaySinkId), - UtilsAdapter.getDirScreenshot())) { - screenshotTaken() + onHoveredChanged: { + if (Name === JamiStrings.tileScreenshot) { + screenshotButtonHovered = hovered + } + } } } } - ] - - - Component.onCompleted: menuItemsToLoad = menuItems + } } diff --git a/src/app/mainview/components/ParticipantOverlay.qml b/src/app/mainview/components/ParticipantOverlay.qml index d83f59a9..2aa3d9cb 100644 --- a/src/app/mainview/components/ParticipantOverlay.qml +++ b/src/app/mainview/components/ParticipantOverlay.qml @@ -106,7 +106,7 @@ Item { Rectangle { z: -1 - border.color: JamiTheme.buttonTintedBlue + border.color: voiceActive ? JamiTheme.buttonTintedBlue : "yellow" border.width: 2 color: "transparent" radius: 10