Make UI responsive.

Some more UI changes in settings panel.
Fix link color in replies.
square-messages
Black Hat 2019-04-21 20:39:38 +08:00
parent aa3309a184
commit da155e07ca
6 changed files with 439 additions and 141 deletions

View File

@ -169,7 +169,7 @@ ColumnLayout {
Layout.fillWidth: true
color: "white"
text: replyDisplay || ""
text: "<style>a{color: white;} .user-pill{}</style>" + (replyDisplay || "")
wrapMode: Label.Wrap
textFormat: Label.RichText

View File

@ -16,7 +16,7 @@ Drawer {
ColumnLayout {
anchors.fill: parent
anchors.margins: 32
anchors.margins: 16
Avatar {
Layout.preferredWidth: 96

View File

@ -80,134 +80,134 @@ Item {
]
}
Drawer {
width: Math.max(root.width, 400)
height: root.height
// Drawer {
// width: Math.max(root.width, 400)
// height: root.height
id: drawer
// id: drawer
edge: Qt.LeftEdge
// edge: Qt.LeftEdge
ColumnLayout {
anchors.fill: parent
// ColumnLayout {
// anchors.fill: parent
id: mainColumn
// id: mainColumn
spacing: 0
// spacing: 0
Control {
Layout.fillWidth: true
Layout.preferredHeight: 330
// Control {
// Layout.fillWidth: true
// Layout.preferredHeight: 330
padding: 24
// padding: 24
contentItem: ColumnLayout {
spacing: 4
// contentItem: ColumnLayout {
// spacing: 4
Avatar {
Layout.preferredWidth: 200
Layout.preferredHeight: 200
Layout.margins: 12
Layout.alignment: Qt.AlignHCenter
// Avatar {
// Layout.preferredWidth: 200
// Layout.preferredHeight: 200
// Layout.margins: 12
// Layout.alignment: Qt.AlignHCenter
source: root.user ? root.user.avatarMediaId : null
hint: root.user ? root.user.displayName : "?"
}
// source: root.user ? root.user.avatarMediaId : null
// hint: root.user ? root.user.displayName : "?"
// }
Label {
Layout.alignment: Qt.AlignHCenter
// Label {
// Layout.alignment: Qt.AlignHCenter
text: root.user ? root.user.displayName : "No Name"
color: "white"
font.pixelSize: 22
}
// text: root.user ? root.user.displayName : "No Name"
// color: "white"
// font.pixelSize: 22
// }
Label {
Layout.alignment: Qt.AlignHCenter
// Label {
// Layout.alignment: Qt.AlignHCenter
text: root.user ? root.user.id : "@example:matrix.org"
color: "white"
opacity: 0.7
font.pixelSize: 13
}
}
// text: root.user ? root.user.id : "@example:matrix.org"
// color: "white"
// opacity: 0.7
// font.pixelSize: 13
// }
// }
background: Rectangle { color: Material.primary }
// background: Rectangle { color: Material.primary }
RippleEffect {
anchors.fill: parent
}
}
// RippleEffect {
// anchors.fill: parent
// }
// }
ScrollView {
Layout.fillWidth: true
Layout.fillHeight: true
// ScrollView {
// Layout.fillWidth: true
// Layout.fillHeight: true
clip: true
// clip: true
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
// ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
ColumnLayout {
width: mainColumn.width
spacing: 0
// ColumnLayout {
// width: mainColumn.width
// spacing: 0
Repeater {
model: AccountListModel {
controller: spectralController
}
// Repeater {
// model: AccountListModel {
// controller: spectralController
// }
delegate: ItemDelegate {
Layout.fillWidth: true
// delegate: ItemDelegate {
// Layout.fillWidth: true
text: user.displayName
// text: user.displayName
onClicked: {
controller.connection = connection
drawer.close()
}
}
}
// onClicked: {
// controller.connection = connection
// drawer.close()
// }
// }
// }
ItemDelegate {
Layout.fillWidth: true
// ItemDelegate {
// Layout.fillWidth: true
text: "Add Account"
// text: "Add Account"
onClicked: loginDialog.open()
}
// onClicked: loginDialog.open()
// }
Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: 1
// Rectangle {
// Layout.fillWidth: true
// Layout.preferredHeight: 1
color: MSettings.darkTheme ? "#424242" : "#e7ebeb"
}
// color: MSettings.darkTheme ? "#424242" : "#e7ebeb"
// }
ItemDelegate {
Layout.fillWidth: true
// ItemDelegate {
// Layout.fillWidth: true
text: "Settings"
}
// text: "Settings"
// }
ItemDelegate {
Layout.fillWidth: true
// ItemDelegate {
// Layout.fillWidth: true
text: "Logout"
// text: "Logout"
onClicked: controller.logout(controller.connection)
}
// onClicked: controller.logout(controller.connection)
// }
ItemDelegate {
Layout.fillWidth: true
// ItemDelegate {
// Layout.fillWidth: true
text: "Exit"
// text: "Exit"
onClicked: Qt.quit()
}
}
}
}
}
// onClicked: Qt.quit()
// }
// }
// }
// }
// }
ColumnLayout {
anchors.fill: parent
@ -288,8 +288,6 @@ Item {
AutoTextField {
readonly property bool active: text
readonly property bool isRoom: text.match(/#.*:.*\..*/g) || text.match(/!.*:.*\..*/g)
readonly property bool isUser: text.match(/@.*:.*\..*/g)
Layout.fillWidth: true
Layout.fillHeight: true
@ -304,26 +302,6 @@ Item {
background: Item {}
}
ItemDelegate {
Layout.preferredWidth: height
Layout.fillHeight: true
visible: searchField.isRoom || searchField.isUser
contentItem: MaterialIcon { icon: "\ue145" }
onClicked: {
if (searchField.isRoom) {
controller.joinRoom(controller.connection, searchField.text)
return
}
if (searchField.isUser) {
controller.createDirectChat(controller.connection, searchField.text)
return
}
}
}
Avatar {
Layout.preferredWidth: height
Layout.fillHeight: true
@ -336,7 +314,7 @@ Item {
MouseArea {
anchors.fill: parent
onClicked: drawer.open()
onClicked: detailDialog.open()
}
}
}

View File

@ -23,15 +23,6 @@ Item {
room: currentRoom
}
RoomDrawer {
width: Math.min(root.width * 0.7, 480)
height: root.height
id: roomDrawer
room: currentRoom
}
Label {
anchors.centerIn: parent
visible: !currentRoom
@ -64,7 +55,7 @@ Item {
topic: currentRoom ? (currentRoom.topic).replace(/(\r\n\t|\n|\r\t)/gm,"") : ""
atTop: messageListView.atYBeginning
onClicked: roomDrawer.open()
onClicked: roomDrawer.visible ? roomDrawer.close() : roomDrawer.open()
}
ColumnLayout {

View File

@ -1,3 +1,4 @@
module Spectral.Panel
RoomPanel 2.0 RoomPanel.qml
RoomListPanel 2.0 RoomListPanel.qml
RoomDrawer 2.0 RoomDrawer.qml

View File

@ -14,12 +14,14 @@ import Spectral 0.1
import Spectral.Setting 0.1
ApplicationWindow {
readonly property bool inPortrait: window.width < window.height
Material.theme: MPalette.theme
Material.background: MPalette.background
width: 960
height: 640
minimumWidth: 720
minimumWidth: 480
minimumHeight: 360
id: window
@ -171,18 +173,330 @@ ApplicationWindow {
Dialog {
anchors.centerIn: parent
width: 200
height: 300
width: 480
id: settingsDialog
id: detailDialog
contentItem: Column {
id: detailColumn
spacing: 0
Repeater {
model: AccountListModel{
controller: spectralController
}
delegate: Item {
width: detailColumn.width
height: 72
RowLayout {
anchors.fill: parent
anchors.margins: 12
spacing: 12
Avatar {
Layout.preferredWidth: height
Layout.fillHeight: true
source: user.avatarMediaId
hint: user.displayName || "No Name"
}
ColumnLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
Label {
Layout.fillWidth: true
text: user.displayName || "No Name"
color: MPalette.foreground
font.pixelSize: 16
font.bold: true
elide: Text.ElideRight
wrapMode: Text.NoWrap
}
Label {
Layout.fillWidth: true
text: connection === spectralController.connection ? "Active" : "Online"
color: MPalette.lighter
font.pixelSize: 13
elide: Text.ElideRight
wrapMode: Text.NoWrap
}
}
}
Menu {
id: contextMenu
MenuItem {
text: "Logout"
onClicked: spectralController.logout(connection)
}
}
RippleEffect {
anchors.fill: parent
onPrimaryClicked: spectralController.connection = connection
onSecondaryClicked: contextMenu.popup()
}
}
}
RowLayout {
width: parent.width
MenuSeparator {
Layout.fillWidth: true
}
ToolButton {
Layout.preferredWidth: 48
Layout.preferredHeight: 48
contentItem: MaterialIcon {
icon: "\ue145"
color: MPalette.lighter
}
onClicked: loginDialog.open()
}
}
Control {
width: parent.width
contentItem: RowLayout {
MaterialIcon {
Layout.preferredWidth: 48
Layout.preferredHeight: 48
icon: "\ue7ff"
}
Label {
Layout.fillWidth: true
text: "Start a Chat"
}
}
RippleEffect {
anchors.fill: parent
onPrimaryClicked: joinRoomDialog.open()
}
}
Control {
width: parent.width
contentItem: RowLayout {
MaterialIcon {
Layout.preferredWidth: 48
Layout.preferredHeight: 48
icon: "\ue7fc"
}
Label {
Layout.fillWidth: true
text: "Create a Room"
}
}
RippleEffect {
anchors.fill: parent
onPrimaryClicked: createRoomDialog.open()
}
}
MenuSeparator {
width: parent.width
}
Control {
width: parent.width
contentItem: RowLayout {
MaterialIcon {
Layout.preferredWidth: 48
Layout.preferredHeight: 48
icon: "\ue3a9"
}
Label {
Layout.fillWidth: true
text: "Night Mode"
}
Switch {
id: darkThemeSwitch
checked: MSettings.darkTheme
onCheckedChanged: MSettings.darkTheme = checked
}
}
RippleEffect {
anchors.fill: parent
onPrimaryClicked: darkThemeSwitch.checked = !darkThemeSwitch.checked
}
}
Control {
width: parent.width
contentItem: RowLayout {
MaterialIcon {
Layout.preferredWidth: 48
Layout.preferredHeight: 48
icon: "\ue5d2"
}
Label {
Layout.fillWidth: true
text: "Enable System Tray"
}
Switch {
id: trayIconSwitch
checked: MSettings.showTray
onCheckedChanged: MSettings.showTray = checked
}
}
RippleEffect {
anchors.fill: parent
onPrimaryClicked: trayIconSwitch.checked = !trayIconSwitch.checked
}
}
Control {
width: parent.width
contentItem: RowLayout {
MaterialIcon {
Layout.preferredWidth: 48
Layout.preferredHeight: 48
icon: "\ue7f5"
}
Label {
Layout.fillWidth: true
text: "Enable Notifications"
}
Switch {
id: notificationsSwitch
checked: MSettings.showNotification
onCheckedChanged: MSettings.showNotification = checked
}
}
RippleEffect {
anchors.fill: parent
onPrimaryClicked: notificationsSwitch.checked = !notificationsSwitch.checked
}
}
}
}
SplitView {
anchors.fill: parent
Dialog {
anchors.centerIn: parent
width: 360
id: joinRoomDialog
title: "Start a Chat"
contentItem: ColumnLayout {
TextField {
Layout.fillWidth: true
id: identifierField
placeholderText: "Room Alias/User ID"
}
}
standardButtons: Dialog.Ok | Dialog.Cancel
onAccepted: {
var identifier = identifierField.text
var firstChar = identifier.charAt(0)
if (firstChar == "@") {
spectralController.createDirectChat(spectralController.connection, identifier)
} else if (firstChar == "!" || firstChar == "#") {
spectralController.joinRoom(spectralController.connection, identifier)
}
}
}
Dialog {
anchors.centerIn: parent
width: 360
id: createRoomDialog
title: "Create a Room"
contentItem: ColumnLayout {
TextField {
Layout.fillWidth: true
id: roomNameField
placeholderText: "Room Name"
}
TextField {
Layout.fillWidth: true
id: roomTopicField
placeholderText: "Room Topic"
}
}
standardButtons: Dialog.Ok | Dialog.Cancel
onAccepted: spectralController.createRoom(spectralController.connection, roomNameField.text, roomTopicField.text)
}
Drawer {
width: (inPortrait ? 0.67 : 0.3) * window.width
height: window.height
modal: inPortrait
interactive: inPortrait
position: inPortrait ? 0 : 1
visible: !inPortrait
id: drawer
RoomListPanel {
width: window.width * 0.35
Layout.minimumWidth: 180
anchors.fill: parent
id: roomListForm
@ -192,17 +506,31 @@ ApplicationWindow {
onLeaveRoom: roomForm.saveReadMarker(room)
}
}
RoomPanel {
Layout.fillWidth: true
Layout.minimumWidth: 480
RoomPanel {
anchors.fill: parent
anchors.leftMargin: !inPortrait ? drawer.width : undefined
anchors.rightMargin: !inPortrait && roomDrawer.visible ? roomDrawer.width : undefined
id: roomForm
id: roomForm
clip: true
clip: true
currentRoom: roomListForm.enteredRoom
}
currentRoom: roomListForm.enteredRoom
}
RoomDrawer {
width: (inPortrait ? 0.67 : 0.3) * window.width
height: window.height
modal: inPortrait
interactive: inPortrait
edge: Qt.RightEdge
id: roomDrawer
room: roomListForm.enteredRoom
}
Binding {