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