Spectral/qml/main.qml

392 lines
12 KiB
QML
Raw Normal View History

2018-07-12 01:44:41 +00:00
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.2
import Qt.labs.settings 1.0
2018-10-01 08:07:48 +00:00
import Spectral.Component 2.0
import Spectral.Page 2.0
import Spectral 0.1
2018-10-01 08:07:48 +00:00
import Spectral.Setting 0.1
2018-02-23 14:39:14 +00:00
2018-09-13 03:58:02 +00:00
import "qrc:/js/util.js" as Util
2018-02-23 14:39:14 +00:00
ApplicationWindow {
readonly property var currentConnection: accountListView.currentConnection ? accountListView.currentConnection : null
2018-07-20 14:36:19 +00:00
2018-02-23 14:39:14 +00:00
width: 960
height: 640
2018-09-15 11:07:38 +00:00
minimumWidth: 720
minimumHeight: 360
2018-09-04 13:13:14 +00:00
id: window
visible: true
title: qsTr("Spectral")
Material.theme: MSettings.darkTheme ? Material.Dark : Material.Light
Material.accent: spectralController.color(currentConnection ? currentConnection.localUserId : "")
2018-09-10 07:01:01 +00:00
2018-02-27 11:07:50 +00:00
Controller {
id: spectralController
2018-08-19 06:51:09 +00:00
2018-09-14 04:16:25 +00:00
onShowWindow: {
window.show()
window.raise()
window.requestActivate()
2018-09-06 13:00:58 +00:00
}
2018-09-14 04:16:25 +00:00
onHideWindow: window.hide()
2018-09-20 00:23:42 +00:00
onErrorOccured: {
errorDialog.error = error
errorDialog.detail = detail
2018-09-20 00:23:42 +00:00
errorDialog.open()
}
2018-02-26 12:41:20 +00:00
}
2018-02-23 14:39:14 +00:00
AccountListModel {
id: accountListModel
controller: spectralController
}
2018-09-20 00:23:42 +00:00
Dialog {
property string error
property string detail
x: (window.width - width) / 2
y: (window.height - height) / 2
2018-09-04 13:13:14 +00:00
2018-09-20 00:23:42 +00:00
id: errorDialog
title: error + " Error"
contentItem: Label { text: errorDialog.detail }
2018-03-02 11:58:55 +00:00
}
2018-02-23 14:39:14 +00:00
Component {
id: loginPage
2018-02-23 14:39:14 +00:00
Login { controller: spectralController }
}
Room {
id: roomPage
parent: null
connection: currentConnection
}
2018-02-23 14:39:14 +00:00
2018-07-19 05:54:59 +00:00
Setting {
id: settingPage
parent: null
listModel: accountListModel
2018-07-19 05:54:59 +00:00
}
RowLayout {
anchors.fill: parent
spacing: 0
2018-02-23 14:39:14 +00:00
Rectangle {
2018-09-02 13:26:42 +00:00
Layout.preferredWidth: 64
Layout.fillHeight: true
2018-09-04 13:13:14 +00:00
id: sideNav
2018-09-02 13:26:42 +00:00
color: Material.primary
2018-02-23 14:39:14 +00:00
ColumnLayout {
anchors.fill: parent
spacing: 0
2018-03-02 15:05:32 +00:00
2018-10-15 01:56:30 +00:00
AutoListView {
property var currentConnection: null
2018-09-02 13:26:42 +00:00
Layout.fillWidth: true
Layout.fillHeight: true
2018-09-02 13:26:42 +00:00
id: accountListView
model: accountListModel
spacing: 0
2018-03-02 15:05:32 +00:00
2018-09-10 08:22:45 +00:00
clip: true
2018-09-22 14:28:47 +00:00
delegate: Column {
property bool expanded: accountListView.currentConnection === connection
width: parent.width
2018-09-22 14:28:47 +00:00
spacing: 0
SideNavButton {
width: parent.width
height: width
selected: stackView.currentItem === page && currentConnection === connection
ImageItem {
anchors.fill: parent
anchors.margins: 12
hint: user.displayName
image: user.avatar
}
2018-09-11 05:14:56 +00:00
2018-09-22 14:28:47 +00:00
highlightColor: spectralController.color(user.id)
2018-09-04 13:13:14 +00:00
2018-09-22 14:28:47 +00:00
page: roomPage
onClicked: {
accountListView.currentConnection = connection
roomPage.filter = 0
}
}
2018-09-22 14:28:47 +00:00
Column {
width: parent.width
height: expanded ? implicitHeight : 0
spacing: 0
clip: true
SideNavButton {
width: parent.width
height: width
MaterialIcon {
anchors.fill: parent
icon: "\ue7f7"
color: "white"
}
2018-09-10 08:22:45 +00:00
2018-09-22 14:28:47 +00:00
onClicked: roomPage.filter = 1
}
2018-09-22 14:28:47 +00:00
SideNavButton {
width: parent.width
height: width
MaterialIcon {
anchors.fill: parent
icon: "\ue7fd"
color: "white"
}
onClicked: roomPage.filter = 2
}
SideNavButton {
width: parent.width
height: width
MaterialIcon {
anchors.fill: parent
icon: "\ue886"
color: "white"
}
onClicked: roomPage.filter = 3
}
Behavior on height {
PropertyAnimation { easing.type: Easing.InOutCubic; duration: 200 }
}
}
}
2018-03-02 15:05:32 +00:00
}
2018-02-23 14:39:14 +00:00
SideNavButton {
2018-09-02 13:26:42 +00:00
Layout.fillWidth: true
Layout.preferredHeight: width
MaterialIcon {
anchors.fill: parent
icon: "\ue145"
color: "white"
}
enabled: !addRoomMenu.opened
onClicked: addRoomMenu.popup()
Menu {
id: addRoomMenu
2018-09-04 13:13:14 +00:00
MenuItem {
text:"New Room"
onTriggered: addRoomDialog.open()
Dialog {
id: addRoomDialog
parent: ApplicationWindow.overlay
x: (window.width - width) / 2
y: (window.height - height) / 2
width: 360
title: "New Room"
modal: true
standardButtons: Dialog.Ok | Dialog.Cancel
contentItem: Column {
TextField {
width: parent.width
2018-09-04 13:13:14 +00:00
id: addRoomDialogNameTextField
placeholderText: "Name"
}
TextField {
width: parent.width
2018-09-04 13:13:14 +00:00
id: addRoomDialogTopicTextField
placeholderText: "Topic"
}
}
onAccepted: spectralController.createRoom(currentConnection, addRoomDialogNameTextField.text, addRoomDialogTopicTextField.text)
}
}
MenuItem {
text: "Join Room"
2018-09-04 13:13:14 +00:00
onTriggered: joinRoomDialog.open()
Dialog {
x: (window.width - width) / 2
y: (window.height - height) / 2
width: 360
2018-09-04 13:13:14 +00:00
id: joinRoomDialog
parent: ApplicationWindow.overlay
title: "Input Room Alias or ID"
modal: true
standardButtons: Dialog.Ok | Dialog.Cancel
contentItem: TextField {
id: joinRoomDialogTextField
placeholderText: "#matrix:matrix.org"
}
onAccepted: spectralController.joinRoom(currentConnection, joinRoomDialogTextField.text)
}
}
2018-09-02 13:26:42 +00:00
MenuItem {
text: "Direct Chat"
2018-09-04 13:13:14 +00:00
onTriggered: directChatDialog.open()
Dialog {
x: (window.width - width) / 2
y: (window.height - height) / 2
width: 360
2018-09-04 13:13:14 +00:00
id: directChatDialog
parent: ApplicationWindow.overlay
title: "Input User ID"
modal: true
standardButtons: Dialog.Ok | Dialog.Cancel
contentItem: TextField {
id: directChatDialogTextField
placeholderText: "@bot:matrix.org"
}
onAccepted: spectralController.createDirectChat(currentConnection, directChatDialogTextField.text)
}
}
}
}
SideNavButton {
Layout.fillWidth: true
Layout.preferredHeight: width
MaterialIcon {
anchors.fill: parent
icon: "\ue8b8"
color: "white"
2018-09-02 13:26:42 +00:00
}
2018-07-19 05:54:59 +00:00
page: settingPage
2018-02-23 14:39:14 +00:00
}
SideNavButton {
2018-09-02 13:26:42 +00:00
Layout.fillWidth: true
Layout.preferredHeight: width
MaterialIcon {
anchors.fill: parent
2018-09-16 12:56:47 +00:00
icon: "\ue8ac"
2018-09-02 13:26:42 +00:00
color: "white"
}
2018-10-15 01:01:53 +00:00
onClicked: MSettings.confirmOnExit ? confirmExitDialog.open() : Qt.quit()
Dialog {
x: (window.width - width) / 2
y: (window.height - height) / 2
width: 360
id: confirmExitDialog
parent: ApplicationWindow.overlay
title: "Exit"
modal: true
standardButtons: Dialog.Ok | Dialog.Cancel
contentItem: Column {
Label { text: "Exit?" }
CheckBox {
text: "Do not ask next time"
checked: !MSettings.confirmOnExit
onCheckedChanged: MSettings.confirmOnExit = !checked
}
}
onAccepted: Qt.quit()
}
}
2018-02-23 14:39:14 +00:00
}
}
2018-02-23 14:39:14 +00:00
StackView {
Layout.fillWidth: true
Layout.fillHeight: true
2018-09-04 13:13:14 +00:00
id: stackView
2018-09-10 00:06:32 +00:00
initialItem: roomPage
2018-02-23 14:39:14 +00:00
}
}
Binding {
target: imageProvider
property: "connection"
value: currentConnection
2018-02-23 14:39:14 +00:00
}
2018-09-13 00:22:41 +00:00
Component.onCompleted: {
spectralController.initiated.connect(function() {
if (spectralController.accountCount == 0) stackView.push(loginPage)
2018-09-13 00:22:41 +00:00
})
}
2018-02-23 14:39:14 +00:00
}