X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiCompleter.cpp;h=33bc42465137194ed0c4460ffdd00a262064c9d4;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=0c4a73206459e9d68a59b0264d75ea53d843fecc;hpb=140958f4a36b0793d39876b9f20ba9bea967c00f;p=lyx.git diff --git a/src/frontends/qt4/GuiCompleter.cpp b/src/frontends/qt4/GuiCompleter.cpp index 0c4a732064..33bc424651 100644 --- a/src/frontends/qt4/GuiCompleter.cpp +++ b/src/frontends/qt4/GuiCompleter.cpp @@ -157,7 +157,7 @@ private: GuiCompleter::GuiCompleter(GuiWorkArea * gui, QObject * parent) - : QCompleter(parent), gui_(gui), updateLock_(0), + : QCompleter(parent), gui_(gui), old_cursor_(0), updateLock_(0), inlineVisible_(false), popupVisible_(false), modelActive_(false) { @@ -165,6 +165,7 @@ GuiCompleter::GuiCompleter(GuiWorkArea * gui, QObject * parent) model_ = new GuiCompletionModel(this, 0); setModel(model_); setCompletionMode(QCompleter::PopupCompletion); + setCaseSensitivity(Qt::CaseInsensitive); setWidget(gui_); // create the popup @@ -234,6 +235,24 @@ bool GuiCompleter::inlinePossible(Cursor const & cur) const } +bool GuiCompleter::uniqueCompletionAvailable() const +{ + if (!modelActive_) + return false; + + size_t n = popup()->model()->rowCount(); + if (n > 1 || n == 0) + return false; + + // if there is exactly one, we have to check whether it is a + // real completion, i.e. longer than the current prefix. + if (completionPrefix() == currentCompletion()) + return false; + + return true; +} + + bool GuiCompleter::completionAvailable() const { if (!modelActive_) @@ -295,6 +314,11 @@ void GuiCompleter::updateVisibility(Cursor & cur, bool start, bool keep, bool cu if (!inlineVisible() && possibleInlineState && start && cur.inset().automaticInlineCompletion()) inline_timer_.start(int(lyxrc.completion_inline_delay * 1000)); + else { + // no inline completion, hence a metrics update is needed + if (!(cur.disp_.update() & Update::Force)) + cur.updateFlags(cur.disp_.update() | Update::SinglePar); + } // update prefix if any completion is possible bool modelActive = modelActive_ && model()->rowCount() > 0; @@ -455,7 +479,7 @@ void GuiCompleter::updateModel(Cursor & cur, bool popupUpdate, bool inlineUpdate bool rtl = false; if (cur.inTexted()) { Paragraph const & par = cur.paragraph(); - Font const font = + Font const & font = par.getFontSettings(cur.bv().buffer().params(), cur.pos()); rtl = font.isVisibleRightToLeft(); } @@ -546,7 +570,7 @@ void GuiCompleter::showInline(Cursor & cur) void GuiCompleter::hideInline(Cursor & cur) { - gui_->bufferView().setInlineCompletion(cur, DocIterator(), docstring()); + gui_->bufferView().setInlineCompletion(cur, DocIterator(cur.buffer()), docstring()); inlineVisible_ = false; if (inline_timer_.isActive()) @@ -625,9 +649,9 @@ void GuiCompleter::hideInline() void GuiCompleter::activate() { if (!popupVisible() && !inlineVisible()) - return; - - popupActivated(currentCompletion()); + tab(); + else + popupActivated(currentCompletion()); } @@ -638,7 +662,7 @@ void GuiCompleter::tab() cur.updateFlags(Update::None); // check that inline completion is active - if (!inlineVisible()) { + if (!inlineVisible() && !uniqueCompletionAvailable()) { // try to activate the inline completion if (cur.inset().inlineCompletionSupported(cur)) { showInline(); @@ -660,6 +684,9 @@ void GuiCompleter::tab() return; } + // Make undo possible + cur.recordUndo(); + // If completion is active, at least complete by one character docstring prefix = cur.inset().completionPrefix(cur); docstring completion = qstring_to_ucs4(currentCompletion()); @@ -802,7 +829,7 @@ docstring GuiCompleter::longestUniqueCompletion() const if (n == 0) return docstring(); QString s = model.data(model.index(0, 0), Qt::EditRole).toString(); - + if (modelSorting() == QCompleter::UnsortedModel) { // For unsorted model we cannot do more than iteration. // Iterate through the completions and cut off where s differs @@ -851,6 +878,8 @@ void GuiCompleter::popupActivated(const QString & completion) Cursor cur = gui_->bufferView().cursor(); cur.updateFlags(Update::None); + cur.recordUndo(); + docstring prefix = cur.inset().completionPrefix(cur); docstring postfix = qstring_to_ucs4(completion.mid(prefix.length())); cur.inset().insertCompletion(cur, postfix, true); @@ -880,4 +909,4 @@ void GuiCompleter::popupHighlighted(const QString & completion) } // namespace frontend } // namespace lyx -#include "GuiCompleter_moc.cpp" +#include "moc_GuiCompleter.cpp"