First commit.
This commit is contained in:
commit
c2f01ec1c4
|
@ -0,0 +1,3 @@
|
|||
[submodule "matrix/libqmatrixclient"]
|
||||
path = matrix/libqmatrixclient
|
||||
url = https://github.com/QMatrixClient/libqmatrixclient
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
Binary file not shown.
After Width: | Height: | Size: 697 KiB |
|
@ -0,0 +1,37 @@
|
|||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
#include "connection.h"
|
||||
#include "room.h"
|
||||
#include "user.h"
|
||||
#include "jobs/syncjob.h"
|
||||
#include "settings.h"
|
||||
using namespace QMatrixClient;
|
||||
|
||||
// https://forum.qt.io/topic/57809
|
||||
Q_DECLARE_METATYPE(SyncJob*)
|
||||
Q_DECLARE_METATYPE(Room*)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#if defined(Q_OS_WIN)
|
||||
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
#endif
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
qmlRegisterType<SyncJob>(); qRegisterMetaType<SyncJob*> ("SyncJob*");
|
||||
qmlRegisterType<Room>(); qRegisterMetaType<Room*> ("Room*");
|
||||
qmlRegisterType<User>(); qRegisterMetaType<User*> ("User*");
|
||||
|
||||
qmlRegisterType<Connection> ("Matrique", 0, 1, "Connection");
|
||||
// qmlRegisterType<MessageEventModel> ("Matrique", 0, 1, "MessageEventModel");
|
||||
// qmlRegisterType<RoomListModel> ("Matrique", 0, 1, "RoomListModel");
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
|
||||
if (engine.rootObjects().isEmpty())
|
||||
return -1;
|
||||
|
||||
return app.exec();
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
QT += quick
|
||||
CONFIG += c++14
|
||||
|
||||
include(matrix/libqmatrixclient/libqmatrixclient.pri)
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which as been marked deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if you use deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
SOURCES += main.cpp
|
||||
|
||||
RESOURCES += \
|
||||
res.qrc
|
||||
|
||||
# Additional import path used to resolve QML modules in Qt Creator's code model
|
||||
QML_IMPORT_PATH =
|
||||
|
||||
# Additional import path used to resolve QML modules just for Qt Quick Designer
|
||||
QML_DESIGNER_IMPORT_PATH =
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
DISTFILES += \
|
||||
ChatForm.qml \
|
||||
LoginForm.qml \
|
||||
main.qml \
|
||||
Home.qml \
|
||||
Login.qml \
|
||||
ImageStatus.qml \
|
||||
ButtonDelegate.qml \
|
||||
SideNav.qml \
|
||||
ContactListForm.qml \
|
||||
ContactDetailForm.qml \
|
||||
Contact.qml \
|
||||
Setting.qml
|
|
@ -0,0 +1 @@
|
|||
Subproject commit b7c1ff183384738f170d53128c684681cb34f3b7
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import "qrc:/qml/form"
|
||||
|
||||
Page {
|
||||
ContactListForm {
|
||||
id: contactListForm
|
||||
height: parent.height
|
||||
width: 320
|
||||
}
|
||||
|
||||
ContactDetailForm {
|
||||
id: contactDetailForm
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: contactListForm.width
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import "qrc:/qml/form"
|
||||
|
||||
Page {
|
||||
ContactListForm {
|
||||
id: contactListForm
|
||||
height: parent.height
|
||||
width: 320
|
||||
}
|
||||
|
||||
ChatForm {
|
||||
id: chatForm
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: contactListForm.width
|
||||
}
|
||||
}
|
|
@ -0,0 +1,130 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Controls.Material 2.3
|
||||
import "qrc:/qml/component"
|
||||
|
||||
Page {
|
||||
property var window
|
||||
property alias username: usernameField.text
|
||||
property alias password: passwordField.text
|
||||
|
||||
Row {
|
||||
anchors.fill: parent
|
||||
|
||||
Pane {
|
||||
width: parent.width / 2
|
||||
height: parent.height
|
||||
|
||||
background: Item {
|
||||
Image {
|
||||
id: background
|
||||
anchors.fill: parent
|
||||
source: "qrc:/asset/img/background.jpg"
|
||||
fillMode: Image.PreserveAspectCrop
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
anchors.fill: background
|
||||
source: background
|
||||
color: "#b000796b"
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
x: 32
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
Label {
|
||||
text: "MATRIX LOGIN."
|
||||
font.pointSize: 36
|
||||
font.bold: true
|
||||
color: "white"
|
||||
}
|
||||
|
||||
Label {
|
||||
text: "A NEW METHOD OF MESSAGING"
|
||||
font.pointSize: 12
|
||||
color: "white"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pane {
|
||||
width: parent.width / 2
|
||||
height: parent.height
|
||||
padding: 64
|
||||
|
||||
Column {
|
||||
id: main_col
|
||||
spacing: 8
|
||||
anchors.fill: parent
|
||||
|
||||
ImageStatus {
|
||||
width: 96
|
||||
height: width
|
||||
source: "qrc:/asset/img/avatar.png"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: serverField
|
||||
width: parent.width
|
||||
height: 48
|
||||
placeholderText: "Server"
|
||||
leftPadding: 16
|
||||
topPadding: 0
|
||||
bottomPadding: 0
|
||||
|
||||
background: Rectangle {
|
||||
color: "#eaeaea"
|
||||
border.color: parent.activeFocus ? Material.accent : "transparent"
|
||||
border.width: 2
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: usernameField
|
||||
width: parent.width
|
||||
height: 48
|
||||
placeholderText: "Username"
|
||||
leftPadding: 16
|
||||
topPadding: 0
|
||||
bottomPadding: 0
|
||||
|
||||
background: Rectangle {
|
||||
color: "#eaeaea"
|
||||
border.color: parent.activeFocus ? Material.accent : "transparent"
|
||||
border.width: 2
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: passwordField
|
||||
width: parent.width
|
||||
height: 48
|
||||
placeholderText: "Password"
|
||||
leftPadding: 16
|
||||
topPadding: 0
|
||||
bottomPadding: 0
|
||||
|
||||
background: Rectangle {
|
||||
color: "#eaeaea"
|
||||
border.color: parent.activeFocus ? Material.accent : "transparent"
|
||||
border.width: 2
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
id: loginButton
|
||||
text: "LOGIN"
|
||||
highlighted: true
|
||||
width: parent.width
|
||||
|
||||
onClicked: window.login()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
|
||||
Page {
|
||||
TabBar {
|
||||
id: settingBar
|
||||
width: parent.width
|
||||
z: 10
|
||||
currentIndex: settingBar.currentIndex
|
||||
|
||||
TabButton {
|
||||
text: qsTr("Overview")
|
||||
}
|
||||
TabButton {
|
||||
text: qsTr("Network")
|
||||
}
|
||||
TabButton {
|
||||
text: qsTr("Sync")
|
||||
}
|
||||
}
|
||||
|
||||
SwipeView {
|
||||
id: settingSwipe
|
||||
|
||||
currentIndex: settingBar.currentIndex
|
||||
anchors.fill: parent
|
||||
|
||||
Page {
|
||||
|
||||
}
|
||||
|
||||
Page {
|
||||
|
||||
}
|
||||
|
||||
Page {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQuick.Controls.Material 2.3
|
||||
|
||||
Item {
|
||||
property int index
|
||||
property alias contentItem: itemDelegate.contentItem
|
||||
signal clicked
|
||||
|
||||
id: buttonDelegate
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: width
|
||||
|
||||
Rectangle {
|
||||
width: swipeView.currentIndex === index ? parent.width : 0
|
||||
height: parent.height
|
||||
anchors.bottom: itemDelegate.bottom
|
||||
color: Qt.lighter(Material.accent)
|
||||
|
||||
Behavior on width {
|
||||
PropertyAnimation { easing.type: Easing.InOutQuad; duration: 200 }
|
||||
}
|
||||
}
|
||||
|
||||
ItemDelegate {
|
||||
id: itemDelegate
|
||||
anchors.fill: parent
|
||||
|
||||
onClicked: {
|
||||
swipeView.currentIndex = index
|
||||
buttonDelegate.clicked()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
Image {
|
||||
id: avatar
|
||||
|
||||
mipmap: true
|
||||
layer.enabled: true
|
||||
fillMode: Image.PreserveAspectCrop
|
||||
|
||||
layer.effect: OpacityMask {
|
||||
maskSource: Item {
|
||||
width: avatar.width
|
||||
height: avatar.width
|
||||
Rectangle {
|
||||
anchors.centerIn: parent
|
||||
width: avatar.width
|
||||
height: avatar.width
|
||||
radius: avatar.width / 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: circle
|
||||
width: avatar.width
|
||||
height: avatar.width
|
||||
radius: avatar.width / 2
|
||||
color: "transparent"
|
||||
border.color: "#4caf50"
|
||||
border.width: 4
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQuick.Controls.Material 2.3
|
||||
|
||||
Drawer {
|
||||
property SwipeView swipeView
|
||||
|
||||
interactive: false
|
||||
position: 1.0
|
||||
visible: true
|
||||
modal: false
|
||||
|
||||
background: Rectangle {
|
||||
color: Material.accent
|
||||
}
|
||||
}
|
|
@ -0,0 +1,125 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQuick.Controls.Material 2.3
|
||||
import QtGraphicalEffects 1.0
|
||||
import "qrc:/qml/component"
|
||||
|
||||
Item {
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
Pane {
|
||||
z: 10
|
||||
padding: 16
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 80
|
||||
|
||||
background: Rectangle {
|
||||
color: "#eaeaea"
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.fill: parent
|
||||
spacing: 16
|
||||
|
||||
ImageStatus {
|
||||
width: parent.height
|
||||
height: parent.height
|
||||
source: "qrc:/asset/img/avatar.png"
|
||||
}
|
||||
|
||||
Column {
|
||||
height: parent.height
|
||||
Text {
|
||||
text: "Astolfo"
|
||||
font.pointSize: 18
|
||||
color: "#424242"
|
||||
}
|
||||
Text {
|
||||
text: "Rider of Black"
|
||||
color: "#424242"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pane {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
}
|
||||
|
||||
Pane {
|
||||
z: 10
|
||||
padding: 16
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 80
|
||||
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
spacing: 0
|
||||
|
||||
ItemDelegate {
|
||||
Layout.preferredWidth: height
|
||||
Layout.fillHeight: true
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue226"
|
||||
color: "#424242"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
placeholderText: "Send a Message"
|
||||
leftPadding: 16
|
||||
topPadding: 0
|
||||
bottomPadding: 0
|
||||
|
||||
background: Rectangle {
|
||||
color: "#eaeaea"
|
||||
}
|
||||
}
|
||||
|
||||
ItemDelegate {
|
||||
Layout.preferredWidth: height
|
||||
Layout.fillHeight: true
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue24e"
|
||||
color: parent.pressed ? Material.accent : "#424242"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
color: "#eaeaea"
|
||||
}
|
||||
}
|
||||
|
||||
ItemDelegate {
|
||||
Layout.preferredWidth: height
|
||||
Layout.fillHeight: true
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue163"
|
||||
color: "#424242"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,112 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQuick.Controls.Material 2.3
|
||||
import "qrc:/qml/component"
|
||||
|
||||
Item {
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
Pane {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 250
|
||||
padding: 32
|
||||
|
||||
background: Rectangle {
|
||||
color: Material.accent
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
|
||||
ImageStatus {
|
||||
z: 10
|
||||
width: 96
|
||||
height: width
|
||||
source: "qrc:/asset/img/avatar.png"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "Astolfo"
|
||||
color: "white"
|
||||
font.pointSize: 28
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "Rider of Black"
|
||||
color: "#cdcdcd"
|
||||
font.pointSize: 12
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
|
||||
Row {
|
||||
height: 48
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
ItemDelegate {
|
||||
width: parent.height
|
||||
height: parent.height
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue0b7"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
color: "white"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
|
||||
ItemDelegate {
|
||||
width: parent.height
|
||||
height: parent.height
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue62e"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
color: "white"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pane {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
|
||||
leftPadding: 96
|
||||
rightPadding: 96
|
||||
|
||||
GridLayout {
|
||||
width: parent.width
|
||||
columns: 2
|
||||
flow: GridLayout.LeftToRight
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
columnSpacing: 32
|
||||
|
||||
Text {
|
||||
text: "Matrix ID"
|
||||
}
|
||||
|
||||
Text {
|
||||
Layout.fillWidth: true
|
||||
text: "Welcome"
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "Status"
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "Overline"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,174 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Controls.Material 2.3
|
||||
import "qrc:/qml/component"
|
||||
|
||||
Item {
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
spacing: 0
|
||||
|
||||
Pane {
|
||||
z: 10
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 80
|
||||
background: Rectangle {
|
||||
color: Qt.tint(Material.accent, "#20FFFFFF")
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: serverField
|
||||
width: parent.width
|
||||
height: 36
|
||||
leftPadding: 16
|
||||
topPadding: 0
|
||||
bottomPadding: 0
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
background: Item {
|
||||
Row {
|
||||
anchors.fill: parent
|
||||
|
||||
Text {
|
||||
width: parent.height
|
||||
height: parent.height
|
||||
text: "\ue8b6"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
color: "white"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
|
||||
Text {
|
||||
height: parent.height
|
||||
text: "Search"
|
||||
color: "white"
|
||||
font.pointSize: 12
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: serverField.activeFocus || serverField.text != "" ? parent.width : 0
|
||||
height: parent.height
|
||||
color: "white"
|
||||
|
||||
Behavior on width {
|
||||
PropertyAnimation { easing.type: Easing.InOutQuad; duration: 200 }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pane {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
padding: 0
|
||||
|
||||
background: Rectangle {
|
||||
color: "#eaeaea"
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: listModel
|
||||
ListElement {
|
||||
name: "Bill Smith"
|
||||
number: "555 3264"
|
||||
}
|
||||
ListElement {
|
||||
name: "John Brown"
|
||||
number: "555 8426"
|
||||
}
|
||||
ListElement {
|
||||
name: "Sam Wise"
|
||||
number: "555 0473"
|
||||
}
|
||||
ListElement {
|
||||
name: "Bill Smith"
|
||||
number: "555 3264"
|
||||
}
|
||||
ListElement {
|
||||
name: "John Brown"
|
||||
number: "555 8426"
|
||||
}
|
||||
ListElement {
|
||||
name: "Sam Wise"
|
||||
number: "555 0473"
|
||||
}
|
||||
ListElement {
|
||||
name: "Bill Smith"
|
||||
number: "555 3264"
|
||||
}
|
||||
ListElement {
|
||||
name: "John Brown"
|
||||
number: "555 8426"
|
||||
}
|
||||
ListElement {
|
||||
name: "Sam Wise"
|
||||
number: "555 0473"
|
||||
}
|
||||
ListElement {
|
||||
name: "Bill Smith"
|
||||
number: "555 3264"
|
||||
}
|
||||
ListElement {
|
||||
name: "John Brown"
|
||||
number: "555 8426"
|
||||
}
|
||||
ListElement {
|
||||
name: "Sam Wise"
|
||||
number: "555 0473"
|
||||
}
|
||||
}
|
||||
|
||||
ListView {
|
||||
id: listView
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
|
||||
model: listModel
|
||||
|
||||
highlight: Rectangle {
|
||||
color: Material.accent
|
||||
opacity: 0.2
|
||||
}
|
||||
|
||||
ScrollBar.vertical: ScrollBar { id: scrollBar }
|
||||
|
||||
delegate: ItemDelegate {
|
||||
width: parent.width
|
||||
height: 80
|
||||
onClicked: listView.currentIndex = index
|
||||
|
||||
contentItem: Item {
|
||||
Row {
|
||||
spacing: 16
|
||||
|
||||
ImageStatus {
|
||||
width: parent.height
|
||||
height: parent.height
|
||||
source: "qrc:/asset/img/avatar.png"
|
||||
}
|
||||
|
||||
Column {
|
||||
Text {
|
||||
text: name
|
||||
color: "#424242"
|
||||
}
|
||||
Text {
|
||||
text: number
|
||||
color: "#424242"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,168 @@
|
|||
import QtQuick 2.10
|
||||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQuick.Controls.Material 2.2
|
||||
import QtGraphicalEffects 1.0
|
||||
import Qt.labs.settings 1.0
|
||||
|
||||
import "qrc:/qml/component"
|
||||
import "qrc:/qml/form"
|
||||
|
||||
import Matrique 0.1
|
||||
|
||||
ApplicationWindow {
|
||||
id: window
|
||||
visible: true
|
||||
width: 960
|
||||
height: 640
|
||||
title: qsTr("Matrique")
|
||||
|
||||
Connection { id: connection }
|
||||
|
||||
Settings {
|
||||
id: settings
|
||||
|
||||
property alias user: loginPage.username
|
||||
property alias pass: loginPage.password
|
||||
property var token
|
||||
}
|
||||
|
||||
FontLoader { id: materialFont; source: "qrc:/asset/font/material.ttf" }
|
||||
|
||||
function login() {
|
||||
console.info("Login is invoked.")
|
||||
|
||||
var connect = connection.connectToServer
|
||||
|
||||
connection.connected.connect(function() {
|
||||
settings.user = connection.userId()
|
||||
settings.token = connection.accessToken
|
||||
|
||||
connection.connectionError.connect(connection.reconnect)
|
||||
connection.syncDone.connect(resync)
|
||||
connection.reconnected.connect(resync)
|
||||
|
||||
connection.sync()
|
||||
})
|
||||
|
||||
var userParts = settings.user.split(':')
|
||||
if(userParts.length === 1 || userParts[1] === "matrix.org") { // If this user uses default server.
|
||||
console.info("Matrix server is used.")
|
||||
connect(settings.user, settings.pass, "Device")
|
||||
} else {
|
||||
connection.resolved.connect(function() {
|
||||
connect(settings.user, settings.pass, "Device")
|
||||
})
|
||||
connection.resolveError.connect(function() {
|
||||
console.info("Couldn't resolve server!")
|
||||
})
|
||||
connection.resolveServer(userParts[1])
|
||||
}
|
||||
}
|
||||
|
||||
SideNav {
|
||||
id: sideNav
|
||||
width: 80
|
||||
height: window.height
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
spacing: 0
|
||||
|
||||
ButtonDelegate {
|
||||
index: 0
|
||||
|
||||
contentItem: ImageStatus {
|
||||
width: parent.width
|
||||
height: parent.width
|
||||
source: "qrc:/asset/img/avatar.png"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color: "transparent"
|
||||
Layout.fillHeight: true
|
||||
}
|
||||
|
||||
ButtonDelegate {
|
||||
index: 1
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue853"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
color: "white"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
|
||||
ButtonDelegate {
|
||||
index: 2
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue5d2"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
color: "white"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
|
||||
ButtonDelegate {
|
||||
index: 3
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue8b8"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
color: "white"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
|
||||
ButtonDelegate {
|
||||
index: 4
|
||||
|
||||
contentItem: Text {
|
||||
text: "\ue879"
|
||||
font.pointSize: 16
|
||||
font.family: materialFont.name
|
||||
color: "white"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
|
||||
onClicked: Qt.quit()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SwipeView {
|
||||
id: swipeView
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: sideNav.width
|
||||
interactive: false
|
||||
orientation: Qt.Vertical
|
||||
|
||||
Home {
|
||||
|
||||
}
|
||||
|
||||
Login {
|
||||
id: loginPage
|
||||
window: window
|
||||
}
|
||||
|
||||
Contact {
|
||||
|
||||
}
|
||||
|
||||
Setting {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
; This file can be edited to change the style of the application
|
||||
; Read "Qt Quick Controls 2 Configuration File" for details:
|
||||
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html
|
||||
|
||||
[Controls]
|
||||
Style=Material
|
||||
|
||||
[Material]
|
||||
Theme=Light
|
||||
Primary=#00695c
|
||||
Accent=#00695c
|
||||
;Foreground=Black
|
||||
;Background=#161616
|
|
@ -0,0 +1,19 @@
|
|||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>qtquickcontrols2.conf</file>
|
||||
<file>asset/img/avatar.png</file>
|
||||
<file>asset/img/background.jpg</file>
|
||||
<file>asset/font/material.ttf</file>
|
||||
<file>qml/Contact.qml</file>
|
||||
<file>qml/Home.qml</file>
|
||||
<file>qml/Login.qml</file>
|
||||
<file>qml/main.qml</file>
|
||||
<file>qml/Setting.qml</file>
|
||||
<file>qml/component/ButtonDelegate.qml</file>
|
||||
<file>qml/component/ImageStatus.qml</file>
|
||||
<file>qml/component/SideNav.qml</file>
|
||||
<file>qml/form/ChatForm.qml</file>
|
||||
<file>qml/form/ContactDetailForm.qml</file>
|
||||
<file>qml/form/ContactListForm.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
Loading…
Reference in New Issue