Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • beta/202505231812
  • stable/20250523.0
  • nightly/20250523.0
  • nightly/20250515.0
  • nightly/20250510.0
  • nightly/20250509.1
  • nightly/20250509.0
  • stable/20250430.1
  • stable/20250430.0
  • beta/202504301614
  • nightly/20250430.0
  • stable/20250424.1
  • beta/202504241506
  • stable/20250424.0
  • nightly/20250424.1
  • nightly/20250424.0
  • nightly/20250422.0
  • beta/202504120241
  • stable/20250411.0
  • nightly/20250411.0
21 results

DaemonReconnectWindow.qml

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    DaemonReconnectWindow.qml 6.56 KiB
    /*
     * 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.14
    import QtGraphicalEffects 1.14
    
    // Should not import anything other than this
    // to make sure that it is self-dependent
    import net.jami.Models 1.0
    
    import "commoncomponents"
    
    ApplicationWindow {
        id: root
    
        property bool connectionFailed: false
        property int preferredMargin: 15
    
        Universal.theme: Universal.Light
    
        title: "Jami"
    
        width: 600
        height: 500
        minimumWidth: 600
        minimumHeight: 500
    
        visible: true
    
        TextMetrics {
            id: textMetrics
        }
    
        function getTextBoundingRect(font, text) {
            textMetrics.font = font
            textMetrics.text = text
    
            return textMetrics.boundingRect
        }
    
        ResponsiveImage {
            id: jamiLogoImage
    
            anchors.fill: parent
    
            smooth: true
            antialiasing: true
            source: "qrc:/images/logo-jami-standard-coul.svg"
        }
    
        Popup {
            id: popup
    
            // center in parent
            x: Math.round((root.width - width) / 2)
            y: Math.round((root.height - height) / 2)
    
            modal: true
            visible: false
            closePolicy: Popup.NoAutoClose
    
            contentItem: Rectangle {
                id: contentRect
    
                implicitHeight: daemonReconnectPopupColumnLayout.implicitHeight + 50
    
                ColumnLayout {
                    id: daemonReconnectPopupColumnLayout
    
                    anchors.fill: parent
    
                    spacing: 0
    
                    Text {
                        id: daemonReconnectPopupTextLabel
    
                        Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
                        Layout.topMargin: preferredMargin
    
                        text: connectionFailed ?
                                  qsTr("Could not re-connect to the Jami daemon (dring).\nJami will now quit.") :
                                  qsTr("Trying to reconnect to the Jami daemon (dring)…")
                        font.pointSize: 11
                        horizontalAlignment: Text.AlignHCenter
                        verticalAlignment: Text.AlignVCenter
    
                        Component.onCompleted: {
                            contentRect.implicitWidth = getTextBoundingRect(
                                        font, text).width + 100
                        }
                    }
    
                    AnimatedImage {
                        Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
                        Layout.preferredHeight: 30
                        Layout.preferredWidth: 30
                        Layout.bottomMargin: preferredMargin
    
                        visible: !connectionFailed
    
                        source: "qrc:/images/jami_rolling_spinner.gif"
    
                        playing: true
                        paused: false
                        mipmap: true
                        smooth: true
                        fillMode: Image.PreserveAspectFit
                    }
    
                    Button {
                        id: btnOk
    
                        Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
                        Layout.preferredWidth: 128
                        Layout.preferredHeight: 32
                        Layout.bottomMargin: preferredMargin
                        visible: connectionFailed
    
                        property color hoveredColor: "#0e81c5"
                        property color pressedColor: "#273261"
                        property color normalColor: "#00aaff"
    
                        contentItem: Item {
                            Rectangle {
                                anchors.fill: parent
                                color: "transparent"
    
                                Text {
                                    id: buttonText
    
                                    anchors.centerIn: parent
    
                                    width: {
                                        return (parent.width / 2 - 18) * 2
                                    }
    
                                    text: qsTr("Ok")
    
                                    color: {
                                        if (btnOk.hovered)
                                            return btnOk.hoveredColor
                                        if (btnOk.checked)
                                            return btnOk.pressedColor
                                        return btnOk.normalColor
                                    }
                                    font: root.font
                                    horizontalAlignment: Text.AlignHCenter
                                }
                            }
                        }
    
                        onClicked: Qt.quit()
    
                        background: Rectangle {
                            id: backgroundRect
                            anchors.fill: parent
                            color: "transparent"
                            border.color: {
                                if (btnOk.hovered)
                                    return btnOk.hoveredColor
                                if (btnOk.checked)
                                    return btnOk.pressedColor
                                return btnOk.normalColor
                            }
                            radius: 4
                        }
                    }
                }
            }
        }
    
        Connections {
            target: DBusErrorHandler
    
            function onShowDaemonReconnectPopup(visible) {
                if (visible)
                    popup.open()
                else {
                    popup.close()
                    Qt.quit()
                }
            }
    
            function onDaemonReconnectFailed() {
                root.connectionFailed = true
            }
        }
    
        overlay.modal: ColorOverlay {
            source: root.contentItem
            color: "transparent"
    
            // Color animation for overlay when pop up is shown.
            ColorAnimation on color {
                to: Qt.rgba(0, 0, 0, 0.33)
                duration: 500
            }
        }
    
        Component.onCompleted: {
            DBusErrorHandler.setActive(true)
    
            x = Screen.width / 2 - width / 2
            y = Screen.height / 2 - height / 2
        }
    }