Implement sorting rooms by category
This commit is contained in:
@@ -25,7 +25,7 @@ ecm_setup_version(0.1.0
|
|||||||
)
|
)
|
||||||
|
|
||||||
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Widgets Core Quick Gui QuickControls2 Multimedia Svg)
|
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Widgets Core Quick Gui QuickControls2 Multimedia Svg)
|
||||||
find_package(KF5 ${REQUIRED_KF5_VERSION} REQUIRED COMPONENTS Kirigami2 ItemModels I18n Notifications Config CoreAddons)
|
find_package(KF5 ${REQUIRED_KF5_VERSION} REQUIRED COMPONENTS Kirigami2 I18n Notifications Config CoreAddons)
|
||||||
|
|
||||||
if(ANDROID)
|
if(ANDROID)
|
||||||
find_package(OpenSSL REQUIRED)
|
find_package(OpenSSL REQUIRED)
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import org.kde.kitemmodels 1.0
|
|||||||
import Spectral.Component 2.0
|
import Spectral.Component 2.0
|
||||||
import Spectral 0.1
|
import Spectral 0.1
|
||||||
|
|
||||||
|
import org.kde.neochat 1.0
|
||||||
|
|
||||||
Kirigami.ScrollablePage {
|
Kirigami.ScrollablePage {
|
||||||
id: page
|
id: page
|
||||||
|
|
||||||
@@ -21,7 +23,7 @@ Kirigami.ScrollablePage {
|
|||||||
property var enteredRoom
|
property var enteredRoom
|
||||||
property var searchText: ""
|
property var searchText: ""
|
||||||
|
|
||||||
onSearchTextChanged: sortedFilteredRoomListModel.invalidateFilter()
|
onSearchTextChanged: sortFilterRoomListModel.setFilterText(searchText)
|
||||||
|
|
||||||
signal enterRoom(var room)
|
signal enterRoom(var room)
|
||||||
signal leaveRoom(var room)
|
signal leaveRoom(var room)
|
||||||
@@ -37,23 +39,25 @@ Kirigami.ScrollablePage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ListView {
|
ListView {
|
||||||
model: KSortFilterProxyModel {
|
model: SortFilterRoomListModel {
|
||||||
id: sortedFilteredRoomListModel
|
id: sortFilterRoomListModel
|
||||||
sourceModel: roomListModel
|
sourceModel: roomListModel
|
||||||
|
roomSortOrder: SortFilterRoomListModel.Categories
|
||||||
|
}
|
||||||
|
|
||||||
sortRole: "name"
|
section.property: "category"
|
||||||
sortOrder: Qt.AscendingOrder
|
section.delegate: Kirigami.ListSectionHeader {
|
||||||
filterRowCallback: function(row, parent) {
|
id: sectionHeader
|
||||||
return (roomListModel.data(roomListModel.index(row, 0), RoomListModel.JoinStateRole) !== "upgraded") && roomListModel.data(roomListModel.index(row, 0), RoomListModel.NameRole).toLowerCase().includes(page.searchText.toLowerCase())
|
label: roomListModel.categoryName(section)
|
||||||
|
MouseArea {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
onClicked: roomListModel.setCategoryVisible(section, !roomListModel.categoryVisible(section))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
section.property: "categoryName"
|
|
||||||
section.delegate: Kirigami.ListSectionHeader {
|
|
||||||
label: section
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate: Kirigami.AbstractListItem {
|
delegate: Kirigami.AbstractListItem {
|
||||||
|
visible: model.categoryVisible
|
||||||
topPadding: Kirigami.Units.largeSpacing
|
topPadding: Kirigami.Units.largeSpacing
|
||||||
bottomPadding: Kirigami.Units.largeSpacing
|
bottomPadding: Kirigami.Units.largeSpacing
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ add_executable(neochat
|
|||||||
utils.cpp
|
utils.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
notificationsmanager.cpp
|
notificationsmanager.cpp
|
||||||
|
sortfilterroomlistmodel.cpp
|
||||||
../res.qrc
|
../res.qrc
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include "publicroomlistmodel.h"
|
#include "publicroomlistmodel.h"
|
||||||
#include "room.h"
|
#include "room.h"
|
||||||
#include "roomlistmodel.h"
|
#include "roomlistmodel.h"
|
||||||
|
#include "sortfilterroomlistmodel.h"
|
||||||
#include "spectralroom.h"
|
#include "spectralroom.h"
|
||||||
#include "spectraluser.h"
|
#include "spectraluser.h"
|
||||||
#include "trayicon.h"
|
#include "trayicon.h"
|
||||||
@@ -70,6 +71,7 @@ int main(int argc, char *argv[])
|
|||||||
qmlRegisterType<EmojiModel>("Spectral", 0, 1, "EmojiModel");
|
qmlRegisterType<EmojiModel>("Spectral", 0, 1, "EmojiModel");
|
||||||
qmlRegisterType<NotificationsManager>("Spectral", 0, 1, "NotificationsManager");
|
qmlRegisterType<NotificationsManager>("Spectral", 0, 1, "NotificationsManager");
|
||||||
qmlRegisterType<TrayIcon>("Spectral", 0, 1, "TrayIcon");
|
qmlRegisterType<TrayIcon>("Spectral", 0, 1, "TrayIcon");
|
||||||
|
qmlRegisterType<SortFilterRoomListModel>("org.kde.neochat", 1, 0, "SortFilterRoomListModel");
|
||||||
qmlRegisterUncreatableType<RoomMessageEvent>("Spectral", 0, 1, "RoomMessageEvent", "ENUM");
|
qmlRegisterUncreatableType<RoomMessageEvent>("Spectral", 0, 1, "RoomMessageEvent", "ENUM");
|
||||||
qmlRegisterUncreatableType<RoomType>("Spectral", 0, 1, "RoomType", "ENUM");
|
qmlRegisterUncreatableType<RoomType>("Spectral", 0, 1, "RoomType", "ENUM");
|
||||||
qmlRegisterUncreatableType<UserType>("Spectral", 0, 1, "UserType", "ENUM");
|
qmlRegisterUncreatableType<UserType>("Spectral", 0, 1, "UserType", "ENUM");
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
|
|
||||||
|
#include <KLocalizedString>
|
||||||
|
|
||||||
RoomListModel::RoomListModel(QObject *parent)
|
RoomListModel::RoomListModel(QObject *parent)
|
||||||
: QAbstractListModel(parent)
|
: QAbstractListModel(parent)
|
||||||
{
|
{
|
||||||
@@ -249,6 +251,8 @@ QVariant RoomListModel::data(const QModelIndex &index, int role) const
|
|||||||
}
|
}
|
||||||
if (role == CurrentRoomRole)
|
if (role == CurrentRoomRole)
|
||||||
return QVariant::fromValue(room);
|
return QVariant::fromValue(room);
|
||||||
|
if (role == CategoryVisibleRole)
|
||||||
|
return m_categoryVisibility.value(data(index, CategoryRole).toInt(), true);
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,5 +281,36 @@ QHash<int, QByteArray> RoomListModel::roleNames() const
|
|||||||
roles[LastActiveTimeRole] = "lastActiveTime";
|
roles[LastActiveTimeRole] = "lastActiveTime";
|
||||||
roles[JoinStateRole] = "joinState";
|
roles[JoinStateRole] = "joinState";
|
||||||
roles[CurrentRoomRole] = "currentRoom";
|
roles[CurrentRoomRole] = "currentRoom";
|
||||||
|
roles[CategoryVisibleRole] = "categoryVisible";
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString RoomListModel::categoryName(int section) const
|
||||||
|
{
|
||||||
|
switch (section) {
|
||||||
|
case 1:
|
||||||
|
return i18n("Invited");
|
||||||
|
case 2:
|
||||||
|
return i18n("Favorite");
|
||||||
|
case 3:
|
||||||
|
return i18n("Direct Messages");
|
||||||
|
case 4:
|
||||||
|
return i18n("Normal");
|
||||||
|
case 5:
|
||||||
|
return i18n("Low priority");
|
||||||
|
default:
|
||||||
|
return i18n("Deadbeef");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RoomListModel::setCategoryVisible(int category, bool visible)
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
m_categoryVisibility[category] = visible;
|
||||||
|
endResetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RoomListModel::categoryVisible(int category) const
|
||||||
|
{
|
||||||
|
return m_categoryVisibility.value(category, true);
|
||||||
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public:
|
|||||||
LastActiveTimeRole,
|
LastActiveTimeRole,
|
||||||
JoinStateRole,
|
JoinStateRole,
|
||||||
CurrentRoomRole,
|
CurrentRoomRole,
|
||||||
|
CategoryVisibleRole,
|
||||||
};
|
};
|
||||||
Q_ENUM(EventRoles)
|
Q_ENUM(EventRoles)
|
||||||
|
|
||||||
@@ -64,6 +65,10 @@ public:
|
|||||||
|
|
||||||
QHash<int, QByteArray> roleNames() const override;
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
|
|
||||||
|
Q_INVOKABLE QString categoryName(int category) const;
|
||||||
|
Q_INVOKABLE void setCategoryVisible(int category, bool visible);
|
||||||
|
Q_INVOKABLE bool categoryVisible(int category) const;
|
||||||
|
|
||||||
int notificationCount() const
|
int notificationCount() const
|
||||||
{
|
{
|
||||||
return m_notificationCount;
|
return m_notificationCount;
|
||||||
@@ -80,6 +85,8 @@ private:
|
|||||||
Connection *m_connection = nullptr;
|
Connection *m_connection = nullptr;
|
||||||
QList<SpectralRoom *> m_rooms;
|
QList<SpectralRoom *> m_rooms;
|
||||||
|
|
||||||
|
QMap<int, bool> m_categoryVisibility;
|
||||||
|
|
||||||
int m_notificationCount = 0;
|
int m_notificationCount = 0;
|
||||||
|
|
||||||
void connectRoomSignals(SpectralRoom *room);
|
void connectRoomSignals(SpectralRoom *room);
|
||||||
|
|||||||
46
src/sortfilterroomlistmodel.cpp
Normal file
46
src/sortfilterroomlistmodel.cpp
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/**
|
||||||
|
* SPDX-FileCopyrightText: Tobias Fella <fella@posteo.de>
|
||||||
|
*
|
||||||
|
* SPDX-LicenseIdentifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sortfilterroomlistmodel.h"
|
||||||
|
|
||||||
|
#include "roomlistmodel.h"
|
||||||
|
|
||||||
|
SortFilterRoomListModel::SortFilterRoomListModel(QObject *parent)
|
||||||
|
: QSortFilterProxyModel(parent)
|
||||||
|
{
|
||||||
|
setFilterRole(RoomListModel::NameRole);
|
||||||
|
setFilterCaseSensitivity(Qt::CaseInsensitive);
|
||||||
|
sort(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SortFilterRoomListModel::setRoomSortOrder(SortFilterRoomListModel::RoomSortOrder sortOrder)
|
||||||
|
{
|
||||||
|
m_sortOrder = sortOrder;
|
||||||
|
Q_EMIT roomSortOrderChanged();
|
||||||
|
if (sortOrder == SortFilterRoomListModel::Alphabetical)
|
||||||
|
setSortRole(RoomListModel::NameRole);
|
||||||
|
else if (sortOrder == SortFilterRoomListModel::LastActivity)
|
||||||
|
setSortRole(RoomListModel::LastActiveTimeRole);
|
||||||
|
}
|
||||||
|
|
||||||
|
SortFilterRoomListModel::RoomSortOrder SortFilterRoomListModel::roomSortOrder() const
|
||||||
|
{
|
||||||
|
return m_sortOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SortFilterRoomListModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
|
||||||
|
{
|
||||||
|
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))
|
||||||
|
return sourceModel()->data(source_left, RoomListModel::CategoryRole) < sourceModel()->data(source_right, RoomListModel::CategoryRole);
|
||||||
|
return sourceModel()->data(source_left, RoomListModel::NameRole) < sourceModel()->data(source_right, RoomListModel::NameRole);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SortFilterRoomListModel::setFilterText(const QString &text)
|
||||||
|
{
|
||||||
|
setFilterFixedString(text);
|
||||||
|
}
|
||||||
41
src/sortfilterroomlistmodel.h
Normal file
41
src/sortfilterroomlistmodel.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* SPDX-FileCopyrightText: Tobias Fella <fella@posteo.de>
|
||||||
|
*
|
||||||
|
* SPDX-LicenseIdentifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
|
||||||
|
class SortFilterRoomListModel : public QSortFilterProxyModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(RoomSortOrder roomSortOrder READ roomSortOrder WRITE setRoomSortOrder NOTIFY roomSortOrderChanged)
|
||||||
|
Q_PROPERTY(QAbstractItemModel *sourceModel READ sourceModel WRITE setSourceModel NOTIFY sourceModelChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum RoomSortOrder {
|
||||||
|
Alphabetical,
|
||||||
|
LastActivity,
|
||||||
|
Categories,
|
||||||
|
};
|
||||||
|
Q_ENUM(RoomSortOrder)
|
||||||
|
|
||||||
|
SortFilterRoomListModel(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
void setRoomSortOrder(RoomSortOrder sortOrder);
|
||||||
|
RoomSortOrder roomSortOrder() const;
|
||||||
|
|
||||||
|
Q_INVOKABLE void setFilterText(const QString &text);
|
||||||
|
|
||||||
|
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void roomSortOrderChanged();
|
||||||
|
void sourceModelChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
RoomSortOrder m_sortOrder;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user