Fence deferred message actions, release voice views and flush state before shutdown

This commit is contained in:
evgeny committed 2026-10-28 00:59:00 +01:00
1 parent adefef675c
commit 1235f770eb
3 files changed
+45 -20

No files matched your search

+15 -7
View File
@@ -99,12 +99,13 @@ struct VoicePlayState {
float displayElapsed = 0.0f;
};
static QMap<QString, VoicePlayState> s_voiceStates;
static QTimer* s_voiceTimer = nullptr;
static QAbstractItemView* s_voiceView = nullptr;
static QPointer<QTimer> s_voiceTimer;
static QPointer<QAbstractItemView> s_voiceView;
static void ensureVoiceTimer() {
if (!s_voiceTimer) {
s_voiceTimer = new QTimer();
s_voiceTimer = new QTimer(QCoreApplication::instance());
s_voiceTimer->setObjectName("messageVoiceTimer");
s_voiceTimer->setInterval(16);
QObject::connect(s_voiceTimer, &QTimer::timeout, []() {
bool anyActive = false;
@@ -1080,7 +1081,15 @@ void MessageDelegate::paintBody(QPainter* painter, const QStyleOptionViewItem& o
}
if (L.isVoice) {
if (option.widget) s_voiceView = (QAbstractItemView*)option.widget;
auto* view = qobject_cast<QAbstractItemView*>(const_cast<QWidget*>(option.widget));
if (view && s_voiceView != view) {
s_voiceView = view;
QObject::connect(view, &QObject::destroyed, QCoreApplication::instance(), [] {
if (s_voiceView) return; // Уничтожен прежний view, текущий продолжает воспроизведение.
MessageDelegate::stopAllAutoPlay();
GUI_DEBUG("voice delegate: view destroyed, playback state released");
});
}
drawBubble(painter, L, option);
if (!L.narrow) drawAvatar(painter, L, index);
@@ -1722,7 +1731,6 @@ void MessageDelegate::startAutoPlay(const QString& filePath, float actualDuratio
void MessageDelegate::stopAllAutoPlay() {
VoicePlayer::stop();
for (auto it = s_voiceStates.begin(); it != s_voiceStates.end(); ++it) {
it->playing = false; it->paused = false; it->loading = false;
}
s_voiceStates.clear();
if (s_voiceTimer) s_voiceTimer->stop();
}