1// SPDX-FileCopyrightText: 2021 Nheko Contributors 2// 3// SPDX-License-Identifier: GPL-3.0-or-later 4 5import "../" 6import QtQuick 2.9 7import QtQuick.Controls 2.3 8import QtQuick.Layouts 1.2 9import im.nheko 1.0 10 11Popup { 12 closePolicy: Popup.NoAutoClose 13 width: parent.width 14 height: parent.height 15 palette: Nheko.colors 16 17 Component { 18 id: deviceError 19 20 DeviceError { 21 } 22 23 } 24 25 Connections { 26 function onNewInviteState() { 27 if (!CallManager.haveCallInvite) 28 close(); 29 30 } 31 32 target: CallManager 33 } 34 35 ColumnLayout { 36 anchors.top: parent.top 37 anchors.bottom: parent.bottom 38 anchors.horizontalCenter: parent.horizontalCenter 39 40 Label { 41 Layout.alignment: Qt.AlignCenter 42 Layout.topMargin: msgView.height / 25 43 text: CallManager.callPartyDisplayName 44 font.pointSize: fontMetrics.font.pointSize * 2 45 color: Nheko.colors.windowText 46 } 47 48 Avatar { 49 Layout.alignment: Qt.AlignCenter 50 width: msgView.height / 5 51 height: msgView.height / 5 52 url: CallManager.callPartyAvatarUrl.replace("mxc://", "image://MxcImage/") 53 userid: CallManager.callParty 54 displayName: CallManager.callPartyDisplayName 55 } 56 57 ColumnLayout { 58 Layout.alignment: Qt.AlignCenter 59 Layout.bottomMargin: msgView.height / 25 60 61 Image { 62 property string image: CallManager.callType == CallType.VIDEO ? ":/icons/icons/ui/video.svg" : ":/icons/icons/ui/place-call.svg" 63 64 Layout.alignment: Qt.AlignCenter 65 Layout.preferredWidth: msgView.height / 10 66 Layout.preferredHeight: msgView.height / 10 67 source: "image://colorimage/" + image + "?" + Nheko.colors.windowText 68 } 69 70 Label { 71 Layout.alignment: Qt.AlignCenter 72 text: CallManager.callType == CallType.VIDEO ? qsTr("Video Call") : qsTr("Voice Call") 73 font.pointSize: fontMetrics.font.pointSize * 2 74 color: Nheko.colors.windowText 75 } 76 77 } 78 79 ColumnLayout { 80 id: deviceCombos 81 82 property int imageSize: msgView.height / 20 83 84 Layout.alignment: Qt.AlignCenter 85 Layout.bottomMargin: msgView.height / 25 86 87 RowLayout { 88 Layout.alignment: Qt.AlignCenter 89 90 Image { 91 Layout.preferredWidth: deviceCombos.imageSize 92 Layout.preferredHeight: deviceCombos.imageSize 93 source: "image://colorimage/:/icons/icons/ui/microphone-unmute.svg?" + Nheko.colors.windowText 94 } 95 96 ComboBox { 97 id: micCombo 98 99 Layout.fillWidth: true 100 model: CallManager.mics 101 } 102 103 } 104 105 RowLayout { 106 visible: CallManager.callType == CallType.VIDEO && CallManager.cameras.length > 0 107 Layout.alignment: Qt.AlignCenter 108 109 Image { 110 Layout.preferredWidth: deviceCombos.imageSize 111 Layout.preferredHeight: deviceCombos.imageSize 112 source: "image://colorimage/:/icons/icons/ui/video.svg?" + Nheko.colors.windowText 113 } 114 115 ComboBox { 116 id: cameraCombo 117 118 Layout.fillWidth: true 119 model: CallManager.cameras 120 } 121 122 } 123 124 } 125 126 RowLayout { 127 id: buttonLayout 128 129 property int buttonSize: msgView.height / 8 130 131 function validateMic() { 132 if (CallManager.mics.length == 0) { 133 var dialog = deviceError.createObject(timelineRoot, { 134 "errorString": qsTr("No microphone found."), 135 "image": ":/icons/icons/ui/place-call.svg" 136 }); 137 dialog.open(); 138 return false; 139 } 140 return true; 141 } 142 143 Layout.alignment: Qt.AlignCenter 144 spacing: msgView.height / 6 145 146 RoundButton { 147 implicitWidth: buttonLayout.buttonSize 148 implicitHeight: buttonLayout.buttonSize 149 onClicked: { 150 CallManager.hangUp(); 151 close(); 152 } 153 154 background: Rectangle { 155 radius: buttonLayout.buttonSize / 2 156 color: "#ff0000" 157 } 158 159 contentItem: Image { 160 source: "image://colorimage/:/icons/icons/ui/end-call.svg?#ffffff" 161 } 162 163 } 164 165 RoundButton { 166 id: acceptButton 167 168 property string image: CallManager.callType == CallType.VIDEO ? ":/icons/icons/ui/video.svg" : ":/icons/icons/ui/place-call.svg" 169 170 implicitWidth: buttonLayout.buttonSize 171 implicitHeight: buttonLayout.buttonSize 172 onClicked: { 173 if (buttonLayout.validateMic()) { 174 Settings.microphone = micCombo.currentText; 175 if (cameraCombo.visible) 176 Settings.camera = cameraCombo.currentText; 177 178 CallManager.acceptInvite(); 179 close(); 180 } 181 } 182 183 background: Rectangle { 184 radius: buttonLayout.buttonSize / 2 185 color: "#00ff00" 186 } 187 188 contentItem: Image { 189 source: "image://colorimage/" + acceptButton.image + "?#ffffff" 190 } 191 192 } 193 194 } 195 196 } 197 198 background: Rectangle { 199 color: Nheko.colors.window 200 border.color: Nheko.colors.windowText 201 } 202 203} 204