Fix crash at exit:

Do not use QSharedPointer on object managed by GUI.
Use Proxies to propagate list.
This commit is contained in:
Julien Wadel 2024-09-30 10:49:49 +02:00
parent 860f0cd297
commit 228b922d3e
6 changed files with 31 additions and 33 deletions

View file

@ -37,13 +37,6 @@ QSharedPointer<MagicSearchList> MagicSearchList::create() {
return model;
}
QSharedPointer<MagicSearchList> MagicSearchList::create(MagicSearchList *magicSearchList) {
auto model = QSharedPointer<MagicSearchList>(magicSearchList, &QObject::deleteLater);
model->moveToThread(App::getInstance()->thread());
model->setSelf(model);
return model;
}
MagicSearchList::MagicSearchList(QObject *parent) : ListProxy(parent) {
mustBeInMainThread(getClassName());
mSourceFlags = (int)linphone::MagicSearch::Source::Friends | (int)linphone::MagicSearch::Source::LdapServers;
@ -130,6 +123,7 @@ void MagicSearchList::setSelf(QSharedPointer<MagicSearchList> me) {
delete contacts;
});
});
qDebug() << log().arg("Initialized");
emit initialized();
});
});

View file

@ -36,7 +36,6 @@ class MagicSearchList : public ListProxy, public AbstractObject {
Q_OBJECT
public:
static QSharedPointer<MagicSearchList> create();
static QSharedPointer<MagicSearchList> create(MagicSearchList *magicSearchList);
MagicSearchList(QObject *parent = Q_NULLPTR);
~MagicSearchList();

View file

@ -25,11 +25,10 @@
MagicSearchProxy::MagicSearchProxy(QObject *parent) : SortFilterProxy(parent) {
mSourceFlags = (int)LinphoneEnums::MagicSearchSource::Friends | (int)LinphoneEnums::MagicSearchSource::LdapServers;
mAggregationFlag = LinphoneEnums::MagicSearchAggregation::Friend;
setSourceModel(new MagicSearchList());
setList(MagicSearchList::create());
sort(0);
connect(this, &MagicSearchProxy::forceUpdate, [this] {
auto magicSearchList = qobject_cast<MagicSearchList *>(sourceModel());
if (magicSearchList) emit magicSearchList->lSearch(mSearchText);
if (mList) emit mList->lSearch(mSearchText);
});
}
@ -37,28 +36,26 @@ MagicSearchProxy::~MagicSearchProxy() {
setSourceModel(nullptr);
}
void MagicSearchProxy::setSourceModel(QAbstractItemModel *model) {
auto oldMagicSearchList = dynamic_cast<MagicSearchList *>(sourceModel());
if (oldMagicSearchList) {
disconnect(oldMagicSearchList);
void MagicSearchProxy::setList(QSharedPointer<MagicSearchList> newList) {
if (mList == newList) return;
if (mList) {
disconnect(mList.get());
}
auto newMagicSearchList = dynamic_cast<MagicSearchList *>(model);
if (newMagicSearchList) {
mList = MagicSearchList::create(newMagicSearchList);
connect(newMagicSearchList, &MagicSearchList::sourceFlagsChanged, this, &MagicSearchProxy::sourceFlagsChanged);
connect(newMagicSearchList, &MagicSearchList::aggregationFlagChanged, this,
&MagicSearchProxy::aggregationFlagChanged);
connect(newMagicSearchList, &MagicSearchList::friendCreated, this, [this](int index) {
mList = newList;
if (mList) {
connect(mList.get(), &MagicSearchList::sourceFlagsChanged, this, &MagicSearchProxy::sourceFlagsChanged);
connect(mList.get(), &MagicSearchList::aggregationFlagChanged, this, &MagicSearchProxy::aggregationFlagChanged);
connect(mList.get(), &MagicSearchList::friendCreated, this, [this](int index) {
auto proxyIndex = mapFromSource(sourceModel()->index(index, 0));
emit friendCreated(proxyIndex.row());
});
connect(newMagicSearchList, &MagicSearchList::initialized, this, [this, newMagicSearchList] {
emit newMagicSearchList->lSetSourceFlags(mSourceFlags);
emit newMagicSearchList->lSetAggregationFlag(mAggregationFlag);
connect(mList.get(), &MagicSearchList::initialized, this, [this, newList = mList.get()] {
emit newList->lSetSourceFlags(mSourceFlags);
emit newList->lSetAggregationFlag(mAggregationFlag);
emit initialized();
});
}
QSortFilterProxyModel::setSourceModel(model);
setSourceModel(mList.get());
}
int MagicSearchProxy::findFriendIndexByAddress(const QString &address) {
@ -101,6 +98,11 @@ void MagicSearchProxy::setShowFavoritesOnly(bool show) {
}
}
void MagicSearchProxy::setParentProxy(MagicSearchProxy *proxy) {
setList(proxy->mList);
emit parentProxyChanged();
}
LinphoneEnums::MagicSearchAggregation MagicSearchProxy::getAggregationFlag() const {
return mAggregationFlag;
}

View file

@ -35,6 +35,7 @@ class MagicSearchProxy : public SortFilterProxy {
Q_PROPERTY(LinphoneEnums::MagicSearchAggregation aggregationFlag READ getAggregationFlag WRITE setAggregationFlag
NOTIFY aggregationFlagChanged)
Q_PROPERTY(bool showFavoritesOnly READ showFavoritesOnly WRITE setShowFavoritesOnly NOTIFY showFavoriteOnlyChanged)
Q_PROPERTY(MagicSearchProxy *parentProxy WRITE setParentProxy NOTIFY parentProxyChanged)
public:
MagicSearchProxy(QObject *parent = Q_NULLPTR);
@ -52,7 +53,8 @@ public:
bool showFavoritesOnly() const;
void setShowFavoritesOnly(bool show);
void setSourceModel(QAbstractItemModel *sourceModel) override;
void setList(QSharedPointer<MagicSearchList> list);
Q_INVOKABLE void setParentProxy(MagicSearchProxy *proxy);
// Q_INVOKABLE forceUpdate();
Q_INVOKABLE int findFriendIndexByAddress(const QString &address);
@ -64,7 +66,8 @@ signals:
void forceUpdate();
void friendCreated(int index);
void showFavoriteOnlyChanged();
void initialized();
void parentProxyChanged();
void initialized();
protected:
QString mSearchText;

View file

@ -27,7 +27,7 @@ ListView {
property bool showFavoritesOnly: false
property bool showDefaultAddress: false
property var sourceModel: MagicSearchList{}
property var listProxy: MagicSearchProxy{}
// Model properties
// set searchBarText without specifying a model to bold
@ -97,7 +97,7 @@ ListView {
mainItem.currentIndex = index
}
aggregationFlag: mainItem.aggregationFlag
sourceModel: mainItem.sourceModel
parentProxy: mainItem.listProxy
sourceFlags: LinphoneEnums.MagicSearchSource.Friends | ((mainItem.searchText.length > 0 && mainItem.searchText != "*") || SettingsCpp.syncLdapContacts ? LinphoneEnums.MagicSearchSource.LdapServers : 0)
onInitialized: {
magicSearchProxy.forceUpdate()

View file

@ -59,7 +59,7 @@ AbstractMainPage {
showDefaultItem: contactList.model.sourceModel.count === 0
MagicSearchList {
MagicSearchProxy {
id: allFriends
}
@ -281,7 +281,7 @@ AbstractMainPage {
showFavoritesOnly: true
contactMenuVisible: true
searchBarText: searchBar.text
sourceModel: allFriends
listProxy: allFriends
onSelectedContactChanged: {
if (selectedContact) {
contactList.currentIndex = -1
@ -338,7 +338,7 @@ AbstractMainPage {
contactMenuVisible: true
highlightFollowsCurrentItem: true
searchBarText: searchBar.text
sourceModel: allFriends
listProxy: allFriends
Connections {
target: contactList.model
function onFriendCreated(index) {