Browse Source

Keep file navigation focused and open entries with Enter

master
evgeny 3 days ago
parent
commit
93a6277ca4
  1. 13
      tools/chatgui/src/member_files/browser.cpp
  2. 14
      tools/chatgui/tests/test_member_files_browser.cpp

13
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<QPushButton*>()) button->setAutoDefault(false);
auto dropTargets = findChildren<QWidget*>(); 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() {

14
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<QPushButton*>()) {
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");

Loading…
Cancel
Save