diff --git a/src/qml/Panel/DirectChatDrawerHeader.qml b/src/qml/Panel/DirectChatDrawerHeader.qml index 5b49204c3..3dd153f86 100644 --- a/src/qml/Panel/DirectChatDrawerHeader.qml +++ b/src/qml/Panel/DirectChatDrawerHeader.qml @@ -48,7 +48,7 @@ ColumnLayout { room: room, user: room.getUser(room.directChatRemoteUser.id), }) - popup.closed.connect(function() { + popup.closed.connect(() => { userListItem.highlighted = false }) if (roomDrawer.modal) { @@ -61,7 +61,6 @@ ColumnLayout { Kirigami.Heading { Layout.fillWidth: true - level: 1 type: Kirigami.Heading.Type.Primary wrapMode: QQC2.Label.Wrap text: room.displayName diff --git a/src/qml/Panel/GroupChatDrawerHeader.qml b/src/qml/Panel/GroupChatDrawerHeader.qml index 0dd108aca..a6c14fd0a 100644 --- a/src/qml/Panel/GroupChatDrawerHeader.qml +++ b/src/qml/Panel/GroupChatDrawerHeader.qml @@ -11,7 +11,9 @@ import org.kde.neochat 1.0 ColumnLayout { id: root + Layout.fillWidth: true + RowLayout { Layout.fillWidth: true Layout.leftMargin: Kirigami.Units.largeSpacing @@ -30,8 +32,11 @@ ColumnLayout { width: Kirigami.Units.gridUnit height: Kirigami.Units.gridUnit - anchors.bottom: parent.bottom - anchors.right: parent.right + + anchors { + bottom: parent.bottom + right: parent.right + } radius: Math.round(width / 2) @@ -49,12 +54,12 @@ ColumnLayout { Kirigami.Heading { Layout.fillWidth: true - level: 1 type: Kirigami.Heading.Type.Primary wrapMode: QQC2.Label.Wrap text: room ? room.displayName : i18n("No name") textFormat: Text.PlainText } + Kirigami.SelectableLabel { Layout.fillWidth: true textFormat: TextEdit.PlainText @@ -63,36 +68,15 @@ ColumnLayout { } } - QQC2.ScrollView { + Kirigami.SelectableLabel { + Layout.fillWidth: true Layout.leftMargin: Kirigami.Units.largeSpacing Layout.rightMargin: Kirigami.Units.largeSpacing - Layout.fillWidth: true - Layout.fillHeight: true - Layout.maximumHeight: Math.min(topicText.contentHeight, Kirigami.Units.gridUnit * 15) - // HACK: Hide unnecessary horizontal scrollbar (https://bugreports.qt.io/browse/QTBUG-83890) - QQC2.ScrollBar.horizontal.policy: QQC2.ScrollBar.AlwaysOff - - QQC2.TextArea { - id: topicText - padding: 0 - text: room && room.topic ? room.topic.replace(replaceLinks, "$1") : i18n("No Topic") - readonly property var replaceLinks: /(http[s]?:\/\/[^ \r\n]*)/g - textFormat: TextEdit.MarkdownText - wrapMode: Text.Wrap - selectByMouse: true - color: Kirigami.Theme.textColor - selectedTextColor: Kirigami.Theme.highlightedTextColor - selectionColor: Kirigami.Theme.highlightColor - onLinkActivated: UrlHelper.openUrl(link) - readOnly: true - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.NoButton - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.IBeamCursor - } - background: Item {} - } + text: room && room.topic ? room.topic.replace(replaceLinks, "$1") : i18n("No Topic") + readonly property var replaceLinks: /(http[s]?:\/\/[^ \r\n]*)/g + textFormat: TextEdit.MarkdownText + wrapMode: Text.Wrap + onLinkActivated: UrlHelper.openUrl(link) } - } diff --git a/src/qml/Panel/RoomDrawer.qml b/src/qml/Panel/RoomDrawer.qml index 0072c6120..b65ec2c0d 100644 --- a/src/qml/Panel/RoomDrawer.qml +++ b/src/qml/Panel/RoomDrawer.qml @@ -71,26 +71,24 @@ Kirigami.OverlayDrawer { contentItem: Loader { id: loader active: roomDrawer.drawerOpen + sourceComponent: ColumnLayout { - id: columnLayout - property alias userSearchText: userListSearchField.text + readonly property string userSearchText: userListView.headerItem.userListSearchField.text property alias highlightedUser: userListView.currentIndex - spacing: Kirigami.Units.largeSpacing - Kirigami.AbstractApplicationHeader { + spacing: 0 + + QQC2.ToolBar { Layout.fillWidth: true - topPadding: Kirigami.Units.smallSpacing / 2; - bottomPadding: Kirigami.Units.smallSpacing / 2; - rightPadding: Kirigami.Units.largeSpacing - leftPadding: Kirigami.Units.largeSpacing - RowLayout { - anchors.fill: parent + Layout.preferredHeight: pageStack.globalToolBar.preferredHeight + + contentItem: RowLayout { Kirigami.Heading { Layout.fillWidth: true text: i18n("Room information") - level: 1 } + QQC2.ToolButton { id: settingsButton @@ -99,124 +97,14 @@ Kirigami.OverlayDrawer { display: QQC2.AbstractButton.IconOnly onClicked: QQC2.ApplicationWindow.window.pageStack.pushDialogLayer('qrc:/Categories.qml', {room: room}, { title: i18n("Room Settings") }) - QQC2.ToolTip { - text: settingsButton.text - } + + QQC2.ToolTip.text: text + QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay + QQC2.ToolTip.visible: hovered } } } - Loader { - active: true - Layout.fillWidth: true - sourceComponent: room.isDirectChat() ? directChatDrawerHeader : groupChatDrawerHeader - } - - Kirigami.ListSectionHeader { - label: i18n("Options") - activeFocusOnTab: false - } - - Kirigami.BasicListItem { - id: devtoolsButton - - icon: "tools" - text: i18n("Open developer tools") - visible: Config.developerTools - - onClicked: { - applicationWindow().pageStack.layers.push("qrc:/DevtoolsPage.qml", {room: room}, {title: i18n("Developer Tools")}) - roomDrawer.close(); - } - } - Kirigami.BasicListItem { - id: searchButton - - icon: "search" - text: i18n("Search in this room") - - onClicked: { - pageStack.pushDialogLayer("qrc:/SearchPage.qml", { - currentRoom: room - }, { - title: i18nc("@action:title", "Search") - }) - } - } - Kirigami.BasicListItem { - id: locationsButton - - icon: "map-flat" - text: i18n("Show locations for this room") - - onClicked: pageStack.pushDialogLayer("qrc:/LocationsPage.qml", { - room: room - }, { - title: i18nc("Locations on a map", "Locations") - }) - } - Kirigami.BasicListItem { - id: favouriteButton - - icon: room && room.isFavourite ? "rating" : "rating-unrated" - text: room && room.isFavourite ? i18n("Remove room from favorites") : i18n("Make room favorite") - - onClicked: room.isFavourite ? room.removeTag("m.favourite") : room.addTag("m.favourite", 1.0) - } - - Kirigami.ListSectionHeader { - label: i18n("Members") - activeFocusOnTab: false - spacing: 0 - visible: !room.isDirectChat() - - QQC2.ToolButton { - id: memberSearchToggle - checkable: true - icon.name: "search" - QQC2.ToolTip.text: i18n("Search user in room") - QQC2.ToolTip.visible: hovered - QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay - onToggled: { - userListSearchField.text = ""; - } - } - - QQC2.ToolButton { - visible: roomDrawer.room.canSendState("invite") - icon.name: "list-add-user" - - onClicked: { - applicationWindow().pageStack.layers.push("qrc:/InviteUserPage.qml", {room: roomDrawer.room}) - roomDrawer.close(); - } - - QQC2.ToolTip.text: i18n("Invite user to room") - QQC2.ToolTip.visible: hovered - QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay - } - - QQC2.Label { - Layout.alignment: Qt.AlignRight - text: room ? i18np("%1 member", "%1 members", room.joinedCount) : i18n("No member count") - } - } - - Kirigami.SearchField { - id: userListSearchField - visible: memberSearchToggle.checked - - onVisibleChanged: if (visible) forceActiveFocus() - Layout.fillWidth: true - Layout.leftMargin: Kirigami.Units.largeSpacing - 1 - Layout.rightMargin: Kirigami.Units.largeSpacing - 1 - Layout.bottomMargin: Kirigami.Units.smallSpacing - - focusSequence: "Ctrl+Shift+F" - - onAccepted: sortedMessageEventModel.filterString = text; - } - QQC2.ScrollView { Layout.fillWidth: true Layout.fillHeight: true @@ -226,11 +114,130 @@ Kirigami.OverlayDrawer { ListView { id: userListView - clip: true - activeFocusOnTab: true - visible: !room.isDirectChat() - model: KSortFilterProxyModel { + header: ColumnLayout { + id: columnLayout + + property alias userListSearchField: userListSearchField + + spacing: Kirigami.Units.largeSpacing + width: userListView.width + + Loader { + active: true + Layout.fillWidth: true + Layout.topMargin: Kirigami.Units.smallSpacing + sourceComponent: room.isDirectChat() ? directChatDrawerHeader : groupChatDrawerHeader + } + + Kirigami.ListSectionHeader { + label: i18n("Options") + activeFocusOnTab: false + } + + Kirigami.BasicListItem { + id: devtoolsButton + + icon: "tools" + text: i18n("Open developer tools") + visible: Config.developerTools + + onClicked: { + applicationWindow().pageStack.layers.push("qrc:/DevtoolsPage.qml", {room: room}, {title: i18n("Developer Tools")}) + roomDrawer.close(); + } + } + Kirigami.BasicListItem { + id: searchButton + + icon: "search" + text: i18n("Search in this room") + + onClicked: { + pageStack.pushDialogLayer("qrc:/SearchPage.qml", { + currentRoom: room + }, { + title: i18nc("@action:title", "Search") + }) + } + } + Kirigami.BasicListItem { + id: favouriteButton + + icon: room && room.isFavourite ? "rating" : "rating-unrated" + text: room && room.isFavourite ? i18n("Remove room from favorites") : i18n("Make room favorite") + + onClicked: room.isFavourite ? room.removeTag("m.favourite") : room.addTag("m.favourite", 1.0) + } + + Kirigami.BasicListItem { + id: locationsButton + + icon: "map-flat" + text: i18n("Show locations for this room") + + onClicked: pageStack.pushDialogLayer("qrc:/LocationsPage.qml", { + room: room + }, { + title: i18nc("Locations on a map", "Locations") + }) + } + + Kirigami.ListSectionHeader { + label: i18n("Members") + activeFocusOnTab: false + spacing: 0 + visible: !room.isDirectChat() + + QQC2.ToolButton { + id: memberSearchToggle + checkable: true + icon.name: "search" + QQC2.ToolTip.text: i18n("Search user in room") + QQC2.ToolTip.visible: hovered + QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay + onToggled: { + userListSearchField.text = ""; + } + } + + QQC2.ToolButton { + visible: roomDrawer.room.canSendState("invite") + icon.name: "list-add-user" + + onClicked: { + applicationWindow().pageStack.layers.push("qrc:/InviteUserPage.qml", {room: roomDrawer.room}) + roomDrawer.close(); + } + + QQC2.ToolTip.text: i18n("Invite user to room") + QQC2.ToolTip.visible: hovered + QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay + } + + QQC2.Label { + Layout.alignment: Qt.AlignRight + text: room ? i18np("%1 member", "%1 members", room.joinedCount) : i18n("No member count") + } + } + + Kirigami.SearchField { + id: userListSearchField + visible: memberSearchToggle.checked + + onVisibleChanged: if (visible) forceActiveFocus() + Layout.fillWidth: true + Layout.leftMargin: Kirigami.Units.largeSpacing - 1 + Layout.rightMargin: Kirigami.Units.largeSpacing - 1 + Layout.bottomMargin: Kirigami.Units.smallSpacing + + focusSequence: "Ctrl+Shift+F" + + onAccepted: sortedMessageEventModel.filterString = text; + } + } + + KSortFilterProxyModel { id: sortedMessageEventModel sourceModel: UserListModel { @@ -243,6 +250,11 @@ Kirigami.OverlayDrawer { filterCaseSensitivity: Qt.CaseInsensitive } + model: room.isDirectChat() ? 0 : sortedMessageEventModel + + clip: true + activeFocusOnTab: true + delegate: Kirigami.BasicListItem { id: userListItem