Create new rooms module
This commit is contained in:
@@ -26,6 +26,8 @@ target_sources(LibNeoChat PRIVATE
|
||||
enums/messagetype.h
|
||||
enums/powerlevel.cpp
|
||||
enums/pushrule.h
|
||||
enums/roomsortparameter.cpp
|
||||
enums/roomsortorder.h
|
||||
events/imagepackevent.cpp
|
||||
events/pollevent.cpp
|
||||
models/actionsmodel.cpp
|
||||
|
||||
31
src/libneochat/enums/roomsortorder.h
Normal file
31
src/libneochat/enums/roomsortorder.h
Normal file
@@ -0,0 +1,31 @@
|
||||
// SPDX-FileCopyrightText: 2025 James Graham <james.h.graham@protonmail.com>
|
||||
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QQmlEngine>
|
||||
|
||||
/**
|
||||
* @class RoomSortOrder
|
||||
*
|
||||
* This class is designed to define the RoomSortOrder enumeration.
|
||||
*/
|
||||
class RoomSortOrder : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
QML_UNCREATABLE("")
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief The types of messages that can be shown.
|
||||
*/
|
||||
enum Order {
|
||||
Alphabetical = 0, /**< The room should be sorted alphabetically. */
|
||||
Activity, /**< The room should be sorted by important activity. */
|
||||
LastMessage, /**< The room should be sorted by last message in the room. */
|
||||
Custom, /**< Use a custom sort order. */
|
||||
};
|
||||
Q_ENUM(Order);
|
||||
};
|
||||
161
src/libneochat/enums/roomsortparameter.cpp
Normal file
161
src/libneochat/enums/roomsortparameter.cpp
Normal file
@@ -0,0 +1,161 @@
|
||||
// SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
|
||||
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
|
||||
#include "roomsortparameter.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "enums/roomsortorder.h"
|
||||
#include "neochatroom.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
template<typename T>
|
||||
int typeCompare(T left, T right)
|
||||
{
|
||||
return left == right ? 0 : left > right ? 1 : -1;
|
||||
}
|
||||
|
||||
template<>
|
||||
int typeCompare<QString>(QString left, QString right)
|
||||
{
|
||||
return left.localeAwareCompare(right);
|
||||
}
|
||||
|
||||
static const QList<RoomSortParameter::Parameter> allSortPriorities = {
|
||||
RoomSortParameter::AlphabeticalAscending,
|
||||
RoomSortParameter::AlphabeticalDescending,
|
||||
RoomSortParameter::HasUnread,
|
||||
RoomSortParameter::MostUnread,
|
||||
RoomSortParameter::HasHighlight,
|
||||
RoomSortParameter::MostHighlights,
|
||||
RoomSortParameter::LastActive,
|
||||
};
|
||||
|
||||
static const QList<RoomSortParameter::Parameter> alphabeticalSortPriorities = {
|
||||
RoomSortParameter::AlphabeticalAscending,
|
||||
};
|
||||
|
||||
static const QList<RoomSortParameter::Parameter> activitySortPriorities = {
|
||||
RoomSortParameter::HasHighlight,
|
||||
RoomSortParameter::MostHighlights,
|
||||
RoomSortParameter::HasUnread,
|
||||
RoomSortParameter::MostUnread,
|
||||
RoomSortParameter::LastActive,
|
||||
};
|
||||
|
||||
static const QList<RoomSortParameter::Parameter> lastMessageSortPriorities = {
|
||||
RoomSortParameter::LastActive,
|
||||
};
|
||||
}
|
||||
|
||||
RoomSortOrder::Order RoomSortParameter::m_sortOrder = RoomSortOrder::Activity;
|
||||
QList<RoomSortParameter::Parameter> RoomSortParameter::m_customSortOrder = activitySortPriorities;
|
||||
|
||||
QList<RoomSortParameter::Parameter> RoomSortParameter::allParameterList()
|
||||
{
|
||||
return allSortPriorities;
|
||||
}
|
||||
|
||||
QList<RoomSortParameter::Parameter> RoomSortParameter::currentParameterList()
|
||||
{
|
||||
QList<RoomSortParameter::Parameter> configParamList;
|
||||
switch (m_sortOrder) {
|
||||
case RoomSortOrder::Activity:
|
||||
configParamList = activitySortPriorities;
|
||||
break;
|
||||
case RoomSortOrder::Alphabetical:
|
||||
configParamList = alphabeticalSortPriorities;
|
||||
break;
|
||||
case RoomSortOrder::LastMessage:
|
||||
configParamList = lastMessageSortPriorities;
|
||||
break;
|
||||
case RoomSortOrder::Custom: {
|
||||
configParamList = m_customSortOrder;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (configParamList.isEmpty()) {
|
||||
return activitySortPriorities;
|
||||
}
|
||||
return configParamList;
|
||||
}
|
||||
|
||||
int RoomSortParameter::compareParameter(Parameter parameter, NeoChatRoom *leftRoom, NeoChatRoom *rightRoom)
|
||||
{
|
||||
switch (parameter) {
|
||||
case AlphabeticalAscending:
|
||||
return compareParameter<AlphabeticalAscending>(leftRoom, rightRoom);
|
||||
case AlphabeticalDescending:
|
||||
return compareParameter<AlphabeticalDescending>(leftRoom, rightRoom);
|
||||
case HasUnread:
|
||||
return compareParameter<HasUnread>(leftRoom, rightRoom);
|
||||
case MostUnread:
|
||||
return compareParameter<MostUnread>(leftRoom, rightRoom);
|
||||
case HasHighlight:
|
||||
return compareParameter<HasHighlight>(leftRoom, rightRoom);
|
||||
case MostHighlights:
|
||||
return compareParameter<MostHighlights>(leftRoom, rightRoom);
|
||||
case LastActive:
|
||||
return compareParameter<LastActive>(leftRoom, rightRoom);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::AlphabeticalAscending>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom)
|
||||
{
|
||||
return -typeCompare(leftRoom->displayName(), rightRoom->displayName());
|
||||
}
|
||||
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::AlphabeticalDescending>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom)
|
||||
{
|
||||
return typeCompare(leftRoom->displayName(), rightRoom->displayName());
|
||||
}
|
||||
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::HasUnread>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom)
|
||||
{
|
||||
return typeCompare(leftRoom->contextAwareNotificationCount() > 0, rightRoom->contextAwareNotificationCount() > 0);
|
||||
}
|
||||
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::MostUnread>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom)
|
||||
{
|
||||
return typeCompare(leftRoom->contextAwareNotificationCount(), rightRoom->contextAwareNotificationCount());
|
||||
}
|
||||
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::HasHighlight>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom)
|
||||
{
|
||||
const auto leftHighlight = leftRoom->highlightCount() > 0 && leftRoom->contextAwareNotificationCount() > 0;
|
||||
const auto rightHighlight = rightRoom->highlightCount() > 0 && rightRoom->contextAwareNotificationCount() > 0;
|
||||
return typeCompare(leftHighlight, rightHighlight);
|
||||
}
|
||||
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::MostHighlights>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom)
|
||||
{
|
||||
return typeCompare(int(leftRoom->highlightCount()), int(rightRoom->highlightCount()));
|
||||
}
|
||||
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::LastActive>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom)
|
||||
{
|
||||
return typeCompare(leftRoom->lastActiveTime(), rightRoom->lastActiveTime());
|
||||
}
|
||||
|
||||
void RoomSortParameter::setSortOrder(RoomSortOrder::Order order)
|
||||
{
|
||||
RoomSortParameter::m_sortOrder = order;
|
||||
}
|
||||
|
||||
void RoomSortParameter::setCustomSortOrder(QList<Parameter> order)
|
||||
{
|
||||
RoomSortParameter::m_customSortOrder = order;
|
||||
}
|
||||
144
src/libneochat/enums/roomsortparameter.h
Normal file
144
src/libneochat/enums/roomsortparameter.h
Normal file
@@ -0,0 +1,144 @@
|
||||
// SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
|
||||
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "roomsortorder.h"
|
||||
#include <QObject>
|
||||
#include <QQmlEngine>
|
||||
|
||||
#include <KLocalizedString>
|
||||
|
||||
class NeoChatRoom;
|
||||
|
||||
/**
|
||||
* @class RoomSortParameter
|
||||
*
|
||||
* A class with the Parameter enum for room sort parameters.
|
||||
*/
|
||||
class RoomSortParameter : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
QML_UNCREATABLE("")
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Defines the available sort parameters.
|
||||
*
|
||||
* @note All values are specifically numbered as they should never change even
|
||||
* if new options are later added. This is because they are stored in
|
||||
* the config as ints and changing would break someones config on upgrade.
|
||||
*/
|
||||
enum Parameter {
|
||||
AlphabeticalAscending = 0,
|
||||
AlphabeticalDescending = 1,
|
||||
HasUnread = 2,
|
||||
MostUnread = 3,
|
||||
HasHighlight = 4,
|
||||
MostHighlights = 5,
|
||||
LastActive = 6,
|
||||
};
|
||||
Q_ENUM(Parameter)
|
||||
|
||||
/**
|
||||
* @brief Translate the Parameter enum value to a human readable name string.
|
||||
*
|
||||
* @sa Parameter
|
||||
*/
|
||||
Q_INVOKABLE static QString parameterName(Parameter parameter)
|
||||
{
|
||||
switch (parameter) {
|
||||
case Parameter::AlphabeticalAscending:
|
||||
return i18nc("As in sorting alphabetically with A first and Z last", "Alphabetical Ascending");
|
||||
case Parameter::AlphabeticalDescending:
|
||||
return i18nc("As in sorting alphabetically with Z first and A last", "Alphabetical Descending");
|
||||
case Parameter::HasUnread:
|
||||
return i18nc("As in sorting rooms with unread message above those without", "Has Unread Messages");
|
||||
case Parameter::MostUnread:
|
||||
return i18nc("As in sorting rooms with the most unread messages higher", "Most Unread Messages");
|
||||
case Parameter::HasHighlight:
|
||||
return i18nc("As in sorting rooms with highlighted message above those without", "Has Highlighted Messages");
|
||||
case Parameter::MostHighlights:
|
||||
return i18nc("As in sorting rooms with the most highlighted messages higher", "Most Highlighted Messages");
|
||||
case Parameter::LastActive:
|
||||
return i18nc("As in sorting the chat room with the newest meassage first", "Last Active");
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Translate the Parameter enum value to a human readable description string.
|
||||
*
|
||||
* @sa Parameter
|
||||
*/
|
||||
Q_INVOKABLE static QString parameterDescription(Parameter parameter)
|
||||
{
|
||||
switch (parameter) {
|
||||
case Parameter::AlphabeticalAscending:
|
||||
return i18nc("@info", "Room names closer to A alphabetically are higher");
|
||||
case Parameter::AlphabeticalDescending:
|
||||
return i18nc("@info", "Room names closer to Z alphabetically are higher");
|
||||
case Parameter::HasUnread:
|
||||
return i18nc("@info", "Rooms with unread messages are higher");
|
||||
case Parameter::MostUnread:
|
||||
return i18nc("@info", "Rooms with the most unread message are higher");
|
||||
case Parameter::HasHighlight:
|
||||
return i18nc("@info", "Rooms with highlighted messages are higher");
|
||||
case Parameter::MostHighlights:
|
||||
return i18nc("@info", "Rooms with the most highlighted messages are higher");
|
||||
case Parameter::LastActive:
|
||||
return i18nc("@info", "Rooms with the newer messages are higher");
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief List of all available Parameter sort orders.
|
||||
*/
|
||||
static QList<Parameter> allParameterList();
|
||||
|
||||
/**
|
||||
* @brief The current Parameter sort order list.
|
||||
*/
|
||||
static QList<Parameter> currentParameterList();
|
||||
|
||||
/**
|
||||
* @brief Compare the given parameter of the two given rooms.
|
||||
*
|
||||
* @return 0 if they are equal, 1 if the left is greater and -1 if the right is greater.
|
||||
*
|
||||
* @sa Parameter
|
||||
*/
|
||||
static int compareParameter(Parameter parameter, NeoChatRoom *leftRoom, NeoChatRoom *rightRoom);
|
||||
|
||||
static void setSortOrder(RoomSortOrder::Order order);
|
||||
static void setCustomSortOrder(QList<Parameter> order);
|
||||
|
||||
private:
|
||||
static RoomSortOrder::Order m_sortOrder;
|
||||
static QList<Parameter> m_customSortOrder;
|
||||
|
||||
template<Parameter parameter>
|
||||
static int compareParameter(NeoChatRoom *, NeoChatRoom *)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::AlphabeticalAscending>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom);
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::AlphabeticalDescending>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom);
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::HasUnread>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom);
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::MostUnread>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom);
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::HasHighlight>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom);
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::MostHighlights>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom);
|
||||
template<>
|
||||
int RoomSortParameter::compareParameter<RoomSortParameter::LastActive>(NeoChatRoom *leftRoom, NeoChatRoom *rightRoom);
|
||||
Reference in New Issue
Block a user