From 89394bcd0f3b5079a066d8c3f6f7a5e606073db3 Mon Sep 17 00:00:00 2001 From: Daniel Ramoeller Date: Sat, 6 Aug 2022 07:13:51 +0200 Subject: [PATCH] Show suggestions containing the input in the command buffer Previously, only the suggestions starting with the current input were shown. Contains the following minor improvements: - Add space to indicate when only one suggestion is found - Select first item in suggestion-list in order to make selecting with arrow keys more intuitive - Fix selection with Shift+Up/Down in text-field Fix for bug #12572. --- src/frontends/qt/GuiCommandBuffer.cpp | 14 +++++++-- src/frontends/qt/GuiCommandEdit.cpp | 41 ++++++++++++++------------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/frontends/qt/GuiCommandBuffer.cpp b/src/frontends/qt/GuiCommandBuffer.cpp index 4d28bfb0c2..ee68013e2f 100644 --- a/src/frontends/qt/GuiCommandBuffer.cpp +++ b/src/frontends/qt/GuiCommandBuffer.cpp @@ -184,9 +184,12 @@ void GuiCommandBuffer::complete() string new_input; vector const & comp = completions(input, new_input); - if (comp.empty()) { + if (comp.empty() || comp.size() == 1) { if (new_input != input) edit_->setText(toqstr(new_input)); + // If there is only one match, indicate this by adding a space + if (comp.size() == 1) + edit_->setText(edit_->text() + " "); return; } @@ -208,6 +211,8 @@ void GuiCommandBuffer::showList(vector const & list, else listBox->addItem(toqstr(item)); } + // Select the first item + listBox->setCurrentItem(listBox->item(0)); listBox->resize(listBox->sizeHint()); @@ -296,6 +301,11 @@ GuiCommandBuffer::completions(string const & prefix, string & new_prefix) if (prefixIs(act.first, prefix)) comp.push_back(act.first); } + // now add all the other items that contain the prefix + for (auto const & act : lyxaction) { + if (!prefixIs(act.first, prefix) && contains(act.first, prefix)) + comp.push_back(act.first); + } if (comp.empty()) { new_prefix = prefix; @@ -304,7 +314,7 @@ GuiCommandBuffer::completions(string const & prefix, string & new_prefix) if (comp.size() == 1) { new_prefix = comp[0]; - return vector(); + return comp; } // find maximal available prefix diff --git a/src/frontends/qt/GuiCommandEdit.cpp b/src/frontends/qt/GuiCommandEdit.cpp index 22dd9c8f03..89883da50a 100644 --- a/src/frontends/qt/GuiCommandEdit.cpp +++ b/src/frontends/qt/GuiCommandEdit.cpp @@ -29,26 +29,29 @@ GuiCommandEdit::GuiCommandEdit(QWidget * parent) void GuiCommandEdit::keyPressEvent(QKeyEvent * e) { - switch (e->key()) { - case Qt::Key_Escape: - // emit signal - escapePressed(); - break; - - case Qt::Key_Up: - // emit signal - upPressed(); - break; - - case Qt::Key_Down: - // emit signal - downPressed(); - break; - - default: - QLineEdit::keyPressEvent(e); - break; + if (e->modifiers() == Qt::NoModifier) { + switch (e->key()) { + case Qt::Key_Escape: + // emit signal + escapePressed(); + return; + + case Qt::Key_Up: + // emit signal + upPressed(); + return; + + case Qt::Key_Down: + // emit signal + downPressed(); + return; + + default: + // do nothing + break; + } } + QLineEdit::keyPressEvent(e); } -- 2.39.5