linphone-desktop/Linphone/view/App/Layout/MainLayout.qml
2024-04-22 18:16:32 +02:00

379 lines
11 KiB
QML

/**
* Qml template used for welcome and login/register pages
**/
import QtCore
import QtQuick 2.15
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.2 as Control
import QtQuick.Effects
import Linphone
import UtilsCpp
Item {
id: mainItem
property var callObj
signal addAccountRequest()
function goToNewCall() {
tabbar.currentIndex = 0
callPage.goToNewCall()
}
function transferCallSucceed() {
transferSucceedPopup.open()
}
Timer {
id: autoClosePopup
interval: 5000
onTriggered: {
transferSucceedPopup.close()
}
}
Popup {
id: transferSucceedPopup
onVisibleChanged: if (visible) autoClosePopup.restart()
closePolicy: Control.Popup.NoAutoClose
x : parent.x + parent.width - width
y : parent.y + parent.height - height
rightMargin: 20 * DefaultStyle.dp
bottomMargin: 20 * DefaultStyle.dp
padding: 20 * DefaultStyle.dp
underlineColor: DefaultStyle.success_500main
radius: 0
contentItem: RowLayout {
spacing: 15 * DefaultStyle.dp
EffectImage {
imageSource: AppIcons.smiley
colorizationColor: DefaultStyle.success_500main
Layout.preferredWidth: 32 * DefaultStyle.dp
Layout.preferredHeight: 32 * DefaultStyle.dp
width: 32 * DefaultStyle.dp
height: 32 * DefaultStyle.dp
}
Rectangle {
Layout.preferredWidth: 1 * DefaultStyle.dp
Layout.preferredHeight: parent.height
color: DefaultStyle.main2_200
}
ColumnLayout {
Text {
text: qsTr("Appel transféré")
color: DefaultStyle.success_500main
font {
pixelSize: 16 * DefaultStyle.dp
weight: 800 * DefaultStyle.dp
}
}
Text {
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
text: qsTr("Votre correspondant a été transféré au contact sélectionné")
color: DefaultStyle.main2_500main
font {
pixelSize: 12 * DefaultStyle.dp
weight: 300 * DefaultStyle.dp
}
}
}
}
}
Item{
anchors.fill: parent
ColumnLayout{
anchors.fill: parent
spacing: 0
Rectangle{
Layout.fillWidth: true
Layout.fillHeight: true
color: DefaultStyle.grey_0
}
RowLayout{
Layout.fillWidth: true
Layout.preferredHeight: tabbar.cornerRadius
spacing: 0
Item{// Transparent corner
Layout.fillHeight: true
Layout.preferredWidth: tabbar.cornerRadius
}
Rectangle{
Layout.fillWidth: true
Layout.fillHeight: true
color: DefaultStyle.grey_0
}
}
}
RowLayout {
anchors.fill: parent
spacing: 0
anchors.topMargin: 25 * DefaultStyle.dp
VerticalTabBar {
id: tabbar
Layout.fillHeight: true
Layout.preferredWidth: 82 * DefaultStyle.dp
model: [
{icon: AppIcons.phone, selectedIcon: AppIcons.phoneSelected, label: qsTr("Appels")},
{icon: AppIcons.adressBook, selectedIcon: AppIcons.adressBookSelected, label: qsTr("Contacts")},
{icon: AppIcons.chatTeardropText, selectedIcon: AppIcons.chatTeardropTextSelected, label: qsTr("Conversations")},
{icon: AppIcons.usersThree, selectedIcon: AppIcons.usersThreeSelected, label: qsTr("Réunions")}
]
}
ColumnLayout {
spacing:0
RowLayout {
id: topRow
Layout.preferredHeight: 50 * DefaultStyle.dp
Layout.leftMargin: 45 * DefaultStyle.dp
Layout.rightMargin: 41 * DefaultStyle.dp
spacing: 25 * DefaultStyle.dp
SearchBar {
id: magicSearchBar
Layout.fillWidth: true
placeholderText: qsTr("Rechercher un contact, appeler ou envoyer un message...")
onTextChanged: {
if (text.length != 0) listPopup.open()
else listPopup.close()
}
Popup {
id: listPopup
width: magicSearchBar.width
height: Math.min(magicSearchList.contentHeight + topPadding + bottomPadding, 400 * DefaultStyle.dp)
y: magicSearchBar.height
closePolicy: Popup.NoAutoClose
topPadding: 10 * DefaultStyle.dp
bottomPadding: 10 * DefaultStyle.dp
rightPadding: 10 * DefaultStyle.dp
leftPadding: 10 * DefaultStyle.dp
background: Item {
anchors.fill: parent
Rectangle {
id: popupBg
radius: 15 * DefaultStyle.dp
anchors.fill: parent
}
MultiEffect {
source: popupBg
anchors.fill: popupBg
shadowEnabled: true
shadowBlur: 1
shadowColor: DefaultStyle.grey_1000
shadowOpacity: 0.1
}
}
Control.ScrollBar {
id: scrollbar
height: parent.height
anchors.right: listPopup.right
}
contentItem: ContactsList {
id: magicSearchList
visible: magicSearchBar.text.length != 0
height: contentHeight
width: magicSearchBar.width
headerPositioning: ListView.OverlayHeader
rightMargin: 15 * DefaultStyle.dp
initialHeadersVisible: false
contactMenuVisible: false
actionLayoutVisible: true
model: MagicSearchProxy {
searchText: magicSearchBar.text.length === 0 ? "*" : magicSearchBar.text
aggregationFlag: LinphoneEnums.MagicSearchAggregation.Friend
}
Control.ScrollBar.vertical: scrollbar
header: Control.Control {
z: 2
width: magicSearchList.width
leftPadding: 10 * DefaultStyle.dp
rightPadding: 10 * DefaultStyle.dp
background: Rectangle {
color: DefaultStyle.grey_0
}
contentItem: ColumnLayout {
RowLayout {
Layout.fillWidth: true
spacing: 10 * DefaultStyle.dp
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: sipAddr.text
}
ColumnLayout {
Text {
text: magicSearchBar.text
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
}
}
Text {
id: sipAddr
text: UtilsCpp.generateLinphoneSipAddress(magicSearchBar.text)
}
}
Item {
Layout.fillWidth: true
}
Button {
background: Item{}
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
contentItem: Image {
anchors.fill: parent
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
source: AppIcons.phone
}
onClicked: {
mainItem.callObj = UtilsCpp.createCall(sipAddr.text)
}
}
Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
background: Item{}
contentItem: Image {
anchors.fill: parent
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
source: AppIcons.videoCamera
}
onClicked: mainItem.callObj = UtilsCpp.createCall(sipAddr.text, {'cameraEnabled':true})
}
}
Button {
Layout.fillWidth: true
Layout.preferredHeight: 30 * DefaultStyle.dp
color: DefaultStyle.main2_200
pressedColor: DefaultStyle.main2_400
background: Rectangle {
anchors.fill: parent
color: DefaultStyle.main2_200
}
contentItem: RowLayout {
spacing: 10 * DefaultStyle.dp
Image {
source: AppIcons.userPlus
}
Text {
text: qsTr("Ajouter ce contact")
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
capitalization: Font.AllUppercase
}
}
Item {Layout.fillWidth: true}
}
onClicked: {
var currentItem = mainStackLayout.children[mainStackLayout.currentIndex]
listPopup.close()
currentItem.createContact(magicSearchBar.text, sipAddr.text)
}
}
}
}
}
}
}
RowLayout {
spacing: 10 * DefaultStyle.dp
PopupButton {
id: avatarButton
AccountProxy{
id: accountProxy
//property bool haveAvatar: defaultAccount && defaultAccount.core.pictureUri || false
}
background.visible: false
Layout.preferredWidth: 54 * DefaultStyle.dp
Layout.preferredHeight: width
contentItem: Avatar {
id: avatar
height: avatarButton.height
width: avatarButton.width
account: accountProxy.defaultAccount
}
popup.x: width - popup.width
popup.padding: 0
popup.contentItem: ColumnLayout {
Accounts {
id: accounts
onAddAccountRequest: mainItem.addAccountRequest()
}
}
}
PopupButton {
id: settingsButton
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
popup.x: width - popup.width
popup.width: 271 * DefaultStyle.dp
popup.contentItem: ColumnLayout {
spacing: 20 * DefaultStyle.dp
IconLabelButton {
Layout.preferredHeight: 32 * DefaultStyle.dp
iconSize: 32 * DefaultStyle.dp
text: qsTr("Mon compte")
iconSource: AppIcons.manageProfile
onClicked: console.log("TODO : manage profile")
}
IconLabelButton {
Layout.preferredHeight: 32 * DefaultStyle.dp
iconSize: 32 * DefaultStyle.dp
text: qsTr("Paramètres")
iconSource: AppIcons.settings
}
IconLabelButton {
Layout.preferredHeight: 32 * DefaultStyle.dp
iconSize: 32 * DefaultStyle.dp
text: qsTr("Enregistrements")
iconSource: AppIcons.micro
}
IconLabelButton {
Layout.preferredHeight: 32 * DefaultStyle.dp
iconSize: 32 * DefaultStyle.dp
text: qsTr("Aide")
iconSource: AppIcons.question
}
Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: 1 * DefaultStyle.dp
color: DefaultStyle.main2_400
}
IconLabelButton {
Layout.preferredHeight: 32 * DefaultStyle.dp
iconSize: 32 * DefaultStyle.dp
text: qsTr("Ajouter un compte")
iconSource: AppIcons.plusCircle
onClicked: mainItem.addAccountRequest()
}
}
}
}
}
StackLayout {
id: mainStackLayout
currentIndex: tabbar.currentIndex
Layout.fillWidth: true
Layout.fillHeight: true
Layout.topMargin: 24 * DefaultStyle.dp
CallPage {
id: callPage
}
ContactPage{}
Item{}
//ConversationPage{}
MeetingPage{}
}
}
}
}
}