Fix crash at exit:
Do not use QSharedPointer on object managed by GUI. Use Proxies to propagate list.
This commit is contained in:
parent
860f0cd297
commit
228b922d3e
6 changed files with 31 additions and 33 deletions
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue