/
erhoof
/
telegraf
Обзор
Документация
Войти
/
erhoof
/
telegraf
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/data/chatpermissionfiltermodel.cpp
116 строк
4 KB
mbarashkov
Исправлен выбор чатов при пересылке сообщений
21 май 2025, 15:40
21 май 2025, 15:40
c5e2206
Код
Авторство
О чём код?
#include "chatpermissionfiltermodel.h" #include "chatlistmodel.h" #include "groupsmodel.h" #include "../debuglog.h" namespace { const char PERMISSIONS[] = "permissions"; const char STATUS[] = "status"; } ChatPermissionFilterModel::ChatPermissionFilterModel(QObject *parent) : QSortFilterProxyModel(parent) { setDynamicSortFilter(true); } void ChatPermissionFilterModel::setSource(QObject *model) { ChatListModel* chatListModel = qobject_cast<ChatListModel*>(model); auto chatListModelClone = chatListModel->clone(); setSourceModel(chatListModelClone); } void ChatPermissionFilterModel::setSourceModel(QAbstractItemModel *model) { if (sourceModel() != model) { QSortFilterProxyModel::setSourceModel(model); sort(0, Qt::DescendingOrder); emit sourceChanged(); } } ChatPermissionFilterModel::~ChatPermissionFilterModel() { auto _sourceModel = sourceModel(); if(_sourceModel != nullptr) { delete _sourceModel; } } QStringList ChatPermissionFilterModel::getRequirePermissions() const { return requirePermissions; } void ChatPermissionFilterModel::setRequirePermissions(QStringList permissions) { if (requirePermissions != permissions) { requirePermissions = permissions; invalidateFilter(); emit requirePermissionsChanged(); } } bool ChatPermissionFilterModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { auto chatListSourceModel = (ChatListModel*)(sourceModel()); auto dataLeft = chatListSourceModel->getChatData(source_left.row()); auto dataRight = chatListSourceModel->getChatData(source_right.row()); return dataLeft->compareTo(dataRight) == 1; } bool ChatPermissionFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const { QAbstractItemModel* model = sourceModel(); if (model && !requirePermissions.isEmpty()) { const GroupModel *group = Q_NULLPTR; const QModelIndex index(model->index(sourceRow, 0, sourceParent)); TDLibConstants::ChatType chatType = (TDLibConstants::ChatType) model->data(index, ChatListModel::RoleChatType).toInt(); switch (chatType) { case TDLibConstants::ChatTypeUnknown: return false; case TDLibConstants::ChatTypePrivate: case TDLibConstants::ChatTypeSecret: case TDLibConstants::ChatTypeBot: return true; case TDLibConstants::ChatTypeBasicGroup: case TDLibConstants::ChatTypeSuperGroup: group = GroupsModel::getInstance()->getGroup(model->data(index, ChatListModel::RoleGroupId).toLongLong()); break; } if (group) { TDLibConstants::ChatMemberStatus memberStatus = (TDLibConstants::ChatMemberStatus) model->data(index, ChatListModel::RoleChatMemberStatus).toInt(); QVariantMap permissions; switch (memberStatus) { case TDLibConstants::ChatMemberStatusCreator: case TDLibConstants::ChatMemberStatusAdministrator: return true; case TDLibConstants::ChatMemberStatusMember: permissions = model->data(index, ChatListModel::RoleDisplay).toMap().value(PERMISSIONS).toMap(); break; case TDLibConstants::ChatMemberStatusRestricted: permissions = group->groupInfo.value(STATUS).toMap().value(PERMISSIONS).toMap(); break; case TDLibConstants::ChatMemberStatusLeft: case TDLibConstants::ChatMemberStatusUnknown: case TDLibConstants::ChatMemberStatusBanned: return false; } if (!permissions.isEmpty()) { const int n = requirePermissions.count(); for (int i = 0; i < n; i++) { if (permissions.value(requirePermissions.at(i)).toBool()) { return true; } } } } } return false; }