diff --git a/tools/chatgui/src/member_files/browser.cpp b/tools/chatgui/src/member_files/browser.cpp index 11877133..12c9a620 100644 --- a/tools/chatgui/src/member_files/browser.cpp +++ b/tools/chatgui/src/member_files/browser.cpp @@ -121,6 +121,7 @@ MemberFileBrowser::MemberFileBrowser(DbManager* db, QWidget* parent) : QDialog(p m_copyAction->setShortcut(QKeySequence::Copy); m_copyAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); m_entries->addAction(m_copyAction); connect(m_copyAction, &QAction::triggered, this, [this] { exportFile(true); }); + for (auto* button : findChildren()) button->setAutoDefault(false); auto dropTargets = findChildren(); dropTargets.append(this); for (auto* target : dropTargets) { target->setAcceptDrops(true); target->installEventFilter(this); } m_dropHint = new QLabel(m_entries->viewport()); m_dropHint->setObjectName("memberFilesDropHint"); @@ -130,6 +131,7 @@ MemberFileBrowser::MemberFileBrowser(DbManager* db, QWidget* parent) : QDialog(p DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "file browser: drop targets installed count=%d", int(dropTargets.size())); connect(reload, &QPushButton::clicked, this, [this]() { m_staleRetries = 0; refresh(); }); connect(up, &QPushButton::clicked, this, [this]() { + m_entries->setFocus(); if (m_path.isEmpty()) { m_owners->setCurrentIndex(0); return; } int slash = m_path.lastIndexOf('/'); navigate(slash < 0 ? QString() : m_path.left(slash)); }); @@ -155,6 +157,15 @@ MemberFileBrowser::MemberFileBrowser(DbManager* db, QWidget* parent) : QDialog(p DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "file browser: Backspace key path=%s enabled=%d", qPrintable(m_path), up->isEnabled()); up->click(); }); + for (auto key : {Qt::Key_Return, Qt::Key_Enter}) { + auto* enterShortcut = new QShortcut(QKeySequence(key), m_entries); + enterShortcut->setContext(Qt::WidgetWithChildrenShortcut); enterShortcut->setAutoRepeat(false); + connect(enterShortcut, &QShortcut::activated, this, [this] { + auto* item = m_entries->currentItem(); + DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "file browser: Enter key path=%s selected=%d", qPrintable(selectedPath()), item != nullptr); + if (item) enter(item); + }); + } connect(m_cancel, &QPushButton::clicked, this, &MemberFileBrowser::cancel); m_entries->setContextMenuPolicy(Qt::CustomContextMenu); connect(m_entries, &QWidget::customContextMenuRequested, this, [this](const QPoint& point) { @@ -169,7 +180,7 @@ MemberFileBrowser::MemberFileBrowser(DbManager* db, QWidget* parent) : QDialog(p if (copyPath(q.path, selectedPath()) && post(q)) m_actions.insert(q.request_id, MF_STAT); } }); - updateActions(); + updateActions(); m_entries->setFocus(); } MemberFileBrowser::~MemberFileBrowser() { diff --git a/tools/chatgui/tests/test_member_files_browser.cpp b/tools/chatgui/tests/test_member_files_browser.cpp index 49fc036c..50852967 100644 --- a/tools/chatgui/tests/test_member_files_browser.cpp +++ b/tools/chatgui/tests/test_member_files_browser.cpp @@ -133,6 +133,20 @@ private slots: tree->setFocus(); QTest::keyClick(tree, Qt::Key_Backspace); QCOMPARE(captured.message.command, uint8_t(MF_LIST)); QCOMPARE(QString::fromUtf8(captured.message.path), QString("documents")); QTest::keyClick(tree, Qt::Key_Backspace); QCOMPARE(QString::fromUtf8(captured.message.path), QString()); + QPushButton* up = nullptr; + for (auto* button : browser.findChildren()) { + QVERIFY(!button->autoDefault()); + if (button->text() == "Up") up = button; + } + QVERIFY(up); + for (auto key : {Qt::Key_Return, Qt::Key_Enter}) { + item = new QTreeWidgetItem(tree, {"folder"}); item->setData(0, Qt::UserRole, "folder"); + item->setData(0, Qt::UserRole + 1, MF_DIRECTORY); tree->setCurrentItem(item); + QTest::keyClick(tree, key); + QCOMPARE(captured.message.command, uint8_t(MF_LIST)); QCOMPARE(QString::fromUtf8(captured.message.path), QString("folder")); + up->setFocus(); QTest::mouseClick(up, Qt::LeftButton); + QVERIFY(tree->hasFocus()); QCOMPARE(QString::fromUtf8(captured.message.path), QString()); + } QTest::keyClick(tree, Qt::Key_Backspace); QCOMPARE(captured.message.owner, 0ULL); browser.setChannel("42", 11); item = new QTreeWidgetItem(tree, {"foreign.txt"}); item->setData(0, Qt::UserRole, "foreign.txt");