Skip to content
Snippets Groups Projects
ProfilePage.qml 7.15 KiB
Newer Older
Sébastien Blin's avatar
Sébastien Blin committed
/*
 * Copyright (C) 2021 by Savoir-faire Linux
Sébastien Blin's avatar
Sébastien Blin committed
 * Author: Yang Wang <yang.wang@savoirfairelinux.com>
 * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
Sébastien Blin's avatar
Sébastien Blin committed
 *
 * 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.Layouts 1.14
Sébastien Blin's avatar
Sébastien Blin committed
import QtQuick.Controls 2.14
import net.jami.Adapters 1.0
import net.jami.Helpers 1.0
import net.jami.Models 1.0
Sébastien Blin's avatar
Sébastien Blin committed

import "../../commoncomponents"

Rectangle {
    id: root

    // trigger a default avatar prior to account generation
    property string createdAccountId: "dummy"
    property int preferredHeight: profilePageColumnLayout.implicitHeight
Sébastien Blin's avatar
Sébastien Blin committed
    function initializeOnShowUp() {
        createdAccountId = "dummy"
Sébastien Blin's avatar
Sébastien Blin committed
        clearAllTextFields()
        saveProfileBtn.spinnerTriggered = true
Sébastien Blin's avatar
Sébastien Blin committed
    }

    function clearAllTextFields() {
        aliasEdit.clear()
    }

    color: JamiTheme.backgroundColor

    Connections {
        target: WizardViewStepModel

        function onMainStepChanged() {
            if (WizardViewStepModel.mainStep === WizardViewStepModel.MainSteps.Profile) {
                initializeOnShowUp()
                root.showThisPage()
            }
        }

        function onAccountIsReady(accountId) {
            saveProfileBtn.spinnerTriggered = false
            createdAccountId = accountId
            aliasEdit.forceActiveFocus()
        }
    }

Sébastien Blin's avatar
Sébastien Blin committed
    ColumnLayout {
        id: profilePageColumnLayout

        spacing: JamiTheme.wizardViewPageLayoutSpacing
        width: parent.width
Sébastien Blin's avatar
Sébastien Blin committed
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter

        RowLayout {
            spacing: JamiTheme.wizardViewPageLayoutSpacing
            Layout.topMargin: JamiTheme.wizardViewPageBackButtonMargins
Sébastien Blin's avatar
Sébastien Blin committed
            Layout.preferredWidth: saveProfileBtn.width
            Layout.alignment: Qt.AlignCenter
Sébastien Blin's avatar
Sébastien Blin committed

            Label {
                text: JamiStrings.profileSharedWithContacts
                color: JamiTheme.textColor
Sébastien Blin's avatar
Sébastien Blin committed
                font.pointSize: JamiTheme.textFontSize + 3
            }

                Layout.alignment: Qt.AlignRight

                text: JamiStrings.optional
                bubbleColor: JamiTheme.wizardBlueButtons
Sébastien Blin's avatar
Sébastien Blin committed
            }
        }

        PhotoboothView {
            id: setAvatarWidget

            objectName: "setAvatarWidget"

            Layout.alignment: Qt.AlignCenter
            enabled: !saveProfileBtn.spinnerTriggered
            imageId: createdAccountId
            onFocusOnPreviousItem: {
                skipProfileSavingButton.forceActiveFocus()
            }

            onFocusOnNextItem: {
                aliasEdit.forceActiveFocus()
            }

            onVisibleChanged: {
                if (visible)
                    LRCInstance.currentAccountAvatarSet = false
            }
Sébastien Blin's avatar
Sébastien Blin committed
        }

        MaterialLineEdit {
            id: aliasEdit

            objectName: "aliasEdit"

            property string lastFirstChar
            Layout.preferredHeight: fieldLayoutHeight
            Layout.preferredWidth: fieldLayoutWidth
            Layout.alignment: Qt.AlignCenter

Sébastien Blin's avatar
Sébastien Blin committed
            selectByMouse: true
            enabled: !saveProfileBtn.spinnerTriggered
            placeholderText: {
                if (WizardViewStepModel.accountCreationOption !==
                        WizardViewStepModel.AccountCreationOption.CreateRendezVous)
                    return JamiStrings.enterYourName
                else
                    return JamiStrings.enterRVName
            }
            font.pointSize: JamiTheme.textFontSize
Sébastien Blin's avatar
Sébastien Blin committed
            font.kerning: true

            borderColorMode: MaterialLineEdit.NORMAL

            fieldLayoutWidth: saveProfileBtn.width
            KeyNavigation.tab: saveProfileBtn
            KeyNavigation.down: KeyNavigation.tab

            Keys.onPressed: function (keyEvent) {
                if (keyEvent.key === Qt.Key_Up) {
                    setAvatarWidget.focusOnPreviousPhotoBoothItem()
                    keyEvent.accepted = true
                }
            }

                if (LRCInstance.currentAccountAvatarSet)
                    return
                if (text.length === 0) {
                    lastFirstChar = ""
                    AccountAdapter.setCurrAccDisplayName(lastFirstChar)
                } else if (text.length == 1 && text.charAt(0) !== lastFirstChar) {
                    lastFirstChar = text.charAt(0)
                    AccountAdapter.setCurrAccDisplayName(lastFirstChar)
Sébastien Blin's avatar
Sébastien Blin committed
            id: saveProfileBtn
            objectName: "saveProfileBtn"

            Layout.alignment: Qt.AlignCenter

            preferredWidth: JamiTheme.wizardButtonWidth
            normalText: JamiStrings.saveProfile
            spinnerTriggeredtext: {
                if (WizardViewStepModel.accountCreationOption ===
                        WizardViewStepModel.AccountCreationOption.CreateRendezVous)
                    return JamiStrings.generatingRV
                else
                    return JamiStrings.creatingAccount
            }

            KeyNavigation.tab: skipProfileSavingButton
            KeyNavigation.up: aliasEdit
            KeyNavigation.down: KeyNavigation.tab

            onClicked: {
                AccountAdapter.setCurrAccDisplayName(aliasEdit.text)
                WizardViewStepModel.nextStep()
            }
Sébastien Blin's avatar
Sébastien Blin committed
        }

        MaterialButton {
            id: skipProfileSavingButton

            objectName: "skipProfileSavingButton"

            Layout.alignment: Qt.AlignCenter

            preferredWidth: JamiTheme.wizardButtonWidth
            text: JamiStrings.skip
Sébastien Blin's avatar
Sébastien Blin committed
            enabled: saveProfileBtn.enabled
            color: enabled? JamiTheme.buttonTintedGrey : JamiTheme.buttonTintedGreyInactive
            hoveredColor: JamiTheme.buttonTintedGreyHovered
            pressedColor: JamiTheme.buttonTintedGreyPressed
Sébastien Blin's avatar
Sébastien Blin committed
            outlined: true

            KeyNavigation.up: saveProfileBtn

            Keys.onPressed: function (keyEvent) {
                if (keyEvent.key === Qt.Key_Down ||
                        keyEvent.key === Qt.Key_Tab) {
                    setAvatarWidget.focusOnNextPhotoBoothItem()
                    keyEvent.accepted = true
                }
            }

Sébastien Blin's avatar
Sébastien Blin committed
            onClicked: {
                AccountAdapter.setCurrentAccountAvatarBase64()
                aliasEdit.clear()
                WizardViewStepModel.nextStep()