/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program 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.
*
* This program 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 this program. If not, see .
*/
#include "components/core/CoreManager.hpp"
#include "components/settings/AccountSettingsModel.hpp"
#include "components/sip-addresses/SipAddressesModel.hpp"
#include "utils/Utils.hpp"
#include "TimelineProxyModel.hpp"
#include "TimelineListModel.hpp"
#include "TimelineModel.hpp"
#include
// =============================================================================
// -----------------------------------------------------------------------------
TimelineProxyModel::TimelineProxyModel (QObject *parent) : QSortFilterProxyModel(parent) {
CoreManager *coreManager = CoreManager::getInstance();
AccountSettingsModel *accountSettingsModel = coreManager->getAccountSettingsModel();
TimelineListModel * model = CoreManager::getInstance()->getTimelineListModel();
connect(model, SIGNAL(selectedCountChanged(int)), this, SIGNAL(selectedCountChanged(int)));
connect(model, &TimelineListModel::updated, this, &TimelineProxyModel::invalidate);
setSourceModel(model);
QObject::connect(accountSettingsModel, &AccountSettingsModel::defaultProxyChanged, this, [this]() {
dynamic_cast(sourceModel())->update();
invalidate();
//updateCurrentSelection();
});
QObject::connect(coreManager->getSipAddressesModel(), &SipAddressesModel::sipAddressReset, this, [this]() {
dynamic_cast(sourceModel())->reset();
invalidate();// Invalidate and reload GUI if the model has been reset
//updateCurrentSelection();
});
sort(0);
}
// -----------------------------------------------------------------------------
/*
void TimelineProxyModel::setCurrentChatRoomModel(ChatRoomModel *data){
mCurrentChatRoomModel = CoreManager::getInstance()->getChatRoomModel(data);
emit currentChatRoomModelChanged(mCurrentChatRoomModel);
if(mCurrentChatRoomModel)
emit currentTimelineChanged(dynamic_cast(sourceModel())->getTimeline(mCurrentChatRoomModel->getChatRoom(), false).get());
else
emit currentTimelineChanged(nullptr);
}
ChatRoomModel *TimelineProxyModel::getCurrentChatRoomModel()const{
return mCurrentChatRoomModel.get();
}
void TimelineProxyModel::updateCurrentSelection(){
auto currentAddress = CoreManager::getInstance()->getAccountSettingsModel()->getUsedSipAddress();
if(mCurrentChatRoomModel && !mCurrentChatRoomModel->getChatRoom()->getMe()->getAddress()->weakEqual(currentAddress) ){
setCurrentChatRoomModel(nullptr);
}
}
*/
void TimelineProxyModel::unselectAll(){
dynamic_cast(sourceModel())->selectAll(false);
}
void TimelineProxyModel::setFilterFlags(const int& filterFlags){
if( mFilterFlags != filterFlags){
mFilterFlags = filterFlags;
invalidate();
emit filterFlagsChanged();
}
}
void TimelineProxyModel::setFilterText(const QString& text){
if( mFilterText != text){
mFilterText = text;
invalidate();
emit filterTextChanged();
}
}
// -----------------------------------------------------------------------------
bool TimelineProxyModel::filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const {
const QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
auto timeline = sourceModel()->data(index).value();
bool show = (mFilterFlags==0);// Show all at 0 (no hide all)
if( !show && ( (mFilterFlags & TimelineFilter::SimpleChatRoom) == TimelineFilter::SimpleChatRoom))
show = !timeline->getChatRoomModel()->isGroupEnabled() && !timeline->getChatRoomModel()->haveEncryption();
if( !show && ( (mFilterFlags & TimelineFilter::SecureChatRoom) == TimelineFilter::SecureChatRoom))
show = !timeline->getChatRoomModel()->isGroupEnabled() && timeline->getChatRoomModel()->haveEncryption();
if( !show && ( (mFilterFlags & TimelineFilter::GroupChatRoom) == TimelineFilter::GroupChatRoom))
show = timeline->getChatRoomModel()->isGroupEnabled() && !timeline->getChatRoomModel()->haveEncryption();
if( !show && ( (mFilterFlags & TimelineFilter::SecureGroupChatRoom) == TimelineFilter::SecureGroupChatRoom))
show = timeline->getChatRoomModel()->isGroupEnabled() && timeline->getChatRoomModel()->haveEncryption();
if( !show && ( (mFilterFlags & TimelineFilter::EphemeralChatRoom) == TimelineFilter::EphemeralChatRoom))
show = timeline->getChatRoomModel()->isEphemeralEnabled();
if(show && mFilterText != ""){
QRegularExpression search(mFilterText, QRegularExpression::CaseInsensitiveOption);
show = timeline->getChatRoomModel()->getSubject().contains(search)
|| timeline->getChatRoomModel()->getUsername().contains(search);
//|| timeline->getChatRoomModel()->getFullPeerAddress().contains(search); not enough significant?
}
return show;
}
bool TimelineProxyModel::lessThan (const QModelIndex &left, const QModelIndex &right) const {
const TimelineModel* a = sourceModel()->data(left).value();
const TimelineModel* b = sourceModel()->data(right).value();
return a->getChatRoomModel()->mLastUpdateTime >= b->getChatRoomModel()->mLastUpdateTime ;
}