UserInfo compact

Make UserInfo work in compact mode. This includes showing the account switch popup in a dialog

BUG: 482261
This commit is contained in:
James Graham
2024-03-29 09:09:13 +00:00
parent aaa97ec029
commit 158942d1b5
6 changed files with 235 additions and 214 deletions

View File

@@ -287,6 +287,7 @@ qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
qml/QrScannerPage.qml
qml/JoinRoomDialog.qml
qml/ConfirmUrlDialog.qml
qml/AccountSwitchDialog.qml
RESOURCES
qml/confetti.png
qml/glowdot.png

View File

@@ -0,0 +1,147 @@
// SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
// SPDX-License-Identifier: GPL-2.0-or-later
import QtQuick
import QtQuick.Layouts
import org.kde.kirigami as Kirigami
import org.kde.kirigamiaddons.labs.components as KirigamiComponents
import org.kde.kirigamiaddons.delegates as Delegates
import org.kde.neochat
import org.kde.neochat.accounts
Kirigami.Dialog {
id: root
required property NeoChatConnection connection
parent: applicationWindow().overlay
leftPadding: 0
rightPadding: 0
topPadding: 0
bottomPadding: 0
standardButtons: Kirigami.Dialog.NoButton
width: Math.min(applicationWindow().width, Kirigami.Units.gridUnit * 24)
title: i18nc("@title: dialog to switch between logged in accounts", "Switch Account")
onVisibleChanged: if (visible) {
accountView.forceActiveFocus()
}
contentItem: ListView {
id: accountView
property var addAccount
implicitHeight: contentHeight
Kirigami.Theme.colorSet: Kirigami.Theme.View
Kirigami.Theme.inherit: false
footer: Delegates.RoundedItemDelegate {
id: addDelegate
width: parent.width
highlighted: focus && !accountView.addAccount.pressed
Component.onCompleted: accountView.addAccount = this
icon {
name: "list-add"
width: Kirigami.Units.iconSizes.smallMedium
height: Kirigami.Units.iconSizes.smallMedium
}
text: i18nc("@button: login to or register a new account.", "Add Account")
contentItem: Delegates.SubtitleContentItem {
itemDelegate: parent
subtitle: i18n("Log in or create a new account")
labelItem.textFormat: Text.PlainText
subtitleItem.textFormat: Text.PlainText
}
onClicked: {
pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'WelcomePage.qml'), {}, {
title: i18nc("@title:window", "Login")
});
if (switchUserButton.checked) {
switchUserButton.checked = false;
}
accountView.currentIndex = Controller.activeConnectionIndex;
}
Keys.onUpPressed: {
accountView.currentIndex = accountView.count - 1;
accountView.forceActiveFocus();
}
Keys.onDownPressed: {
accountView.currentIndex = 0;
accountView.forceActiveFocus();
}
}
clip: true
model: AccountRegistry
keyNavigationEnabled: false
Keys.onDownPressed: {
if (accountView.currentIndex === accountView.count - 1) {
accountView.addAccount.forceActiveFocus();
accountView.currentIndex = -1;
} else {
accountView.incrementCurrentIndex();
}
}
Keys.onUpPressed: {
if (accountView.currentIndex === 0) {
accountView.addAccount.forceActiveFocus();
accountView.currentIndex = -1;
} else {
accountView.decrementCurrentIndex();
}
}
Keys.onEnterPressed: accountView.currentItem.clicked()
Keys.onReturnPressed: accountView.currentItem.clicked()
onVisibleChanged: {
for (let i = 0; i < accountView.count; i++) {
if (model.data(model.index(i, 0), Qt.DisplayRole) === root.connection.localUser.id) {
accountView.currentIndex = i;
break;
}
}
}
delegate: Delegates.RoundedItemDelegate {
id: userDelegate
required property NeoChatConnection connection
width: parent.width
text: connection.localUser.displayName
contentItem: RowLayout {
KirigamiComponents.Avatar {
implicitWidth: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
implicitHeight: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
sourceSize {
width: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
height: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
}
source: userDelegate.connection.localUser.avatarMediaId ? ("image://mxc/" + userDelegate.connection.localUser.avatarMediaId) : ""
name: userDelegate.connection.localUser.displayName ?? userDelegate.connection.localUser.id
}
Delegates.SubtitleContentItem {
itemDelegate: userDelegate
subtitle: userDelegate.connection.localUser.id
labelItem.textFormat: Text.PlainText
subtitleItem.textFormat: Text.PlainText
}
}
onClicked: {
Controller.activeConnection = userDelegate.connection;
root.close()
}
}
}
}

