blob: 23da3fd700184a619072fef6b35d1437f70e9a46 [file] [log] [blame]
/**
* Copyright (C) 2020 by Savoir-faire Linux
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
* Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
* Author: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtGraphicalEffects 1.12
import net.jami.Models 1.0
import "../../commoncomponents"
import "../js/videodevicecontextmenuitemcreation.js" as VideoDeviceContextMenuItemCreation
import "../js/selectscreenwindowcreation.js" as SelectScreenWindowCreation
Menu {
id: root
property int generalMenuSeparatorCount: 0
property int commonBorderWidth: 1
signal pluginItemClicked
font.pointSize: JamiTheme.textFontSize+3
property bool isSIP: false
property bool isPaused: false
property bool isAudioOnly: false
property bool isRecording: false
signal transferCallButtonClicked
function activate() {
var deviceContextMenuInfoMap = AvAdapter.populateVideoDeviceContextMenuItem()
/*
* Somehow, the map size is undefined, so use this instead.
*/
var mapSize = deviceContextMenuInfoMap["size"]
var count = 2
for (var deviceName in deviceContextMenuInfoMap) {
if (deviceName === "size" || root.isAudioOnly)
continue
if (videoDeviceItem.itemName === "No video device") {
videoDeviceItem.checkable = true
videoDeviceItem.itemName = deviceName
videoDeviceItem.checked = deviceContextMenuInfoMap[deviceName]
if (count === mapSize)
root.open()
} else {
VideoDeviceContextMenuItemCreation.createVideoDeviceContextMenuItemObjects(
deviceName, deviceContextMenuInfoMap[deviceName],
count === mapSize)
}
count++
}
root.open()
}
Component.onCompleted: {
VideoDeviceContextMenuItemCreation.setVideoContextMenuObject(root)
}
onClosed: {
videoDeviceItem.itemName = "No video device"
VideoDeviceContextMenuItemCreation.removeCreatedItems()
}
JamiFileDialog {
id: jamiFileDialog
mode: JamiFileDialog.Mode.OpenFile
onAccepted: {
// No need to trim file:///.
AvAdapter.shareFile(jamiFileDialog.file)
}
}
/*
* All GeneralMenuItems should remain the same width / height.
*/
GeneralMenuItem {
id: holdCallButton
visible: isSIP
height: isSIP? undefined : 0
itemName: isPaused? qsTr("Resume call") : qsTr("Hold call")
iconSource: isPaused? "qrc:/images/icons/play_circle_outline-24px.svg" : "qrc:/images/icons/pause_circle_outline-24px.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
onClicked: {
CallAdapter.holdThisCallToggle()
root.close()
}
}
GeneralMenuItem {
id: transferCallButton
visible: isSIP
height: isSIP? undefined : 0
itemName: qsTr("Transfer call")
iconSource: "qrc:/images/icons/phone_forwarded-24px.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
onClicked: {
root.transferCallButtonClicked()
root.close()
}
}
GeneralMenuSeparator {
preferredWidth: startRecordingItem.preferredWidth
preferredHeight: commonBorderWidth
visible: isSIP
height: isSIP? undefined : 0
Component.onCompleted: {
generalMenuSeparatorCount++
}
}
GeneralMenuItem {
id: startRecordingItem
itemName: isRecording? qsTr("Stop recording") : qsTr("Start recording")
iconSource: "qrc:/images/icons/ic_video_call_24px.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
onClicked: {
root.close()
CallAdapter.recordThisCallToggle()
}
}
GeneralMenuItem {
id: fullScreenItem
itemName: videoCallPage.isFullscreen ? qsTr("Exit full screen") : qsTr(
"Full screen mode")
iconSource: videoCallPage.isFullscreen ? "qrc:/images/icons/close_fullscreen-24px.svg" : "qrc:/images/icons/open_in_full-24px.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
onClicked: {
root.close()
videoCallPageRect.needToShowInFullScreen()
}
}
GeneralMenuSeparator {
preferredWidth: startRecordingItem.preferredWidth
preferredHeight: commonBorderWidth
Component.onCompleted: {
generalMenuSeparatorCount++
}
}
VideoCallPageContextMenuDeviceItem {
id: videoDeviceItem
visible: !isAudioOnly
height: !isAudioOnly? undefined : 0
contextMenuPreferredWidth: root.implicitWidth
}
GeneralMenuSeparator {
preferredWidth: startRecordingItem.preferredWidth
preferredHeight: commonBorderWidth
visible: !isAudioOnly
height: !isAudioOnly? undefined : 0
Component.onCompleted: {
generalMenuSeparatorCount++
}
}
GeneralMenuItem {
id: shareEntireScreenItem
itemName: qsTr("Share entire screen")
iconSource: "qrc:/images/icons/screen_share-24px.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
visible: !isAudioOnly
height: !isAudioOnly? undefined : 0
onClicked: {
root.close()
if (Qt.application.screens.length === 1) {
AvAdapter.shareEntireScreen(0)
} else {
SelectScreenWindowCreation.createSelectScreenWindowObject()
SelectScreenWindowCreation.showSelectScreenWindow()
}
}
}
GeneralMenuItem {
id: shareScreenAreaItem
itemName: qsTr("Share screen area")
iconSource: "qrc:/images/icons/screen_share-24px.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
visible: !isAudioOnly
height: !isAudioOnly? undefined : 0
onClicked: {
root.close()
if (Qt.application.screens.length === 1) {
ScreenRubberBandCreation.createScreenRubberBandWindowObject(
null, 0)
ScreenRubberBandCreation.showScreenRubberBandWindow()
} else {
SelectScreenWindowCreation.createSelectScreenWindowObject(true)
SelectScreenWindowCreation.showSelectScreenWindow()
}
}
}
GeneralMenuItem {
id: shareFileItem
itemName: qsTr("Share file")
iconSource: "qrc:/images/icons/insert_photo-24px.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
visible: !isAudioOnly
height: !isAudioOnly? undefined : 0
onClicked: {
root.close()
jamiFileDialog.open()
}
}
/* TODO: In the future we want to implement this
GeneralMenuItem {
id: advancedInfosItem
itemName: qsTr("Advanced informations")
iconSource: "qrc:/images/icons/info-24px.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
onClicked: {
root.close()
}
}*/
GeneralMenuItem {
id: pluginItem
itemName: qsTr("Toggle plugin")
iconSource: "qrc:/images/icons/extension_24dp.svg"
leftBorderWidth: commonBorderWidth
rightBorderWidth: commonBorderWidth
onClicked: {
root.pluginItemClicked()
root.close()
}
}
background: Rectangle {
implicitWidth: startRecordingItem.preferredWidth
implicitHeight: startRecordingItem.preferredHeight
* (root.count
- (isSIP? 0 : 2)
- (isAudioOnly? 6 : 0)
- generalMenuSeparatorCount)
border.width: commonBorderWidth
border.color: JamiTheme.tabbarBorderColor
}
}