Account page: spinners while profile is loading

This commit is contained in:
miruka 2020-06-25 09:59:40 -04:00
parent 470b0f0de2
commit d5ea248ba1
3 changed files with 38 additions and 10 deletions

View File

@ -1,16 +1,17 @@
# TODO # TODO
- room settings: make letter avatar respond to name change in real time
- sessions page size - sessions page size
- menu click-through padding to close it easily - menu click-through padding to close it easily
- clear listview checked on message clear - clear listview checked on message clear
- unregister popup/menu when destroyed without being closed - unregister popup/menu when destroyed without being closed
- flickshortcuts - flickshortcuts
- Account: wait until accountInfo available
- avatar upload/change component - avatar upload/change component
- show scrollbars for a few secs if there's content to scroll on beginning - show scrollbars for a few secs if there's content to scroll on beginning
- can leave room with a reason? - can leave room with a reason?
- field/area focus line in popups weird - field/area focus line in popups weird
- use new nio `restore_login()` - use new nio `restore_login()`
- verify all popups and boxes work
## Refactoring ## Refactoring

View File

@ -28,7 +28,7 @@ Item {
property int fileType: HFileDialogOpener.FileType.All property int fileType: HFileDialogOpener.FileType.All
TapHandler { enabled: fill; onTapped: fileDialog.open() } TapHandler { enabled: opener.enabled && fill; onTapped: fileDialog.open() }
FileDialog { FileDialog {
id: fileDialog id: fileDialog

View File

@ -14,6 +14,7 @@ HFlickableColumnPage {
property string userId property string userId
readonly property QtObject account: ModelStore.get("accounts").find(userId) readonly property QtObject account: ModelStore.get("accounts").find(userId)
readonly property bool ready: account && account.profile_updated >= new Date(1)
function takeFocus() { function takeFocus() {
@ -95,7 +96,7 @@ HFlickableColumnPage {
id: avatar id: avatar
userId: page.userId userId: page.userId
displayName: nameField.item.text displayName: nameField.item.text
mxc: account.avatar_url mxc: account ? account.avatar_url : ""
toolTipMxc: "" toolTipMxc: ""
sourceOverride: fileDialog.selectedFile || fileDialog.file sourceOverride: fileDialog.selectedFile || fileDialog.file
@ -105,13 +106,18 @@ HFlickableColumnPage {
Layout.preferredHeight: width Layout.preferredHeight: width
Rectangle { Rectangle {
anchors.fill: parent
z: 10 z: 10
visible: opacity > 0 visible: opacity > 0
opacity: ! fileDialog.dialog.visible && opacity:
((! avatar.mxc && ! avatar.changed) || avatar.hovered) ? ! fileDialog.dialog.visible &&
1 : 0 (
(! avatar.mxc && ! avatar.changed) ||
avatar.hovered ||
! ready
) ?
1 : 0
anchors.fill: parent
color: utils.hsluv( color: utils.hsluv(
0, 0, 0, (! avatar.mxc && overlayHover.hovered) ? 0.8 : 0.7, 0, 0, 0, (! avatar.mxc && overlayHover.hovered) ? 0.8 : 0.7,
) )
@ -123,16 +129,34 @@ HFlickableColumnPage {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
enabled: ready
acceptedButtons: Qt.NoButton acceptedButtons: Qt.NoButton
cursorShape: cursorShape:
overlayHover.hovered ? overlayHover.hovered ?
Qt.PointingHandCursor : Qt.ArrowCursor Qt.PointingHandCursor : Qt.ArrowCursor
} }
HLoader {
anchors.centerIn: parent
width: avatar.width / 3
height: width
source: "../../Base/HBusyIndicator.qml"
active: ! ready
opacity: active ? 1 : 0
visible: opacity > 0
Behavior on opacity { HNumberAnimation {} }
}
HColumnLayout { HColumnLayout {
anchors.centerIn: parent anchors.centerIn: parent
spacing: currentSpacing spacing: currentSpacing
width: parent.width width: parent.width
opacity: ready ? 1 : 0
visible: opacity > 0
Behavior on opacity { HNumberAnimation {} }
HIcon { HIcon {
svgName: "upload-avatar" svgName: "upload-avatar"
@ -165,9 +189,10 @@ HFlickableColumnPage {
HFileDialogOpener { HFileDialogOpener {
id: fileDialog id: fileDialog
enabled: ready
fileType: HFileDialogOpener.FileType.Images fileType: HFileDialogOpener.FileType.Images
dialog.title: qsTr("Select profile picture for %1") dialog.title: qsTr("Select profile picture for %1")
.arg(account.display_name) .arg(account ? account.display_name : "")
} }
} }
@ -183,13 +208,15 @@ HFlickableColumnPage {
HLabeledItem { HLabeledItem {
id: nameField id: nameField
loading: ! ready
label.text: qsTr("Display name:") label.text: qsTr("Display name:")
Layout.fillWidth: true Layout.fillWidth: true
HTextField { HTextField {
width: parent.width width: parent.width
defaultText: account.display_name enabled: ready
defaultText: ready ? account.display_name : ""
maximumLength: 255 maximumLength: 255
// TODO: Qt 5.14+: use a Binding enabled when text not empty // TODO: Qt 5.14+: use a Binding enabled when text not empty
@ -239,7 +266,7 @@ HFlickableColumnPage {
defaultText: aliasField.currentAlias defaultText: aliasField.currentAlias
placeholderText: qsTr("e.g. %1").arg(( placeholderText: qsTr("e.g. %1").arg((
nameField.item.text || nameField.item.text ||
account.display_name || (ready && account.display_name) ||
userId.substring(1) userId.substring(1)
)[0]) )[0])
} }