View File

@@ -264,7 +264,6 @@ Kirigami.Page {
footer: Loader {
width: parent.width
active: !root.collapsed
sourceComponent: Kirigami.Settings.isMobile ? exploreComponentMobile : userInfoDesktop
}
@@ -314,7 +313,6 @@ Kirigami.Page {
Component {
id: userInfo
UserInfo {
visible: !root.collapsed
bottomEdge: false
connection: root.connection
}
@@ -323,8 +321,8 @@ Kirigami.Page {
Component {
id: userInfoDesktop
UserInfoDesktop {
visible: !root.collapsed
connection: root.connection
collapsed: root.collapsed
}
}

View File

@@ -18,6 +18,8 @@ RowLayout {
required property NeoChatConnection connection
property bool collapsed: false
property bool bottomEdge: true
property var addAccount
@@ -26,6 +28,7 @@ RowLayout {
Layout.topMargin: Kirigami.Units.smallSpacing
Layout.bottomMargin: Kirigami.Units.smallSpacing
Layout.rightMargin: Kirigami.Units.largeSpacing
Layout.minimumHeight: bottomEdge ? Kirigami.Units.gridUnit * 2 : -1
onVisibleChanged: {
@@ -73,242 +76,102 @@ RowLayout {
ColumnLayout {
Layout.fillWidth: true
Layout.maximumWidth: Math.round(root.width * 0.55)
visible: !root.collapsed
spacing: 0
QQC2.Label {
id: displayNameLabel
Layout.fillWidth: true
text: root.connection.localUser.displayName
textFormat: Text.PlainText
elide: Text.ElideRight
Layout.fillWidth: true
}
QQC2.Label {
id: idLabel
Layout.fillWidth: true
text: (root.connection.label.length > 0 ? (root.connection.label + " ") : "") + root.connection.localUser.id
font.pointSize: displayNameLabel.font.pointSize * 0.8
opacity: 0.7
textFormat: Text.PlainText
elide: Text.ElideRight
Layout.fillWidth: true
}
}
QQC2.ToolButton {
id: switchUserButton
icon.name: "system-switch-user"
checkable: true
text: i18n("Switch User")
display: QQC2.AbstractButton.IconOnly
Accessible.name: text
QQC2.ToolTip.text: text
QQC2.ToolTip.visible: hovered
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
Layout.minimumWidth: Layout.preferredWidth
Layout.alignment: Qt.AlignRight
Kirigami.ActionToolBar {
alignment: Qt.AlignRight
display: QQC2.Button.IconOnly
actions: [
Kirigami.Action {
id: switchUserButton
text: i18n("Switch User")
icon.name: "system-switch-user"
onTriggered: accountSwitchDialog.createObject(QQC2.ApplicationWindow.overlay, {
connection: root.connection
}).open();
},
Kirigami.Action {
text: i18n("Open Settings")
icon.name: "settings-configure"
onTriggered: pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat.settings', 'NeoChatSettings.qml'), {
connection: root.connection
}, {
title: i18n("Configure"),
width: Kirigami.Units.gridUnit * 50,
height: Kirigami.Units.gridUnit * 42
})
}
]
Shortcut {
sequence: "Ctrl+U"
onActivated: switchUserButton.toggle()
}
}
QQC2.ToolButton {
icon.name: "list-add"
onClicked: ; //TODO
text: i18n("Add") //TODO find better message
display: QQC2.AbstractButton.IconOnly
QQC2.ToolTip.text: text
QQC2.ToolTip.visible: hovered
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
Layout.minimumWidth: Layout.preferredWidth
Layout.alignment: Qt.AlignRight
visible: false
}
QQC2.ToolButton {
visible: Config.developerTools
icon.name: "tools"
onClicked: applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'DevtoolsPage.qml'), {
connection: root.connection
}, {
title: i18n("Developer Tools")
});
text: i18n("Open developer tools")
display: QQC2.AbstractButton.IconOnly
Layout.minimumWidth: Layout.preferredWidth
Layout.alignment: Qt.AlignRight
QQC2.ToolTip.text: text
QQC2.ToolTip.visible: hovered
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
}
QQC2.ToolButton {
icon.name: "settings-configure"
onClicked: pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat.settings', 'NeoChatSettings.qml'), {
connection: root.connection
}, {
title: i18n("Configure"),
width: Kirigami.Units.gridUnit * 50,
height: Kirigami.Units.gridUnit * 42
})
text: i18n("Open Settings")
display: QQC2.AbstractButton.IconOnly
Layout.minimumWidth: Layout.preferredWidth
Layout.alignment: Qt.AlignRight
QQC2.ToolTip.text: text
QQC2.ToolTip.visible: hovered
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
}
Item {
width: 1
}
// QQC2.ToolButton {
// Layout.alignment: Qt.AlignRight
// display: QQC2.AbstractButton.IconOnly
// action: Kirigami.Action {
// id: switchUserButton
// text: i18n("Switch User")
// icon.name: "system-switch-user"
// onTriggered: accountSwitchDialog.createObject(QQC2.ApplicationWindow.overlay, {
// connection: root.connection
// }).open();
// }
// QQC2.ToolTip.text: text
// QQC2.ToolTip.visible: hovered
// QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
// Shortcut {
// sequence: "Ctrl+U"
// onActivated: switchUserButton.trigger()
// }
// }
// QQC2.ToolButton {
// Layout.alignment: Qt.AlignRight
// display: QQC2.AbstractButton.IconOnly
// action: Kirigami.Action {
// text: i18n("Open Settings")
// icon.name: "settings-configure"
// onTriggered: pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat.settings', 'NeoChatSettings.qml'), {
// connection: root.connection
// }, {
// title: i18n("Configure"),
// width: Kirigami.Units.gridUnit * 50,
// height: Kirigami.Units.gridUnit * 42
// })
// }
// QQC2.ToolTip.text: text
// QQC2.ToolTip.visible: hovered
// QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
// }
AccountMenu {
id: accountMenu
y: root.bottomEdge ? -height : accountButton.height
connection: root.connection
}
QQC2.Popup {
id: accountsPopup
parent: root
visible: switchUserButton.checked
onVisibleChanged: if (visible)
accounts.forceActiveFocus()
x: -Kirigami.Units.smallSpacing
y: root.bottomEdge ? -height - Kirigami.Units.smallSpacing - 1 : root.height + Kirigami.Units.smallSpacing - 1
width: root.width + (root.bottomEdge ? 0 : Kirigami.Units.smallSpacing * 2)
leftPadding: 0
rightPadding: 0
bottomPadding: Kirigami.Units.smallSpacing
topPadding: Kirigami.Units.smallSpacing
closePolicy: QQC2.Popup.CloseOnEscape
contentItem: ListView {
id: accounts
implicitHeight: contentHeight
header: Kirigami.Separator {}
footer: Delegates.RoundedItemDelegate {
id: addButton
width: parent.width
highlighted: focus || (addAccount.highlighted || addAccount.ListView.isCurrentItem) && !addAccount.pressed
Component.onCompleted: root.addAccount = this
icon {
name: "list-add"
width: Kirigami.Units.iconSizes.smallMedium
height: Kirigami.Units.iconSizes.smallMedium
}
text: i18n("Add Account")
contentItem: Delegates.SubtitleContentItem {
itemDelegate: parent
subtitle: i18n("Log in to an existing account")
labelItem.textFormat: Text.PlainText
subtitleItem.textFormat: Text.PlainText
}
onClicked: {
pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'WelcomePage.qml'), {}, {
title: i18nc("@title:window", "Login")
});
if (switchUserButton.checked) {
switchUserButton.checked = false;
}
accounts.currentIndex = Controller.activeConnectionIndex;
}
Keys.onUpPressed: {
accounts.currentIndex = accounts.count - 1;
accounts.forceActiveFocus();
}
Keys.onDownPressed: {
accounts.currentIndex = 0;
accounts.forceActiveFocus();
}
}
clip: true
model: AccountRegistry
keyNavigationEnabled: false
Keys.onDownPressed: {
if (accounts.currentIndex === accounts.count - 1) {
addAccount.forceActiveFocus();
accounts.currentIndex = -1;
} else {
accounts.incrementCurrentIndex();
}
}
Keys.onUpPressed: {
if (accounts.currentIndex === 0) {
addAccount.forceActiveFocus();
accounts.currentIndex = -1;
} else {
accounts.decrementCurrentIndex();
}
}
Keys.onReleased: if (event.key == Qt.Key_Escape) {
if (switchUserButton.checked) {
switchUserButton.checked = false;
}
}
onVisibleChanged: {
for (let i = 0; i < accounts.count; i++) {
if (model.data(model.index(i, 0), Qt.DisplayRole) === root.connection.localUser.id) {
accounts.currentIndex = i;
break;
}
}
}
delegate: Delegates.RoundedItemDelegate {
id: userDelegate
required property NeoChatConnection connection
width: parent.width
text: connection.localUser.displayName
contentItem: RowLayout {
KirigamiComponents.Avatar {
implicitWidth: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
implicitHeight: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
sourceSize {
width: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
height: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
}
source: userDelegate.connection.localUser.avatarMediaId ? ("image://mxc/" + userDelegate.connection.localUser.avatarMediaId) : ""
name: userDelegate.connection.localUser.displayName ?? userDelegate.connection.localUser.id
}
Delegates.SubtitleContentItem {
itemDelegate: userDelegate
subtitle: userDelegate.connection.localUser.id
labelItem.textFormat: Text.PlainText
subtitleItem.textFormat: Text.PlainText
}
}
onClicked: {
Controller.activeConnection = userDelegate.connection;
if (switchUserButton.checked) {
switchUserButton.checked = false;
}
}
}
}
background: ColumnLayout {
spacing: 0
Kirigami.Separator {
Layout.fillWidth: true
visible: root.bottomEdge
}
Rectangle {
Layout.fillWidth: true
Layout.fillHeight: true
color: Kirigami.Theme.backgroundColor
}
Kirigami.Separator {
Layout.fillWidth: true
visible: !root.bottomEdge
}
}
Component {
id: accountSwitchDialog
AccountSwitchDialog {}
}
}

View File

@@ -17,6 +17,8 @@ QQC2.ToolBar {
*/
required property NeoChatConnection connection
property bool collapsed: false
padding: 0
background: Rectangle {
@@ -31,6 +33,7 @@ QQC2.ToolBar {
Layout.fillWidth: true
}
UserInfo {
collapsed: root.collapsed
bottomEdge: true
connection: root.connection
}

View File

@@ -215,5 +215,14 @@ FormCard.FormCardPage {
Config.save();
}
}
FormCard.FormButtonDelegate {
visible: Config.developerTools
text: i18n("Open developer tools")
onClicked: applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'DevtoolsPage.qml'), {
connection: root.connection
}, {
title: i18n("Developer Tools")
});
}
}
}