Преглед на файлове

#237 Adjust the with of the completer popup to show complete filenames.

Sascha Zelzer преди 13 години
родител
ревизия
bcc2c48b47
променени са 3 файла, в които са добавени 43 реда и са изтрити 2 реда
  1. 1 1
      Libs/Widgets/CMakeLists.txt
  2. 40 1
      Libs/Widgets/ctkPathLineEdit.cpp
  3. 2 0
      Libs/Widgets/ctkPathLineEdit.h

+ 1 - 1
Libs/Widgets/CMakeLists.txt

@@ -230,7 +230,6 @@ set(KIT_MOC_SRCS
   ctkMenuComboBox_p.h
   ctkMessageBox.h
   ctkModalityWidget.h
-  ctkPathLineEdit.h
   ctkPathListButtonsWidget.h
   ctkPathListButtonsWidget_p.h
   ctkPopupWidget.h
@@ -269,6 +268,7 @@ set(KIT_MOC_SRCS
   )
 
 QT4_GENERATE_MOCS(
+  ctkPathLineEdit.h
   ctkPathListWidget.h
 )
 

+ 40 - 1
Libs/Widgets/ctkPathLineEdit.cpp

@@ -19,6 +19,8 @@
 =========================================================================*/
 
 // Qt includes
+#include <QAbstractItemView>
+#include <QApplication>
 #include <QComboBox>
 #include <QCompleter>
 #include <QDebug>
@@ -31,7 +33,6 @@
 #include <QSettings>
 #include <QStyleOptionComboBox>
 #include <QToolButton>
-#include <QApplication>
 
 // CTK includes
 #include "ctkPathLineEdit.h"
@@ -53,6 +54,8 @@ public:
 
   void adjustPathLineEditSize();
 
+  void _q_recomputeCompleterPopupSize();
+
   void createPathLineEditWidget(bool useComboBox);
   QString settingKey()const;
 
@@ -249,6 +252,9 @@ void ctkPathLineEditPrivate::updateFilter()
                            QDir::Name|QDir::DirsLast, newCompleter));
   this->LineEdit->setCompleter(newCompleter);
 
+  QObject::connect(this->LineEdit->completer()->completionModel(), SIGNAL(layoutChanged()),
+                   q, SLOT(_q_recomputeCompleterPopupSize()));
+
   // don't accept invalid path
   QRegExpValidator* validator = new QRegExpValidator(
     ctk::nameFiltersToRegExp(this->NameFilters), q);
@@ -268,6 +274,37 @@ void ctkPathLineEditPrivate::adjustPathLineEditSize()
 }
 
 //-----------------------------------------------------------------------------
+void ctkPathLineEditPrivate::_q_recomputeCompleterPopupSize()
+{
+  QSize lineEditSize = this->LineEdit->size();
+
+  QAbstractItemView* view = this->LineEdit->completer()->popup();
+  const QFontMetrics& fm = view->fontMetrics();
+
+  int iconWidth = 0;
+  int textWidth = 0;
+
+  QStyleOptionFrame option;
+  int frameWidth = view->style()->pixelMetric(QStyle::PM_DefaultFrameWidth, &option, view);
+  int frame = 2 * frameWidth
+      + view->contentsMargins().left()
+      + view->contentsMargins().right();
+
+  QAbstractItemModel* model = this->LineEdit->completer()->completionModel();
+  for (int i = 0; i < model->rowCount(); ++i)
+    {
+    QVariant icon = model->data(model->index(i, 0), Qt::DecorationRole);
+    if (icon.isValid() && icon.canConvert<QIcon>())
+      {
+      iconWidth = qMax(iconWidth, icon.value<QIcon>().availableSizes().front().width() + 4);
+      }
+    textWidth = qMax(textWidth, fm.boundingRect(model->data(model->index(i, 0)).toString()).width());
+    }
+
+  view->setMinimumWidth(qMax(frame + iconWidth + textWidth, lineEditSize.width()));
+}
+
+//-----------------------------------------------------------------------------
 QString ctkPathLineEditPrivate::settingKey()const
 {
   Q_Q(const ctkPathLineEdit);
@@ -671,3 +708,5 @@ QSize ctkPathLineEdit::sizeHint()const
   Q_D(const ctkPathLineEdit);
   return d->recomputeSizeHint(d->SizeHint);
 }
+
+#include "moc_ctkPathLineEdit.h"

+ 2 - 0
Libs/Widgets/ctkPathLineEdit.h

@@ -271,6 +271,8 @@ protected:
 private:
   Q_DECLARE_PRIVATE(ctkPathLineEdit);
   Q_DISABLE_COPY(ctkPathLineEdit);
+
+  Q_PRIVATE_SLOT(d_ptr, void _q_recomputeCompleterPopupSize())
 };
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(ctkPathLineEdit::Filters)