blob: eafbaffe97273b89e5bf0ab22477ee0a2f9a3e99 [file] [log] [blame]
/*
* Copyright (C) 2020 by Savoir-faire Linux
* Author: Mingrui Zhang <mingrui.zhang@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.Window 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
import QtQuick.Controls.Universal 2.12
import net.jami.Models 1.0
import "../../commoncomponents"
/*
* IncomingCallPage as a seperate window,
* exist at the right bottom, as a notification to user that
* a call is incoming.
*/
Window {
id: incomingCallPage
property int minWidth: 300
property int minHeight: 400
/*
* The unique identifier for incomingCallPage
*/
property string responsibleAccountId: ""
property string responsibleConvUid: ""
property string contactImgSource: ""
property string bestName: "Best Name"
property string bestId: "Best Id"
property int buttonPreferredSize: 50
property variant clickPos: "1,1"
function updateUI() {
incomingCallPage.contactImgSource = "data:image/png;base64,"
+ ClientWrapper.utilsAdaptor.getContactImageString(responsibleAccountId,
responsibleConvUid)
incomingCallPage.bestName = ClientWrapper.utilsAdaptor.getBestName(
responsibleAccountId, responsibleConvUid)
var id = ClientWrapper.utilsAdaptor.getBestId(responsibleAccountId,
responsibleConvUid)
incomingCallPage.bestId = (incomingCallPage.bestName !== id) ? id : ""
}
function updatePositionToRightBottom() {
/*
* Screen right bottom,
* since the qt screen.virtualY, virtualX does not work properly,
* we need to calculate the screen x, y ourselves, by
* using to fact that window will always be in the middle if no x or y
* specificed.
* ex: https://doc.qt.io/qt-5/qscreen.html#geometry-prop
*/
var virtualX = (incomingCallPage.x + width / 2) - screen.width / 2
incomingCallPage.x = virtualX + screen.width - width
incomingCallPage.y = screen.height - height - 50
}
minimumWidth: minWidth
minimumHeight: minHeight
maximumWidth: minWidth + 300
maximumHeight: minHeight + 300
flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint
screen: Qt.application.screens[0]
Rectangle {
id: incomingCallPageColumnLayoutMainRect
anchors.fill: parent
radius: 15
color: "black"
/*
* Simulate window drag. (top with height 30).
*/
MouseArea {
id: dragMouseArea
anchors.left: incomingCallPageColumnLayoutMainRect.left
anchors.top: incomingCallPageColumnLayoutMainRect.top
width: incomingCallPageColumnLayoutMainRect.width - closeButton.width - 10
height: 30
onPressed: {
clickPos = Qt.point(mouse.x, mouse.y)
}
onPositionChanged: {
var delta = Qt.point(mouse.x - clickPos.x, mouse.y - clickPos.y)
incomingCallPage.x += delta.x
incomingCallPage.y += delta.y
}
}
HoverableButton {
id: closeButton
anchors.top: incomingCallPageColumnLayoutMainRect.top
anchors.topMargin: 10
anchors.right: incomingCallPageColumnLayoutMainRect.right
anchors.rightMargin: 10
width: 30
height: 30
radius: 30
source: "qrc:/images/icons/ic_close_white_24dp.png"
backgroundColor: "black"
onEnterColor: JamiTheme.closeButtonLighterBlack
onExitColor: "black"
onPressColor: JamiTheme.declineButtonPressedRed
onReleaseColor: "black"
onClicked: {
incomingCallPage.close()
CallAdapter.refuseACall(responsibleAccountId,
responsibleConvUid)
}
}
ColumnLayout {
id: incomingCallPageColumnLayout
anchors.fill: parent
Image {
id: contactImg
Layout.alignment: Qt.AlignCenter
Layout.topMargin: 30
Layout.preferredWidth: 100
Layout.preferredHeight: 100
fillMode: Image.PreserveAspectFit
source: contactImgSource
}
Rectangle {
id: incomingCallPageTextRect
Layout.alignment: Qt.AlignCenter
Layout.topMargin: 5
Layout.preferredWidth: incomingCallPage.width
Layout.preferredHeight: jamiBestNameText.height + jamiBestIdText.height
+ talkToYouText.height + 20
ColumnLayout {
id: incomingCallPageTextRectColumnLayout
Text {
id: jamiBestNameText
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: incomingCallPageTextRect.width
Layout.preferredHeight: 50
font.pointSize: JamiTheme.textFontSize + 3
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: textMetricsjamiBestNameText.elidedText
color: "white"
TextMetrics {
id: textMetricsjamiBestNameText
font: jamiBestNameText.font
text: bestName
elideWidth: incomingCallPageTextRect.width - 30
elide: Qt.ElideMiddle
}
}
Text {
id: jamiBestIdText
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: incomingCallPageTextRect.width
Layout.preferredHeight: 30
font.pointSize: JamiTheme.textFontSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: textMetricsjamiBestIdText.elidedText
color: "white"
TextMetrics {
id: textMetricsjamiBestIdText
font: jamiBestIdText.font
text: bestId
elideWidth: incomingCallPageTextRect.width - 30
elide: Qt.ElideMiddle
}
}
Text {
id: talkToYouText
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: incomingCallPageTextRect.width
Layout.preferredHeight: 30
font.pointSize: JamiTheme.textFontSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: "white"
text: "is calling you"
}
}
color: "transparent"
}
RowLayout {
id: incomingCallPageRowLayout
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
Layout.bottomMargin: 5
Layout.preferredWidth: incomingCallPage.width - 100
Layout.preferredHeight: buttonPreferredSize
ColumnLayout {
id: callAnswerButtonColumnLayout
Layout.alignment: Qt.AlignLeft
HoverableButton {
id: callAnswerButton
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: buttonPreferredSize
Layout.preferredHeight: buttonPreferredSize
backgroundColor: JamiTheme.acceptButtonGreen
onEnterColor: JamiTheme.acceptButtonHoverGreen
onPressColor: JamiTheme.acceptButtonPressedGreen
onReleaseColor: JamiTheme.acceptButtonHoverGreen
onExitColor: JamiTheme.acceptButtonGreen
buttonImageHeight: buttonPreferredSize / 2
buttonImageWidth: buttonPreferredSize / 2
source: "qrc:/images/icons/ic_check_white_18dp_2x.png"
radius: 30
onClicked: {
incomingCallPage.close()
CallAdapter.acceptACall(responsibleAccountId,
responsibleConvUid)
}
}
Text {
id: answerText
Layout.alignment: Qt.AlignCenter
font.pointSize: JamiTheme.textFontSize - 2
text: qsTr("Answer")
}
}
ColumnLayout {
id: callDeclineButtonColumnLayout
Layout.alignment: Qt.AlignRight
HoverableButton {
id: callDeclineButton
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: buttonPreferredSize
Layout.preferredHeight: buttonPreferredSize
backgroundColor: JamiTheme.declineButtonRed
onEnterColor: JamiTheme.declineButtonHoverRed
onPressColor: JamiTheme.declineButtonPressedRed
onReleaseColor: JamiTheme.declineButtonHoverRed
onExitColor: JamiTheme.declineButtonRed
buttonImageHeight: buttonPreferredSize / 2
buttonImageWidth: buttonPreferredSize / 2
source: "qrc:/images/icons/ic_close_white_24dp.png"
radius: 30
onClicked: {
incomingCallPage.close()
CallAdapter.refuseACall(responsibleAccountId,
responsibleConvUid)
}
}
Text {
id: ignoreText
Layout.alignment: Qt.AlignCenter
font.pointSize: JamiTheme.textFontSize - 2
text: qsTr("Ignore")
}
}
}
}
}
color: "transparent"
}