From 7e778d225baeefaf937ce8f022f86e10eb46e708 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Sun, 25 Apr 2021 23:12:13 +0200 Subject: [PATCH] Lazy load room drawer by putting it in a Loader --- imports/NeoChat/Panel/RoomDrawer.qml | 400 ++++++++++++++------------- 1 file changed, 202 insertions(+), 198 deletions(-) diff --git a/imports/NeoChat/Panel/RoomDrawer.qml b/imports/NeoChat/Panel/RoomDrawer.qml index 4136cfb30..5c47e930e 100644 --- a/imports/NeoChat/Panel/RoomDrawer.qml +++ b/imports/NeoChat/Panel/RoomDrawer.qml @@ -26,217 +26,221 @@ Kirigami.OverlayDrawer { leftPadding: 0 rightPadding: 0 Kirigami.Theme.colorSet: Kirigami.Theme.View - contentItem: ColumnLayout { - id: columnLayout - spacing: 0 - Kirigami.AbstractApplicationHeader { - Layout.fillWidth: true - topPadding: Kirigami.Units.smallSpacing / 2; - bottomPadding: Kirigami.Units.smallSpacing / 2; - rightPadding: Kirigami.Units.smallSpacing - leftPadding: Kirigami.Units.smallSpacing + contentItem: Loader { + active: roomDrawer.drawerOpen + sourceComponent: ColumnLayout { + id: columnLayout + anchors.fill: parent + spacing: 0 + Kirigami.AbstractApplicationHeader { + Layout.fillWidth: true + topPadding: Kirigami.Units.smallSpacing / 2; + bottomPadding: Kirigami.Units.smallSpacing / 2; + rightPadding: Kirigami.Units.smallSpacing + leftPadding: Kirigami.Units.smallSpacing - RowLayout { - anchors.fill: parent - spacing: 0 + RowLayout { + anchors.fill: parent + spacing: 0 - ToolButton { - icon.name: "list-add-user" - text: i18n("Invite") - onClicked: { - applicationWindow().pageStack.layers.push("qrc:/imports/NeoChat/Page/InviteUserPage.qml", {"room": room}) - roomDrawer.close(); - } - } - Item { - // HACK otherwise rating item is not right aligned - Layout.fillWidth: true - } - - ToolButton { - Layout.alignment: Qt.AlignRight - icon.name: room && room.isFavourite ? "rating" : "rating-unrated" - checkable: true - checked: room && room.isFavourite - onClicked: room.isFavourite ? room.removeTag("m.favourite") : room.addTag("m.favourite", 1.0) - ToolTip { - text: room && room.isFavourite ? i18n("Remove room from favorites") : i18n("Make room favorite") - } - } - ToolButton { - Layout.alignment: Qt.AlignRight - icon.name: 'settings-configure' - onClicked: { - roomSettingDialog.createObject(ApplicationWindow.overlay, {"room": room}).open() - if (!wideScreen) { + ToolButton { + icon.name: "list-add-user" + text: i18n("Invite") + onClicked: { + applicationWindow().pageStack.layers.push("qrc:/imports/NeoChat/Page/InviteUserPage.qml", {"room": room}) roomDrawer.close(); } } - - ToolTip { - text: i18n("Room settings") - } - } - } - } - - Control { - Layout.fillWidth: true - padding: Kirigami.Units.largeSpacing - contentItem: ColumnLayout { - id: infoLayout - Layout.fillWidth: true - Kirigami.Heading { - text: i18n("Room information") - level: 3 - } - RowLayout { - Layout.fillWidth: true - Layout.margins: Kirigami.Units.largeSpacing - - spacing: Kirigami.Units.largeSpacing - - Kirigami.Avatar { - Layout.preferredWidth: Kirigami.Units.gridUnit * 3.5 - Layout.preferredHeight: Kirigami.Units.gridUnit * 3.5 - - name: room ? room.name : i18n("No name") - source: room ? ("image://mxc/" + room.avatarMediaId) : "" - } - - ColumnLayout { + Item { + // HACK otherwise rating item is not right aligned Layout.fillWidth: true - Layout.alignment: Qt.AlignVCenter - spacing: 0 - - Kirigami.Heading { - Layout.maximumWidth: Kirigami.Units.gridUnit * 9 - Layout.fillWidth: true - level: 1 - font.bold: true - wrapMode: Label.Wrap - text: room ? room.displayName : i18n("No name") - } - Label { - Layout.fillWidth: true - text: room && room.canonicalAlias ? room.canonicalAlias : i18n("No Canonical Alias") - } - } - } - - TextEdit { - Layout.maximumWidth: Kirigami.Units.gridUnit * 13 - Layout.preferredWidth: Kirigami.Units.gridUnit * 13 - Layout.fillWidth: true - text: room && room.topic ? room.topic.replace(replaceLinks, "$1") : i18n("No Topic") - readonly property var replaceLinks: /\(https:\/\/[^ ]*\)/ - textFormat: TextEdit.MarkdownText - wrapMode: Text.WordWrap - selectByMouse: true - color: Kirigami.Theme.textColor - onLinkActivated: Qt.openUrlExternally(link) - readOnly: true - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.NoButton - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.IBeamCursor - } - } - } - } - - Kirigami.ListSectionHeader { - label: i18n("Members") - activeFocusOnTab: false - Label { - Layout.alignment: Qt.AlignRight - text: room ? i18np("%1 Member", "%1 Members", room.totalMemberCount) : i18n("No Member Count") - } - } - - ScrollView { - Layout.fillWidth: true - Layout.fillHeight: true - - ListView { - id: userListView - clip: true - headerPositioning: ListView.OverlayHeader - boundsBehavior: Flickable.DragOverBounds - activeFocusOnTab: true - - header: Pane { - padding: Kirigami.Units.smallSpacing - implicitWidth: parent.width - z: 2 - contentItem: Kirigami.SearchField { - id: userListSearchField - onTextChanged: sortedMessageEventModel.filterString = text; - } - } - - model: KSortFilterProxyModel { - id: sortedMessageEventModel - - sourceModel: UserListModel { - room: roomDrawer.room } - sortRole: "perm" - filterRole: "name" - } - - delegate: Kirigami.AbstractListItem { - width: userListView.width - implicitHeight: Kirigami.Units.gridUnit * 2 - z: 1 - - contentItem: RowLayout { - Kirigami.Avatar { - Layout.preferredWidth: height - Layout.fillHeight: true - visible: Config.showAvatarInTimeline - - source: avatar ? ("image://mxc/" + avatar) : "" - name: name + ToolButton { + Layout.alignment: Qt.AlignRight + icon.name: room && room.isFavourite ? "rating" : "rating-unrated" + checkable: true + checked: room && room.isFavourite + onClicked: room.isFavourite ? room.removeTag("m.favourite") : room.addTag("m.favourite", 1.0) + ToolTip { + text: room && room.isFavourite ? i18n("Remove room from favorites") : i18n("Make room favorite") } - - Label { - Layout.fillWidth: true - - text: name - textFormat: Text.PlainText - elide: Text.ElideRight - wrapMode: Text.NoWrap - } - - Label { - visible: perm != UserType.Member - - text: { - if (perm == UserType.Owner) { - return i18n("Owner") - } - if (perm == UserType.Admin) { - return i18n("Admin") - } - if (perm == UserType.Moderator) { - return i18n("Mod") - } - if (perm == UserType.Muted) { - return i18n("Muted") - } - return "" + } + ToolButton { + Layout.alignment: Qt.AlignRight + icon.name: 'settings-configure' + onClicked: { + roomSettingDialog.createObject(ApplicationWindow.overlay, {"room": room}).open() + if (!wideScreen) { + roomDrawer.close(); + } + } + + ToolTip { + text: i18n("Room settings") + } + } + } + } + + Control { + Layout.fillWidth: true + padding: Kirigami.Units.largeSpacing + contentItem: ColumnLayout { + id: infoLayout + Layout.fillWidth: true + Kirigami.Heading { + text: i18n("Room information") + level: 3 + } + RowLayout { + Layout.fillWidth: true + Layout.margins: Kirigami.Units.largeSpacing + + spacing: Kirigami.Units.largeSpacing + + Kirigami.Avatar { + Layout.preferredWidth: Kirigami.Units.gridUnit * 3.5 + Layout.preferredHeight: Kirigami.Units.gridUnit * 3.5 + + name: room ? room.name : i18n("No name") + source: room ? ("image://mxc/" + room.avatarMediaId) : "" + } + + ColumnLayout { + Layout.fillWidth: true + Layout.alignment: Qt.AlignVCenter + spacing: 0 + + Kirigami.Heading { + Layout.maximumWidth: Kirigami.Units.gridUnit * 9 + Layout.fillWidth: true + level: 1 + font.bold: true + wrapMode: Label.Wrap + text: room ? room.displayName : i18n("No name") + } + Label { + Layout.fillWidth: true + text: room && room.canonicalAlias ? room.canonicalAlias : i18n("No Canonical Alias") } - color: Kirigami.Theme.disabledTextColor - font.pixelSize: 12 - textFormat: Text.PlainText - wrapMode: Text.NoWrap } } - action: Kirigami.Action { - onTriggered: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": room, "user": user, "displayName": name, "avatarMediaId": avatar}).open() + TextEdit { + Layout.maximumWidth: Kirigami.Units.gridUnit * 13 + Layout.preferredWidth: Kirigami.Units.gridUnit * 13 + Layout.fillWidth: true + text: room && room.topic ? room.topic.replace(replaceLinks, "$1") : i18n("No Topic") + readonly property var replaceLinks: /\(https:\/\/[^ ]*\)/ + textFormat: TextEdit.MarkdownText + wrapMode: Text.WordWrap + selectByMouse: true + color: Kirigami.Theme.textColor + onLinkActivated: Qt.openUrlExternally(link) + readOnly: true + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.IBeamCursor + } + } + } + } + + Kirigami.ListSectionHeader { + label: i18n("Members") + activeFocusOnTab: false + Label { + Layout.alignment: Qt.AlignRight + text: room ? i18np("%1 Member", "%1 Members", room.totalMemberCount) : i18n("No Member Count") + } + } + + ScrollView { + Layout.fillWidth: true + Layout.fillHeight: true + + ListView { + id: userListView + clip: true + headerPositioning: ListView.OverlayHeader + boundsBehavior: Flickable.DragOverBounds + activeFocusOnTab: true + + header: Pane { + padding: Kirigami.Units.smallSpacing + implicitWidth: parent.width + z: 2 + contentItem: Kirigami.SearchField { + id: userListSearchField + onTextChanged: sortedMessageEventModel.filterString = text; + } + } + + model: KSortFilterProxyModel { + id: sortedMessageEventModel + + sourceModel: UserListModel { + room: roomDrawer.room + } + + sortRole: "perm" + filterRole: "name" + } + + delegate: Kirigami.AbstractListItem { + width: userListView.width + implicitHeight: Kirigami.Units.gridUnit * 2 + z: 1 + + contentItem: RowLayout { + Kirigami.Avatar { + Layout.preferredWidth: height + Layout.fillHeight: true + visible: Config.showAvatarInTimeline + + source: avatar ? ("image://mxc/" + avatar) : "" + name: name + } + + Label { + Layout.fillWidth: true + + text: name + textFormat: Text.PlainText + elide: Text.ElideRight + wrapMode: Text.NoWrap + } + + Label { + visible: perm != UserType.Member + + text: { + if (perm == UserType.Owner) { + return i18n("Owner") + } + if (perm == UserType.Admin) { + return i18n("Admin") + } + if (perm == UserType.Moderator) { + return i18n("Mod") + } + if (perm == UserType.Muted) { + return i18n("Muted") + } + return "" + } + color: Kirigami.Theme.disabledTextColor + font.pixelSize: 12 + textFormat: Text.PlainText + wrapMode: Text.NoWrap + } + } + + action: Kirigami.Action { + onTriggered: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": room, "user": user, "displayName": name, "avatarMediaId": avatar}).open() + } } } }