From 5d221b995aa23533d383a0d8d49d212ec2fe02f2 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Mon, 23 Nov 2020 17:41:56 +0000 Subject: [PATCH] Add an unified room list view This is off by default and can be enabled in the setting --- imports/NeoChat/Page/RoomListPage.qml | 9 +++++---- imports/NeoChat/Page/SettingsPage.qml | 24 +++++++++++++----------- src/neochatconfig.kcfg | 4 ++++ src/sortfilterroomlistmodel.cpp | 16 ++++++++++++++++ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/imports/NeoChat/Page/RoomListPage.qml b/imports/NeoChat/Page/RoomListPage.qml index 2e3f9b814..eba6ea29e 100644 --- a/imports/NeoChat/Page/RoomListPage.qml +++ b/imports/NeoChat/Page/RoomListPage.qml @@ -52,10 +52,10 @@ Kirigami.ScrollablePage { model: SortFilterRoomListModel { id: sortFilterRoomListModel sourceModel: roomListModel - roomSortOrder: SortFilterRoomListModel.Categories + roomSortOrder: Config.mergeRoomList ? SortFilterRoomListModel.LastActivity : SortFilterRoomListModel.Categories } - section.property: sortFilterRoomListModel.filterText.length === 0 ? "category" : null + section.property: sortFilterRoomListModel.filterText.length === 0 && !Config.mergeRoomList ? "category" : null section.delegate: Kirigami.ListSectionHeader { id: sectionHeader action: Kirigami.Action { @@ -80,8 +80,9 @@ Kirigami.ScrollablePage { } delegate: Kirigami.SwipeListItem { - visible: model.categoryVisible || sortFilterRoomListModel.filterText.length > 0 - height: model.categoryVisible || sortFilterRoomListModel.filterText.length > 0 ? implicitHeight : 0 + property bool itemVisible: model.categoryVisible || sortFilterRoomListModel.filterText.length > 0 || Config.mergeRoomList + visible: itemVisible + height: itemVisible ? implicitHeight : 0 focus: true action: Kirigami.Action { id: enterRoomAction diff --git a/imports/NeoChat/Page/SettingsPage.qml b/imports/NeoChat/Page/SettingsPage.qml index 85906ce46..8aff41fcc 100644 --- a/imports/NeoChat/Page/SettingsPage.qml +++ b/imports/NeoChat/Page/SettingsPage.qml @@ -20,18 +20,20 @@ Kirigami.ScrollablePage { id: showNotifications Kirigami.FormData.label: i18n("Show Notifications:") checked: Config.showNotifications + onToggled: Config.showNotifications = checked } - } - - footer: RowLayout { - QQC2.Button { - Layout.alignment: Qt.AlignRight - Layout.margins: Kirigami.Units.smallSpacing - text: i18n("Save") - onClicked: { - Config.showNotifications = showNotifications.checked; - Config.save(); - } + QQC2.RadioButton { + id: mergeRoomList + Kirigami.FormData.label: i18n("Rooms and private chats:") + text: i18n("Separated") + checked: Config.mergeRoomList + onToggled: Config.mergeRoomList = true + } + QQC2.RadioButton { + id: mergeRoomList + text: i18n("Intermixed") + checked: !Config.mergeRoomList + onToggled: Config.mergeRoomList = false } } } diff --git a/src/neochatconfig.kcfg b/src/neochatconfig.kcfg index e07dfd1a7..0a8a602c4 100644 --- a/src/neochatconfig.kcfg +++ b/src/neochatconfig.kcfg @@ -15,6 +15,10 @@ true + + + false + diff --git a/src/sortfilterroomlistmodel.cpp b/src/sortfilterroomlistmodel.cpp index 5a63ba6d5..dba5d74f9 100644 --- a/src/sortfilterroomlistmodel.cpp +++ b/src/sortfilterroomlistmodel.cpp @@ -26,6 +26,7 @@ void SortFilterRoomListModel::setRoomSortOrder(SortFilterRoomListModel::RoomSort setSortRole(RoomListModel::NameRole); else if (sortOrder == SortFilterRoomListModel::LastActivity) setSortRole(RoomListModel::LastActiveTimeRole); + invalidate(); } SortFilterRoomListModel::RoomSortOrder SortFilterRoomListModel::roomSortOrder() const @@ -35,6 +36,21 @@ SortFilterRoomListModel::RoomSortOrder SortFilterRoomListModel::roomSortOrder() bool SortFilterRoomListModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { + if (m_sortOrder == SortFilterRoomListModel::LastActivity) { + // display favorite rooms always on top + const auto categoryLeft = static_cast(sourceModel()->data(source_left, RoomListModel::CategoryRole).toInt()); + const auto categoryRight = static_cast(sourceModel()->data(source_right, RoomListModel::CategoryRole).toInt()); + + if (categoryLeft == RoomType::Types::Favorite && categoryRight == RoomType::Types::Favorite) { + return sourceModel()->data(source_left, RoomListModel::LastActiveTimeRole).toDateTime() > sourceModel()->data(source_right, RoomListModel::LastActiveTimeRole).toDateTime(); + } else if (categoryLeft == RoomType::Types::Favorite) { + return true; + } else if (categoryRight == RoomType::Types::Favorite) { + return false; + } + + return sourceModel()->data(source_left, RoomListModel::LastActiveTimeRole).toDateTime() > sourceModel()->data(source_right, RoomListModel::LastActiveTimeRole).toDateTime(); + } if (m_sortOrder != SortFilterRoomListModel::Categories) return QSortFilterProxyModel::lessThan(source_left, source_right); if (sourceModel()->data(source_left, RoomListModel::CategoryRole) != sourceModel()->data(source_right, RoomListModel::CategoryRole))