From 973c7342267dee1d4f3728131f12172ae2171451 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 10 Oct 2026 09:38:35 +0200 Subject: [PATCH] Defer closing until batch cancellation and cleanup finish --- tools/chatgui/src/member_files/browser.cpp | 4 ++-- tools/chatgui/tests/test_member_files_browser.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/chatgui/src/member_files/browser.cpp b/tools/chatgui/src/member_files/browser.cpp index 063d02c4..b229a76c 100644 --- a/tools/chatgui/src/member_files/browser.cpp +++ b/tools/chatgui/src/member_files/browser.cpp @@ -523,7 +523,7 @@ void MemberFileBrowser::beginUploads(const QStringList& paths, bool chooseServer auto* batch = createBatch(MemberFileBatch::Upload); batch->finished = [this, batch](bool, const QString& summary, const QStringList&) { m_batch = nullptr; m_progress->hide(); m_uploadStatus->setText(summary); batch->deleteLater(); updateActions(); refresh(); - if (m_closeAfterBatch) close(); + if (m_closeAfterBatch) QTimer::singleShot(0, this, &QWidget::close); }; m_uploadStatus->setText(text("Checking selected files…")); batch->upload(paths, m_path); } @@ -651,7 +651,7 @@ void MemberFileBrowser::mutate(uint8_t command) { auto* batch = createBatch(MemberFileBatch::Remove); batch->finished = [this, batch](bool, const QString& summary, const QStringList&) { m_batch = nullptr; m_progress->hide(); m_uploadStatus->setText(summary); batch->deleteLater(); updateActions(); refresh(); - if (m_closeAfterBatch) close(); + if (m_closeAfterBatch) QTimer::singleShot(0, this, &QWidget::close); }; batch->start(entries); return; } diff --git a/tools/chatgui/tests/test_member_files_browser.cpp b/tools/chatgui/tests/test_member_files_browser.cpp index 642ac2a0..f301636e 100644 --- a/tools/chatgui/tests/test_member_files_browser.cpp +++ b/tools/chatgui/tests/test_member_files_browser.cpp @@ -401,6 +401,18 @@ private slots: QApplication::sendEvent(tree->viewport(), &move); QTest::mouseRelease(tree->viewport(), Qt::LeftButton, Qt::NoModifier, point + QPoint(40, 0)); QVERIFY(received); QCOMPARE(transfers.size(), 4); transferStarted = {}; + if (dragStatus == MF_CANCELLED) { + QPointer closing = new MemberFileBrowser(&db); + closing->setChannel("42", 11); closing->show(); + auto* closingTree = closing->findChild(); + auto* closingItem = new QTreeWidgetItem(closingTree, {"pending.txt"}); + closingItem->setData(0, Qt::UserRole, "pending.txt"); closingItem->setData(0, Qt::UserRole + 1, MF_FILE); + closingItem->setData(0, Qt::UserRole + 2, QByteArray(16, '\7')); closingTree->setCurrentItem(closingItem); + closing->findChild("memberFilesCopy")->trigger(); QTRY_COMPARE(transfers.size(), 5); + auto pending = transfers.last(); QString temporary = QFileInfo(QString::fromUtf8(pending.local)).absolutePath(); + closing->close(); QVERIFY(closing); QVERIFY(cancelled.contains(pending.id)); + complete(*closing, pending, MF_CANCELLED); QTRY_VERIFY(closing.isNull()); QVERIFY(!QFileInfo::exists(temporary)); + } } QVERIFY(QFile::exists(exported)); // Закрытие Group files не ломает локальный URI. db.setDb(nullptr); QCOMPARE(sqlite3_close(sql), SQLITE_OK);