]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiCompleter.cpp
* open popup on complete-accept if there is a completion available
[lyx.git] / src / frontends / qt4 / GuiCompleter.cpp
index 1ce5c8fa1c92a1264367c6c3e220d35aa42a5c46..a110bb21e046122426108e964daac3a34f2ab6f0 100644 (file)
@@ -43,50 +43,24 @@ using namespace lyx::support;
 namespace lyx {
 namespace frontend {
 
-class RtlItemDelegate : public QItemDelegate
+class CompleterItemDelegate : public QItemDelegate
 {
 public:
-       explicit RtlItemDelegate(QObject * parent)
-               : QItemDelegate(parent), enabled_(false)
+       explicit CompleterItemDelegate(QObject * parent)
+               : QItemDelegate(parent)
        {}
 
-       void setEnabled(bool enabled = true)
-       {
-               enabled_ = enabled;
-       }
-       
-protected:
-       void drawDisplay(QPainter * painter,
-               QStyleOptionViewItem const & option,
-               QRect const & rect, QString const & text) const
-       {
-               if (!enabled_) {
-                       QItemDelegate::drawDisplay(painter, option, rect, text);
-                       return;
-               }
-
-               // 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_;
-};
-
-
-class PixmapItemDelegate : public QItemDelegate
-{
-public:
-       explicit PixmapItemDelegate(QObject * parent)
-               : QItemDelegate(parent)
+       ~CompleterItemDelegate()
        {}
 
 protected:
        void paint(QPainter *painter, const QStyleOptionViewItem &option,
                   const QModelIndex &index) const
        {
+               if (index.column() == 0) {
+                       QItemDelegate::paint(painter, option, index);
+                       return;
+               }
                QStyleOptionViewItem opt = setOptions(index, option);
                QVariant value = index.data(Qt::DisplayRole);
                QPixmap pixmap = qvariant_cast<QPixmap>(value);
@@ -105,7 +79,6 @@ protected:
        }
 };
 
-
 class GuiCompletionModel : public QAbstractListModel
 {
 public:
@@ -116,6 +89,12 @@ public:
        ///
        ~GuiCompletionModel() { delete list_; }
        ///
+       void setList(CompletionList const * l) {
+               delete list_;
+               list_ = l;
+               reset();
+       }
+       ///
        bool sorted() const
        {
                if (list_)
@@ -183,7 +162,8 @@ GuiCompleter::GuiCompleter(GuiWorkArea * gui, QObject * parent)
          modelActive_(false)
 {
        // Setup the completion popup
-       setModel(new GuiCompletionModel(this, 0));
+       model_ = new GuiCompletionModel(this, 0);
+       setModel(model_);
        setCompletionMode(QCompleter::PopupCompletion);
        setWidget(gui_);
        
@@ -198,9 +178,8 @@ GuiCompleter::GuiCompleter(GuiWorkArea * gui, QObject * parent)
        listView->setUniformRowHeights(true);
        setPopup(listView);
        
-       rtlItemDelegate_ = new RtlItemDelegate(this);
-       popup()->setItemDelegateForColumn(0, rtlItemDelegate_);
-       popup()->setItemDelegateForColumn(1, new PixmapItemDelegate(this));
+       itemDelegate_ = new CompleterItemDelegate(this);
+       popup()->setItemDelegate(itemDelegate_);
        
        // create timeout timers
        popup_timer_.setSingleShot(true);
@@ -476,19 +455,15 @@ void GuiCompleter::updateModel(Cursor & cur, bool popupUpdate, bool inlineUpdate
        bool rtl = false;
        if (cur.inTexted()) {
                Paragraph const & par = cur.paragraph();
-               Font const font =
-               par.getFontSettings(cur.bv().buffer().params(), cur.pos());
+               Font const font =
+                       par.getFontSettings(cur.bv().buffer().params(), cur.pos());
                rtl = font.isVisibleRightToLeft();
        }
        popup()->setLayoutDirection(rtl ? Qt::RightToLeft : Qt::LeftToRight);
 
-       // turn the direction of the strings in the popup.
-       // Qt does not do that itself.
-       rtlItemDelegate_->setEnabled(rtl);
-
        // set new model
        CompletionList const * list = cur.inset().createCompletionList(cur);
-       setModel(new GuiCompletionModel(this, list));
+       model_->setList(list);
        modelActive_ = true;
        if (list->sorted())
                setModelSorting(QCompleter::CaseSensitivelySortedModel);
@@ -556,7 +531,7 @@ void GuiCompleter::asyncHidePopup()
 {
        popup()->hide();
        if (!inlineVisible())
-               setModel(new GuiCompletionModel(this, 0));
+               model_->setList(0);
 }
 
 
@@ -591,7 +566,7 @@ void GuiCompleter::hideInline(Cursor & cur)
 void GuiCompleter::asyncHideInline()
 {
        if (!popupVisible())
-               setModel(new GuiCompletionModel(this, 0));
+               model_->setList(0);
 }
 
 
@@ -650,9 +625,9 @@ void GuiCompleter::hideInline()
 void GuiCompleter::activate()
 {
        if (!popupVisible() && !inlineVisible())
-               return;
-
-       popupActivated(currentCompletion());
+               tab();
+       else
+               popupActivated(currentCompletion());
 }
 
 
@@ -905,4 +880,4 @@ void GuiCompleter::popupHighlighted(const QString & completion)
 } // namespace frontend
 } // namespace lyx
 
-#include "GuiCompleter_moc.cpp"
+#include "moc_GuiCompleter.cpp"