From 11fc9329055445d49537a277edfb815faf6e9e96 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 10 Oct 2026 01:57:28 +0200 Subject: [PATCH] Restore keyboard focus and test changed-tree cleanup --- tools/chatgui/src/member_files/browser.cpp | 2 ++ .../tests/test_member_files_browser.cpp | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/tools/chatgui/src/member_files/browser.cpp b/tools/chatgui/src/member_files/browser.cpp index 6a969654..1cd50815 100644 --- a/tools/chatgui/src/member_files/browser.cpp +++ b/tools/chatgui/src/member_files/browser.cpp @@ -277,7 +277,9 @@ void MemberFileBrowser::updateActions() { bool available = server() && gui_bridge_is_uasync_ready(); int count = m_entries->selectedItems().size(); bool busy = m_dropId || m_batch || m_transferId || m_exportId; + bool restoreFocus = !busy && !m_entries->isEnabled(); m_servers->setEnabled(!busy); m_owners->setEnabled(!busy); m_navigation->setEnabled(!busy); m_entries->setEnabled(!busy); + if (restoreFocus) m_entries->setFocus(); m_upload->setEnabled(available && own && !busy); m_mkdir->setEnabled(available && own && !busy); m_rename->setEnabled(available && own && count == 1 && !busy); m_remove->setEnabled(available && own && count && !busy); m_download->setEnabled(available && owner() && count && !busy); m_cancel->setEnabled(busy); diff --git a/tools/chatgui/tests/test_member_files_browser.cpp b/tools/chatgui/tests/test_member_files_browser.cpp index 01712086..bd6563c6 100644 --- a/tools/chatgui/tests/test_member_files_browser.cpp +++ b/tools/chatgui/tests/test_member_files_browser.cpp @@ -223,6 +223,39 @@ private slots: requestStarted = {}; transferStarted = {}; } + void changedTreeRemovesUnpublishedCopy() { + QTemporaryDir root; QVERIFY(root.isValid()); + MemberFileBatch batch(42, 33, 22, MemberFileBatch::Download, nullptr); + bool done = false, success = true; QString summary, downloaded; + batch.progress = [](const QString&, int) {}; + batch.conflict = [](const QString&, bool) { return int(QMessageBox::Cancel); }; + batch.finished = [&](bool ok, const QString& status, const QStringList& roots) { + done = true; success = ok; summary = status; QVERIFY(roots.isEmpty()); + }; + requestStarted = [&](mf_gui_request request) { + QTimer::singleShot(0, &batch, [&, request] { + mf_message response = request.message; response.kind = MF_RESPONSE; response.type = MF_DIRECTORY; + if (response.command == MF_STAT) response.status = MF_STALE; + else { + response.data[0] = 8; response.data[2] = MF_FILE; memset(response.data + 19, 7, 16); + memcpy(response.data + MF_ENTRY_HEADER, "file.txt", 8); response.data_len = MF_ENTRY_HEADER + 8; response.cursor = 1; + } + QVERIFY(batch.response(response)); + }); + }; + transferStarted = [&](mf_transfer_request request) { + downloaded = QString::fromUtf8(request.local); + QFile file(downloaded); QVERIFY(file.open(QIODevice::WriteOnly)); file.write("complete file"); file.close(); + QTimer::singleShot(0, &batch, [&, request] { + uint8_t bytes[51]{}; mf_put64(bytes, request.id); bytes[50] = 2; QVERIFY(batch.transfer(bytes, sizeof(bytes))); + }); + }; + batch.start({{"folder", {}, QByteArray(16, '\7'), true}}, root.path(), true); + QTRY_VERIFY(done); QVERIFY(!success); QVERIFY(!downloaded.isEmpty()); QVERIFY(!QFileInfo::exists(downloaded)); + QVERIFY(summary.contains("folder")); QCOMPARE(QDir(root.path()).entryList(QDir::AllEntries | QDir::NoDotAndDotDot).size(), 0); + requestStarted = {}; transferStarted = {}; + } + void deleteAndParentShortcuts() { sqlite3* sql = nullptr; QCOMPARE(sqlite3_open(":memory:", &sql), SQLITE_OK); QCOMPARE(sqlite3_exec(sql, "CREATE TABLE accounts(node_id INTEGER,display_name TEXT);"