Skip to content
Snippets Groups Projects
PlaceCall.qml 4.87 KiB
Newer Older
Nicolas Werner's avatar
Nicolas Werner committed
// SPDX-FileCopyrightText: 2021 Nheko Contributors
Nicolas Werner's avatar
Nicolas Werner committed
// SPDX-License-Identifier: GPL-3.0-or-later

trilene's avatar
trilene committed
import "../"
trilene's avatar
trilene committed
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
trilene's avatar
trilene committed
import im.nheko 1.0

trilene's avatar
trilene committed
Popup {
    modal: true
    // only set the anchors on Qt 5.12 or higher
    // see https://doc.qt.io/qt-5/qml-qtquick-controls2-popup.html#anchors.centerIn-prop
    Component.onCompleted: {
        if (anchors)
            anchors.centerIn = parent;

    }
    palette: Nheko.colors
trilene's avatar
trilene committed
    Component {
        id: deviceError
trilene's avatar
trilene committed
        DeviceError {
        }
    Component {
        id: screenShareDialog

        ScreenShare {
        }

    }

trilene's avatar
trilene committed
    ColumnLayout {
        id: columnLayout
trilene's avatar
trilene committed
        spacing: 16

        RowLayout {
trilene's avatar
trilene committed
            Layout.topMargin: 8
trilene's avatar
trilene committed
            Layout.leftMargin: 8

            Label {
                text: qsTr("Place a call to %1?").arg(room.roomName)
                color: Nheko.colors.windowText
trilene's avatar
trilene committed
            }

            Item {
                Layout.fillWidth: true
            }
trilene's avatar
trilene committed
        }

        RowLayout {
            id: buttonLayout
trilene's avatar
trilene committed

            function validateMic() {
                if (CallManager.mics.length == 0) {
trilene's avatar
trilene committed
                    var dialog = deviceError.createObject(timelineRoot, {
                        "errorString": qsTr("No microphone found."),
                        "image": ":/icons/icons/ui/place-call.png"
trilene's avatar
trilene committed
                    });
                    dialog.open();
trilene's avatar
trilene committed
                    return false;
                }
                return true;
            }

            Layout.leftMargin: 8
            Layout.rightMargin: 8

trilene's avatar
trilene committed
            Avatar {
trilene's avatar
trilene committed
                Layout.rightMargin: cameraCombo.visible ? 16 : 64
                width: Nheko.avatarSize
                height: Nheko.avatarSize
                url: room.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
                displayName: room.roomName
                onClicked: TimelineManager.openImageOverlay(room.avatarUrl(userid), room.data.eventId)
trilene's avatar
trilene committed
            }

            Button {
Nicolas Werner's avatar
Nicolas Werner committed
                text: qsTr("Voice")
trilene's avatar
trilene committed
                icon.source: "qrc:/icons/icons/ui/place-call.png"
                onClicked: {
                    if (buttonLayout.validateMic()) {
                        Settings.microphone = micCombo.currentText;
                        CallManager.sendInvite(room.roomId, CallType.VOICE);
trilene's avatar
trilene committed
                        close();
                    }
                }
            }

            Button {
                visible: CallManager.cameras.length > 0
Nicolas Werner's avatar
Nicolas Werner committed
                text: qsTr("Video")
trilene's avatar
trilene committed
                icon.source: "qrc:/icons/icons/ui/video-call.png"
                onClicked: {
                    if (buttonLayout.validateMic()) {
                        Settings.microphone = micCombo.currentText;
                        Settings.camera = cameraCombo.currentText;
                        CallManager.sendInvite(room.roomId, CallType.VIDEO);
            Button {
                visible: CallManager.screenShareSupported
                text: qsTr("Screen")
                icon.source: "qrc:/icons/icons/ui/screen-share.png"
                onClicked: {
                    var dialog = screenShareDialog.createObject(timelineRoot);
                    dialog.open();
                    close();
                }
            }

trilene's avatar
trilene committed
            Button {
                text: qsTr("Cancel")
                onClicked: {
                    close();
                }
            }
trilene's avatar
trilene committed
        ColumnLayout {
            spacing: 8
trilene's avatar
trilene committed
            RowLayout {
                Layout.leftMargin: 8
                Layout.rightMargin: 8
trilene's avatar
trilene committed
                Layout.bottomMargin: cameraCombo.visible ? 0 : 8
trilene's avatar
trilene committed
                Image {
                    Layout.preferredWidth: 22
                    Layout.preferredHeight: 22
                    source: "image://colorimage/:/icons/icons/ui/microphone-unmute.png?" + Nheko.colors.windowText
trilene's avatar
trilene committed
                }
trilene's avatar
trilene committed
                ComboBox {
                    id: micCombo
trilene's avatar
trilene committed
                    Layout.fillWidth: true
                    model: CallManager.mics
                }
trilene's avatar
trilene committed
            }
trilene's avatar
trilene committed
            RowLayout {
                visible: CallManager.cameras.length > 0
                Layout.leftMargin: 8
                Layout.rightMargin: 8
trilene's avatar
trilene committed
                Layout.bottomMargin: 8
trilene's avatar
trilene committed

                Image {
                    Layout.preferredWidth: 22
                    Layout.preferredHeight: 22
                    source: "image://colorimage/:/icons/icons/ui/video-call.png?" + Nheko.colors.windowText
trilene's avatar
trilene committed
                }
trilene's avatar
trilene committed
                ComboBox {
                    id: cameraCombo
trilene's avatar
trilene committed
                    Layout.fillWidth: true
                    model: CallManager.cameras
                }

    background: Rectangle {
        color: Nheko.colors.window
        border.color: Nheko.colors.windowText