/*
This file is part of Fernschreiber.
Fernschreiber is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Fernschreiber is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Fernschreiber. If not, see .
*/
#include "chatpermissionfiltermodel.h"
#include "chatlistmodel.h"
#define DEBUG_MODULE ChatPermissionFilterModel
#include "debuglog.h"
namespace {
const QString PERMISSIONS("permissions");
const QString STATUS("status");
}
ChatPermissionFilterModel::ChatPermissionFilterModel(QObject *parent) : QSortFilterProxyModel(parent)
{
setDynamicSortFilter(true);
}
void ChatPermissionFilterModel::setSource(QObject *model)
{
setSourceModel(qobject_cast(model));
}
void ChatPermissionFilterModel::setSourceModel(QAbstractItemModel *model)
{
if (sourceModel() != model) {
LOG(model);
QSortFilterProxyModel::setSourceModel(model);
emit sourceChanged();
}
}
TDLibWrapper *ChatPermissionFilterModel::getTDLibWrapper() const
{
return tdLibWrapper;
}
void ChatPermissionFilterModel::setTDLibWrapper(QObject *obj)
{
TDLibWrapper *wrapper = qobject_cast(obj);
if (tdLibWrapper != wrapper) {
tdLibWrapper = wrapper;
LOG(wrapper);
invalidateFilter();
}
}
QStringList ChatPermissionFilterModel::getRequirePermissions() const
{
return requirePermissions;
}
void ChatPermissionFilterModel::setRequirePermissions(QStringList permissions)
{
if (requirePermissions != permissions) {
requirePermissions = permissions;
LOG(requirePermissions);
invalidateFilter();
emit requirePermissionsChanged();
}
}
bool ChatPermissionFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const
{
QAbstractItemModel* model = sourceModel();
if (model && tdLibWrapper && !requirePermissions.isEmpty()) {
const TDLibWrapper::Group* group = Q_NULLPTR;
const QModelIndex index(model->index(sourceRow, 0, sourceParent));
TDLibWrapper::ChatType chatType = (TDLibWrapper::ChatType)
model->data(index, ChatListModel::RoleChatType).toInt();
switch (chatType) {
case TDLibWrapper::ChatTypeUnknown:
return false;
case TDLibWrapper::TDLibWrapper::ChatTypePrivate:
case TDLibWrapper::TDLibWrapper::ChatTypeSecret:
return true;
case TDLibWrapper::TDLibWrapper::ChatTypeBasicGroup:
case TDLibWrapper::TDLibWrapper::ChatTypeSupergroup:
group = tdLibWrapper->getGroup(model->data(index,
ChatListModel::RoleGroupId).toLongLong());
break;
}
if (group) {
TDLibWrapper::ChatMemberStatus memberStatus = (TDLibWrapper::ChatMemberStatus)
model->data(index, ChatListModel::RoleChatMemberStatus).toInt();
QVariantMap permissions;
switch (memberStatus) {
case TDLibWrapper::ChatMemberStatusCreator:
case TDLibWrapper::ChatMemberStatusAdministrator:
return true;
case TDLibWrapper::ChatMemberStatusMember:
permissions = model->data(index, ChatListModel::RoleDisplay).toMap().value(PERMISSIONS).toMap();
break;
case TDLibWrapper::ChatMemberStatusRestricted:
permissions = group->groupInfo.value(STATUS).toMap().value(PERMISSIONS).toMap();
break;
case TDLibWrapper::ChatMemberStatusLeft:
case TDLibWrapper::ChatMemberStatusUnknown:
case TDLibWrapper::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;
}