From 498f4450fefaedf698177242859d20c78aea07d5 Mon Sep 17 00:00:00 2001
From: David Schulz <david.schulz@nokia.com>
Date: Tue, 4 Sep 2012 16:00:32 +0200
Subject: [PATCH] Editor: update autocompleter list width.

The width of the List view showing the
autocompleter proposals is now adjusted
when scrolling.

Task-number: QTCREATORBUG-7185

Change-Id: I5b26ef6195d389b30fdf0964bebd9c2f33056c66
Reviewed-by: Leandro Melo <leandro.melo@nokia.com>
---
 .../codeassist/genericproposalwidget.cpp        | 17 ++++++++++++-----
 .../codeassist/genericproposalwidget.h          |  4 +++-
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
index 439efaf5a03..7d5b63b35ed 100644
--- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
+++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
@@ -179,7 +179,7 @@ private:
 class GenericProposalListView : public QListView
 {
 public:
-    GenericProposalListView(QWidget *parent) : QListView(parent) {}
+    GenericProposalListView(QWidget *parent);
 
     QSize calculateSize() const;
     QPoint infoFramePos() const;
@@ -192,19 +192,24 @@ public:
     void selectLastRow() { selectRow(model()->rowCount() - 1); }
 };
 
+GenericProposalListView::GenericProposalListView(QWidget *parent)
+    : QListView(parent)
+{
+    setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
+}
+
 QSize GenericProposalListView::calculateSize() const
 {
     static const int maxVisibleItems = 10;
 
     // Determine size by calculating the space of the visible items
-    int visibleItems = model()->rowCount();
-    if (visibleItems > maxVisibleItems)
-        visibleItems = maxVisibleItems;
+    const int visibleItems = qMin(model()->rowCount(), maxVisibleItems);
+    const int firstVisibleRow = verticalScrollBar()->value();
 
     const QStyleOptionViewItem &option = viewOptions();
     QSize shint;
     for (int i = 0; i < visibleItems; ++i) {
-        QSize tmp = itemDelegate()->sizeHint(option, model()->index(i, 0));
+        QSize tmp = itemDelegate()->sizeHint(option, model()->index(i + firstVisibleRow, 0));
         if (shint.width() < tmp.width())
             shint = tmp;
     }
@@ -321,6 +326,8 @@ GenericProposalWidget::GenericProposalWidget()
     d->m_completionListView->setSelectionMode(QAbstractItemView::SingleSelection);
     d->m_completionListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     d->m_completionListView->setMinimumSize(1, 1);
+    connect(d->m_completionListView->verticalScrollBar(), SIGNAL(valueChanged(int)),
+            this, SLOT(updatePositionAndSize()));
 
     QVBoxLayout *layout = new QVBoxLayout(this);
     layout->setMargin(0);
diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.h b/src/plugins/texteditor/codeassist/genericproposalwidget.h
index 6fdcfb6079a..745f7d51bce 100644
--- a/src/plugins/texteditor/codeassist/genericproposalwidget.h
+++ b/src/plugins/texteditor/codeassist/genericproposalwidget.h
@@ -60,10 +60,12 @@ public:
 
 private:
     bool updateAndCheck(const QString &prefix);
-    void updatePositionAndSize();
     void notifyActivation(int index);
     void abort();
 
+private slots:
+    void updatePositionAndSize();
+
 protected:
     virtual bool eventFilter(QObject *o, QEvent *e);
 
-- 
GitLab