mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-26 04:58:49 +03:00
Possibly fix crash when room is cleared on event delegate
This commit is contained in:
parent
7982c2bd75
commit
81cf29f924
1 changed files with 55 additions and 44 deletions
|
@ -162,48 +162,50 @@ EventDelegateChooser::DelegateIncubator::setInitialState(QObject *obj)
|
||||||
|
|
||||||
// setInitialProperties(rolesToSet);
|
// setInitialProperties(rolesToSet);
|
||||||
|
|
||||||
auto update =
|
auto update = [this, obj, roleToPropIdx = std::move(roleToPropIdx)](
|
||||||
[this, obj, roleToPropIdx = std::move(roleToPropIdx)](const QList<int> &changedRoles) {
|
const QList<int> &changedRoles, TimelineModel *room) {
|
||||||
if (changedRoles.empty() || changedRoles.contains(TimelineModel::Roles::Type)) {
|
if (!room)
|
||||||
int type = chooser.room_
|
return;
|
||||||
->dataById(currentId,
|
|
||||||
TimelineModel::Roles::Type,
|
|
||||||
forReply ? chooser.eventId_ : QString())
|
|
||||||
.toInt();
|
|
||||||
if (type != oldType) {
|
|
||||||
// nhlog::ui()->debug("Type changed!");
|
|
||||||
reset(currentId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<QModelRoleData> rolesToRequest;
|
if (changedRoles.empty() || changedRoles.contains(TimelineModel::Roles::Type)) {
|
||||||
|
int type = room
|
||||||
|
->dataById(currentId,
|
||||||
|
TimelineModel::Roles::Type,
|
||||||
|
forReply ? chooser.eventId_ : QString())
|
||||||
|
.toInt();
|
||||||
|
if (type != oldType) {
|
||||||
|
// nhlog::ui()->debug("Type changed!");
|
||||||
|
reset(currentId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (changedRoles.empty()) {
|
std::vector<QModelRoleData> rolesToRequest;
|
||||||
for (const auto role :
|
|
||||||
std::ranges::subrange(roleToPropIdx.keyBegin(), roleToPropIdx.keyEnd()))
|
|
||||||
rolesToRequest.emplace_back(role);
|
|
||||||
} else {
|
|
||||||
for (auto role : changedRoles) {
|
|
||||||
if (roleToPropIdx.contains(role)) {
|
|
||||||
rolesToRequest.emplace_back(role);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rolesToRequest.empty())
|
if (changedRoles.empty()) {
|
||||||
return;
|
for (const auto role :
|
||||||
|
std::ranges::subrange(roleToPropIdx.keyBegin(), roleToPropIdx.keyEnd()))
|
||||||
|
rolesToRequest.emplace_back(role);
|
||||||
|
} else {
|
||||||
|
for (auto role : changedRoles) {
|
||||||
|
if (roleToPropIdx.contains(role)) {
|
||||||
|
rolesToRequest.emplace_back(role);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto mo = obj->metaObject();
|
if (rolesToRequest.empty())
|
||||||
chooser.room_->multiData(
|
return;
|
||||||
currentId, forReply ? chooser.eventId_ : QString(), rolesToRequest);
|
|
||||||
|
|
||||||
Qt::beginPropertyUpdateGroup();
|
auto mo = obj->metaObject();
|
||||||
for (const auto &role : rolesToRequest) {
|
room->multiData(currentId, forReply ? chooser.eventId_ : QString(), rolesToRequest);
|
||||||
mo->property(roleToPropIdx[role.role()]).write(obj, role.data());
|
|
||||||
}
|
Qt::beginPropertyUpdateGroup();
|
||||||
Qt::endPropertyUpdateGroup();
|
for (const auto &role : rolesToRequest) {
|
||||||
};
|
mo->property(roleToPropIdx[role.role()]).write(obj, role.data());
|
||||||
|
}
|
||||||
|
Qt::endPropertyUpdateGroup();
|
||||||
|
};
|
||||||
|
|
||||||
if (!forReply) {
|
if (!forReply) {
|
||||||
auto row = chooser.room_->idToIndex(currentId);
|
auto row = chooser.room_->idToIndex(currentId);
|
||||||
|
@ -211,18 +213,27 @@ EventDelegateChooser::DelegateIncubator::setInitialState(QObject *obj)
|
||||||
chooser.room_,
|
chooser.room_,
|
||||||
&QAbstractItemModel::dataChanged,
|
&QAbstractItemModel::dataChanged,
|
||||||
obj,
|
obj,
|
||||||
[row, update](const QModelIndex &topLeft,
|
[row, update, room = chooser.room_](const QModelIndex &topLeft,
|
||||||
const QModelIndex &bottomRight,
|
const QModelIndex &bottomRight,
|
||||||
const QList<int> &changedRoles) {
|
const QList<int> &changedRoles) {
|
||||||
if (row < topLeft.row() || row > bottomRight.row())
|
if (row < topLeft.row() || row > bottomRight.row())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
update(changedRoles);
|
update(changedRoles, room);
|
||||||
},
|
},
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
connect(&this->chooser, &EventDelegateChooser::destroyed, obj, [connection]() {
|
connect(
|
||||||
QObject::disconnect(connection);
|
&this->chooser,
|
||||||
});
|
&EventDelegateChooser::destroyed,
|
||||||
|
obj,
|
||||||
|
[connection]() { QObject::disconnect(connection); },
|
||||||
|
Qt::SingleShotConnection);
|
||||||
|
connect(
|
||||||
|
&this->chooser,
|
||||||
|
&EventDelegateChooser::roomChanged,
|
||||||
|
obj,
|
||||||
|
[connection]() { QObject::disconnect(connection); },
|
||||||
|
Qt::SingleShotConnection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue