/* * Copyright (c) 2010-2024 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 "ChatProxy.hpp" #include "ChatGui.hpp" #include "ChatList.hpp" #include "core/App.hpp" DEFINE_ABSTRACT_OBJECT(ChatProxy) ChatProxy::ChatProxy(QObject *parent) : LimitProxy(parent) { mList = ChatList::create(); setSourceModel(mList.get()); setDynamicSortFilter(true); } ChatProxy::~ChatProxy() { } void ChatProxy::setSourceModel(QAbstractItemModel *model) { auto oldChatList = getListModel(); if (oldChatList) { disconnect(oldChatList); } auto newChatList = dynamic_cast(model); if (newChatList) { connect(this, &ChatProxy::filterTextChanged, newChatList, [this, newChatList] { emit newChatList->filterChanged(getFilterText()); }); connect(newChatList, &ChatList::chatRemoved, this, &ChatProxy::chatRemoved); connect(newChatList, &ChatList::chatAdded, this, [this] { invalidate(); }); connect(newChatList, &ChatList::dataChanged, this, [this] { invalidate(); }); } auto firstList = new SortFilterList(model, Qt::AscendingOrder); firstList->setDynamicSortFilter(true); setSourceModels(firstList); sort(0); } int ChatProxy::findChatIndex(ChatGui *chatGui) { auto chatList = getListModel(); if (chatList) { auto listIndex = chatList->findChatIndex(chatGui); if (listIndex != -1) { listIndex = dynamic_cast(sourceModel())->mapFromSource(chatList->index(listIndex, 0)).row(); if (mMaxDisplayItems <= listIndex) setMaxDisplayItems(listIndex + mDisplayItemsStep); return listIndex; } } return -1; } void ChatProxy::addChatInList(ChatGui *chatGui) { auto chatList = getListModel(); if (chatList && chatGui) { chatList->addChatInList(chatGui->mCore); } } bool ChatProxy::SortFilterList::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { return true; } bool ChatProxy::SortFilterList::lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const { if (!mFilterText.isEmpty()) return false; auto l = getItemAtSource(sourceLeft.row()); auto r = getItemAtSource(sourceRight.row()); if (l && r) return l->getLastUpdatedTime() >= r->getLastUpdatedTime(); return false; }