qtgrpc/examples/grpc/chat/client/Main.qml

152 lines
4.1 KiB
QML

// Copyright (C) 2023 The Qt Company Ltd.
// Copyright (C) 2019 Alexey Edelev <semlanik@gmail.com>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
import QtQuick
import QtQuick.Controls
import qtgrpc.examples.chat
ApplicationWindow {
id: mainWindow
visible: true
width: 640
height: 480
minimumWidth: 640
minimumHeight: 480
title: qsTr("Simple Chat")
Rectangle {
id: background
anchors.fill: parent
color: "#09102b"
}
Row {
spacing: 10
anchors {
top: parent.top
topMargin: 10
left: parent.left
leftMargin: 20
}
Image {
source: "qrc:/qt_logo_green_64x64px.png"
width: implicitWidth
height: implicitHeight
}
Text {
anchors.verticalCenter: parent.verticalCenter
color: "#f3f3f4"
font.pointSize: 20
text: qsTr("Chat")
}
}
Column {
id: loginControl
spacing: 5
visible: SimpleChatEngine.state !== SimpleChatEngine.Connected
anchors.centerIn: parent
enabled: SimpleChatEngine.state === SimpleChatEngine.Disconnected
ChatInputField {
id: loginField
width: 200
placeholderText: qsTr("Login")
onAccepted: {
SimpleChatEngine.login(loginField.text, passwordField.text)
}
onVisibleChanged: {
if (loginControl.visible) {
loginField.forceActiveFocus()
}
}
Component.onCompleted: {
if (loginControl.visible) {
loginField.forceActiveFocus()
}
}
}
ChatInputField {
id: passwordField
echoMode: TextInput.Password
placeholderText: qsTr("Password")
onAccepted: {
SimpleChatEngine.login(loginField.text, passwordField.text)
}
}
Button {
id: loginButton
anchors.horizontalCenter: parent.horizontalCenter
width: enterText.implicitWidth + 20
height: 40
background: Rectangle {
radius: 5
border {
width: 1
color: loginButton.pressed ? "#41cd52" : "#f3f3f4"
}
color:"#53586b"
Text {
id: enterText
text : qsTr("Enter")
color: "#f3f3f4"
anchors.centerIn: parent
font.pointSize: 14
}
}
onClicked: {
SimpleChatEngine.login(loginField.text, passwordField.text)
}
}
}
ChatView {
id: chatView
visible: SimpleChatEngine.state === SimpleChatEngine.Connected
}
Text {
id: connectingText
visible: SimpleChatEngine.state === SimpleChatEngine.Connecting
anchors.top: loginControl.bottom
anchors.topMargin: 10
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("Connecting...")
font.pointSize: 14
color: "#f3f3f4"
}
Text {
id: authFailedText
visible: false
anchors.top: loginControl.bottom
anchors.topMargin: 10
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("This username with this password doesn't exists.")
font.pointSize: 14
color: "#f3f3f4"
onVisibleChanged: {
if (authFailedText.visible) {
fadeOutTimer.restart()
} else {
fadeOutTimer.stop()
}
}
Timer {
id: fadeOutTimer
onTriggered: {
authFailedText.visible = false
}
}
}
Connections {
target: SimpleChatEngine
function onAuthFailed() {
authFailedText.visible = true;
}
}
}