explicit RtlItemDelegate(QObject * parent = 0)
: QItemDelegate(parent) {}
+ void setEnabled(bool enabled = true)
+ {
+ enabled_ = enabled;
+ }
+
protected:
virtual void drawDisplay(QPainter * painter,
QStyleOptionViewItem const & option,
QRect const & rect, QString const & text) const
{
+ if (!enabled_)
+ return QItemDelegate::drawDisplay(painter, option, rect, text);
+
// FIXME: do this more elegantly
docstring stltext = qstring_to_ucs4(text);
reverse(stltext.begin(), stltext.end());
QItemDelegate::drawDisplay(painter, option, rect, toqstr(stltext));
}
+
+private:
+ bool enabled_;
};
setPopup(listView);
popup()->setItemDelegateForColumn(1, new PixmapItemDelegate(this));
rtlItemDelegate_ = new RtlItemDelegate(this);
-
+ popup()->setItemDelegateForColumn(0, rtlItemDelegate_);
+
// create timeout timers
popup_timer_.setSingleShot(true);
inline_timer_.setSingleShot(true);
}
+bool GuiCompleter::completionAvailable() const
+{
+ size_t n = popup()->model()->rowCount();
+
+ // if there is exactly one, we have to check whether it is a
+ // real completion, i.e. longer than the current prefix.
+ if (n == 1 && completionPrefix() == currentCompletion())
+ return false;
+
+ return n > 0;
+}
+
+
bool GuiCompleter::popupVisible() const
{
return popup()->isVisible();
&& cur.inset().automaticInlineCompletion())
inline_timer_.start(int(lyxrc.completion_inline_delay * 1000));
- // update prefix if popup is visible or if it will be visible soon
- if (popupVisible() || inlineVisible()
- || popup_timer_.isActive() || inline_timer_.isActive())
- updatePrefix(cur);
+ // update prefix if any completion is possible
+ bool modelActive = model()->rowCount() > 0;
+ if (possiblePopupState || possibleInlineState) {
+ if (modelActive)
+ updatePrefix(cur);
+ else
+ updateAvailability();
+ }
}
// if popup is not empty, the new selection will
// be our last valid one
QString const & s = currentCompletion();
- if (s.length() > 0)
- last_selection_ = s;
- else
- last_selection_ = old;
-
+ if (popupVisible() || inlineVisible()) {
+ if (s.length() > 0)
+ last_selection_ = s;
+ else
+ last_selection_ = old;
+ }
+
// update inline completion because the default
// completion string might have changed
if (inlineVisible())
}
+void GuiCompleter::updateAvailability()
+{
+ // this should really only be of interest if no completion is
+ // visible yet, i.e. especially if automatic completion is disabled.
+ if (inlineVisible() || popupVisible())
+ return;
+ Cursor & cur = gui_->bufferView().cursor();
+ if (!popupPossible(cur) && !inlinePossible(cur))
+ return;
+
+ updateModel(cur, false, false);
+}
+
+
void GuiCompleter::updateModel(Cursor & cur, bool popupUpdate, bool inlineUpdate)
{
// value which should be kept selected
// turn the direction of the strings in the popup.
// Qt does not do that itself.
- popup()->setItemDelegateForColumn(0, rtl ? rtlItemDelegate_ : 0);
+ rtlItemDelegate_->setEnabled(rtl);
// set new model
Inset::CompletionList const * list = cur.inset().createCompletionList(cur);
// if popup is not empty, the new selection will
// be our last valid one
- QString const & s = currentCompletion();
- if (s.length() > 0)
- last_selection_ = s;
- else
- last_selection_ = old;
+ if (popupVisible() || inlineVisible()) {
+ QString const & s = currentCompletion();
+ if (s.length() > 0)
+ last_selection_ = s;
+ else
+ last_selection_ = old;
+ }
// show inline completion
if (inlineUpdate)
popup()->hide();
if (popup_timer_.isActive())
popup_timer_.stop();
+
+ if (!inlineVisible())
+ setModel(new GuiCompletionModel(this, 0));
}
{
gui_->bufferView().setInlineCompletion(cur, DocIterator(), docstring());
inlineVisible_ = false;
+
+ if (!popupVisible())
+ setModel(new GuiCompletionModel(this, 0));
}
docstring GuiCompleter::longestUniqueCompletion() const
{
QAbstractItemModel const & model = *popup()->model();
- QString s = currentCompletion();
size_t n = model.rowCount();
-
+ 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