configdialog: Fix icon bar sizing
authorPalo Kisa <palo.kisa@gmail.com>
Tue, 26 Apr 2016 11:19:16 +0000 (13:19 +0200)
committerPalo Kisa <palo.kisa@gmail.com>
Wed, 27 Apr 2016 11:41:07 +0000 (13:41 +0200)
configdialog/lxqtconfigdialog.ui
configdialog/lxqtpageselectwidget.cpp
configdialog/lxqtpageselectwidget.h

index 6818f92..a1bfbdf 100644 (file)
@@ -21,6 +21,9 @@
        <property name="horizontalScrollBarPolicy">
         <enum>Qt::ScrollBarAlwaysOff</enum>
        </property>
+       <property name="sizeAdjustPolicy">
+        <enum>QAbstractScrollArea::AdjustToContents</enum>
+       </property>
       </widget>
      </item>
      <item>
index 1197a59..dde03fc 100644 (file)
@@ -29,6 +29,7 @@
 #include "lxqtpageselectwidget.h"
 #include <QDebug>
 #include <QStyledItemDelegate>
+#include <QEvent>
 #include <QScrollBar>
 #include <QApplication>
 
@@ -61,7 +62,13 @@ PageSelectWidgetItemDelegate::PageSelectWidgetItemDelegate(PageSelectWidget *par
 QSize PageSelectWidgetItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     QSize size = QStyledItemDelegate::sizeHint(option, index);
-    size.setWidth(mView->viewport()->width() - 2*mView->spacing());
+    //all items should have unified width
+    QStyle * style = option.widget ? option.widget->style() : QApplication::style();
+    //Note: this margin logic follows code in QCommonStylePrivate::viewItemLayout()
+    const int margin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, &option, option.widget) + 1;
+    //considering the icon size too
+    size.setWidth(qMax(mView->maxTextWidth(), option.decorationSize.width()));
+    size.rwidth() += 2 * margin;
     return size;
 }
 
@@ -72,6 +79,7 @@ QSize PageSelectWidgetItemDelegate::sizeHint(const QStyleOptionViewItem &option,
  ************************************************/
 PageSelectWidget::PageSelectWidget(QWidget *parent) :
     QListWidget(parent)
+    , mMaxTextWidth(0)
 {
     setSelectionRectVisible(false);
     setViewMode(IconMode);
@@ -81,8 +89,12 @@ PageSelectWidget::PageSelectWidget(QWidget *parent) :
     setDragEnabled(NoDragDrop);
     setEditTriggers(NoEditTriggers);
     setTextElideMode(Qt::ElideNone);
+    setContentsMargins(0, 0, 0, 0);
 
     setItemDelegate(new PageSelectWidgetItemDelegate(this));
+    connect(model(), &QAbstractItemModel::rowsInserted, this, &PageSelectWidget::updateMaxTextWidth);
+    connect(model(), &QAbstractItemModel::rowsRemoved, this, &PageSelectWidget::updateMaxTextWidth);
+    connect(model(), &QAbstractItemModel::dataChanged, this, &PageSelectWidget::updateMaxTextWidth);
 }
 
 
@@ -93,24 +105,53 @@ PageSelectWidget::~PageSelectWidget()
 {
 }
 
+/************************************************
+
+ ************************************************/
+int PageSelectWidget::maxTextWidth() const
+{
+    return mMaxTextWidth;
+}
+
+/************************************************
+
+ ************************************************/
+QSize PageSelectWidget::viewportSizeHint() const
+{
+    const int spacing2 = spacing() * 2;
+    QSize size{sizeHintForColumn(0) + spacing2, (sizeHintForRow(0) + spacing2) * count()};
+    if (verticalScrollBar()->isVisible())
+        size.rwidth() += verticalScrollBar()->sizeHint().width();
+    return size;
+}
 
 /************************************************
 
  ************************************************/
-QSize PageSelectWidget::sizeHint() const
+QSize PageSelectWidget::minimumSizeHint() const
 {
-    QSize size = QListWidget::sizeHint();
-    int w = 0;
-    for(int i=0; i< count(); ++i)
+    return QSize{0, 0};
+}
+
+/************************************************
+
+ ************************************************/
+void PageSelectWidget::updateMaxTextWidth()
+{
+    for(int i = count() - 1; 0 <= i; --i)
     {
-        QRect rect = fontMetrics().boundingRect(QRect(), Qt::AlignHCenter | Qt::TextWordWrap, item(i)->text());
-        w = qMax(w, rect.width());
+        const QRect r = fontMetrics().boundingRect(QRect{},  Qt::AlignLeft | Qt::TextWordWrap, item(i)->text());
+        mMaxTextWidth = qMax(mMaxTextWidth, r.width());
     }
-    // consider the icon size too
-    w = qMax(w, QApplication::style()->pixelMetric(QStyle::PM_IconViewIconSize));
+}
 
-    if (verticalScrollBar()->isVisible())
-        w += QApplication::style()->pixelMetric(QStyle::PM_ScrollBarExtent);
-    size.setWidth(w + frameWidth() + spacing()*2 + 10);
-    return size;
+/************************************************
+
+ ************************************************/
+bool PageSelectWidget::event(QEvent * event)
+{
+    if (QEvent::StyleChange == event->type())
+        updateMaxTextWidth();
+
+    return QListWidget::event(event);
 }
index bfeb712..abb8e27 100644 (file)
@@ -41,9 +41,18 @@ class LXQT_API PageSelectWidget : public QListWidget
 public:
     explicit PageSelectWidget(QWidget *parent = 0);
     virtual ~PageSelectWidget();
+    int maxTextWidth() const;
+    bool event(QEvent * event) override;
 
 protected:
-    QSize sizeHint() const;
+    QSize viewportSizeHint() const override;
+    QSize minimumSizeHint() const override;
+
+protected slots:
+    void updateMaxTextWidth();
+
+private:
+    int mMaxTextWidth;
 };
 
 } // namespace LXQt