#include "LyX.h"
#include "LyXRC.h"
#include "Paragraph.h"
+#include "qt_helpers.h"
#include "version.h"
#include "support/lassert.h"
+#include "support/lstrings.h"
#include "support/debug.h"
#include <QApplication>
#include <QHeaderView>
+#include <QKeyEvent>
#include <QPainter>
#include <QPixmapCache>
#include <QScrollBar>
~GuiCompletionModel() { delete list_; }
///
void setList(CompletionList const * l) {
+ beginResetModel();
delete list_;
list_ = l;
- reset();
+ endResetModel();
}
///
bool sorted() const
// get icon from cache
QPixmap scaled;
QString const name = ":" + toqstr(list_->icon(index.row()));
+ if (name == ":")
+ return scaled;
if (!QPixmapCache::find("completion" + name, scaled)) {
// load icon from disk
QPixmap p = QPixmap(name);
}
-void GuiCompleter::updateVisibility(Cursor & cur, bool start, bool keep, bool cursorInView)
+void GuiCompleter::updateVisibility(Cursor & cur, bool start, bool keep)
{
// parameters which affect the completion
bool moved = cur != old_cursor_;
if (moved)
old_cursor_ = cur;
- bool possiblePopupState = popupPossible(cur) && cursorInView;
- bool possibleInlineState = inlinePossible(cur) && cursorInView;
+ bool const possiblePopupState = popupPossible(cur);
+ bool const possibleInlineState = inlinePossible(cur);
// we moved or popup state is not ok for popup?
if ((moved && !keep) || !possiblePopupState)
- hidePopup(cur);
+ hidePopup();
// we moved or inline state is not ok for inline completion?
if ((moved && !keep) || !possibleInlineState)
if (!inlineVisible() && possibleInlineState && start
&& cur.inset().automaticInlineCompletion())
inline_timer_.start(int(lyxrc.completion_inline_delay * 1000));
- else {
+ else if (cur.inMathed() && !lyxrc.completion_inline_math) {
// no inline completion, hence a metrics update is needed
if (!(cur.result().screenUpdate() & Update::Force))
cur.screenUpdateFlags(cur.result().screenUpdate() | Update::SinglePar);
}
-void GuiCompleter::updatePrefix(Cursor & cur)
+void GuiCompleter::updatePrefix(Cursor const & cur)
{
// get new prefix. Do nothing if unchanged
QString newPrefix = toqstr(cur.inset().completionPrefix(cur));
}
-void GuiCompleter::updateInline(Cursor & cur, QString const & completion)
+void GuiCompleter::updateInline(Cursor const & cur, QString const & completion)
{
if (!cur.inset().inlineCompletionSupported(cur))
return;
docstring postfix = qstring_to_ucs4(completion.mid(prefix.length()));
// shorten it if necessary
- if (lyxrc.completion_inline_dots != -1
- && postfix.size() > unsigned(lyxrc.completion_inline_dots))
- postfix = postfix.substr(0, lyxrc.completion_inline_dots - 1) + "...";
+ if (lyxrc.completion_inline_dots != -1)
+ support::truncateWithEllipsis(postfix,
+ unsigned(lyxrc.completion_inline_dots));
// set inline completion at cursor position
size_t uniqueTo = max(longestUniqueCompletion().size(), prefix.size());
}
-void GuiCompleter::updatePopup(Cursor & cur)
+void GuiCompleter::updatePopup(Cursor const & cur)
{
if (!cur.inset().completionSupported(cur))
return;
// has a bad memory about it and we have to tell him again and again.
QTreeView * listView = static_cast<QTreeView *>(popup());
listView->header()->setStretchLastSection(false);
- listView->header()->setResizeMode(0, QHeaderView::Stretch);
- listView->header()->setResizeMode(1, QHeaderView::Fixed);
+ setSectionResizeMode(listView->header(), 0, QHeaderView::Stretch);
+ setSectionResizeMode(listView->header(), 1, QHeaderView::Fixed);
listView->header()->resizeSection(1, 22);
// show/update popup
// visible yet, i.e. especially if automatic completion is disabled.
if (inlineVisible() || popupVisible())
return;
- Cursor & cur = gui_->bufferView().cursor();
+ Cursor const & cur = gui_->bufferView().cursor();
if (!popupPossible(cur) && !inlinePossible(cur))
return;
}
-void GuiCompleter::updateModel(Cursor & cur, bool popupUpdate, bool inlineUpdate)
+void GuiCompleter::updateModel(Cursor const & cur, bool popupUpdate, bool inlineUpdate)
{
// value which should be kept selected
QString old = currentCompletion();
}
-void GuiCompleter::showPopup(Cursor & cur)
+void GuiCompleter::showPopup(Cursor const & cur)
{
if (!popupPossible(cur))
return;
}
-void GuiCompleter::hidePopup(Cursor &)
-{
- popupVisible_ = false;
-
- if (popup_timer_.isActive())
- popup_timer_.stop();
-
- // hide popup asynchronously because we might be here inside of
- // LFUN dispatchers. Hiding a popup can trigger a focus event on the
- // workarea which then redisplays the cursor. But the metrics are not
- // yet up to date such that the coord cache has not all insets yet. The
- // cursorPos methods would triggers asserts in the coord cache then.
- QTimer::singleShot(0, this, SLOT(asyncHidePopup()));
-
- // mark that the asynchronous part will reset the model
- if (!inlineVisible())
- modelActive_ = false;
-}
-
-
void GuiCompleter::asyncHidePopup()
{
popup()->hide();
}
-void GuiCompleter::showInline(Cursor & cur)
+void GuiCompleter::showInline(Cursor const & cur)
{
if (!inlinePossible(cur))
return;
}
-void GuiCompleter::hideInline(Cursor & cur)
+void GuiCompleter::hideInline(Cursor const & cur)
{
gui_->bufferView().setInlineCompletion(cur, DocIterator(cur.buffer()), docstring());
inlineVisible_ = false;
void GuiCompleter::hidePopup()
{
- Cursor cur = gui_->bufferView().cursor();
- cur.screenUpdateFlags(Update::None);
-
- hidePopup(cur);
+ popupVisible_ = false;
+
+ if (popup_timer_.isActive())
+ popup_timer_.stop();
+
+ // hide popup asynchronously because we might be here inside of
+ // LFUN dispatchers. Hiding a popup can trigger a focus event on the
+ // workarea which then redisplays the cursor. But the metrics are not
+ // yet up to date such that the coord cache has not all insets yet. The
+ // cursorPos methods would triggers asserts in the coord cache then.
+ QTimer::singleShot(0, this, SLOT(asyncHidePopup()));
- // redraw if needed
- if (cur.result().screenUpdate())
- gui_->bufferView().processUpdateFlags(cur.result().screenUpdate());
+ // mark that the asynchronous part will reset the model
+ if (!inlineVisible())
+ modelActive_ = false;
}
cur.inset().insertCompletion(cur, docstring(), true);
// hide popup and inline completion
- hidePopup(cur);
+ hidePopup();
hideInline(cur);
updateVisibility(false, false);
cur.endUndoGroup();
i = n;
else
i = l;
- LASSERT(i <= n, /**/);
+ // we can try to recover
+ LASSERT(i <= n, i = 0);
}
// select the first if none was found
docstring prefix = cur.inset().completionPrefix(cur);
docstring postfix = qstring_to_ucs4(completion.mid(prefix.length()));
cur.inset().insertCompletion(cur, postfix, true);
- hidePopup(cur);
+ hidePopup();
hideInline(cur);
if (cur.result().screenUpdate())