Fence deferred message actions, release voice views and flush state before shutdown
This commit is contained in:
1 parent
adefef675c
commit
1235f770eb
3 files changed
+45
-20
No files matched your search
@@ -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();
|
||||
}
|
||||
Reference in new issue
Block a user