File indexing completed on 2024-04-28 05:45:10

0001 /*
0002  * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kstandarditemlistview.h"
0008 
0009 #include "kstandarditemlistwidget.h"
0010 
0011 #include <KIconLoader>
0012 
0013 KStandardItemListView::KStandardItemListView(QGraphicsWidget *parent)
0014     : KItemListView(parent)
0015     , m_itemLayout(DetailsLayout)
0016 {
0017     setAcceptDrops(true);
0018     setScrollOrientation(Qt::Vertical);
0019     setVisibleRoles({"text"});
0020     setAlternateBackgrounds(true);
0021 }
0022 
0023 KStandardItemListView::~KStandardItemListView()
0024 {
0025 }
0026 
0027 void KStandardItemListView::setItemLayout(ItemLayout layout)
0028 {
0029     if (m_itemLayout == layout) {
0030         return;
0031     }
0032 
0033     beginTransaction();
0034 
0035     const ItemLayout previous = m_itemLayout;
0036     m_itemLayout = layout;
0037 
0038     // keep the leading padding option unchanged here
0039     setHighlightEntireRow(itemLayoutHighlightEntireRow(layout));
0040     setSupportsItemExpanding(itemLayoutSupportsItemExpanding(layout));
0041     setScrollOrientation(layout == CompactLayout ? Qt::Horizontal : Qt::Vertical);
0042 
0043     onItemLayoutChanged(layout, previous);
0044 
0045     endTransaction();
0046 }
0047 
0048 KStandardItemListView::ItemLayout KStandardItemListView::itemLayout() const
0049 {
0050     return m_itemLayout;
0051 }
0052 
0053 KItemListWidgetCreatorBase *KStandardItemListView::defaultWidgetCreator() const
0054 {
0055     return new KItemListWidgetCreator<KStandardItemListWidget>();
0056 }
0057 
0058 KItemListGroupHeaderCreatorBase *KStandardItemListView::defaultGroupHeaderCreator() const
0059 {
0060     return new KItemListGroupHeaderCreator<KStandardItemListGroupHeader>();
0061 }
0062 
0063 void KStandardItemListView::initializeItemListWidget(KItemListWidget *item)
0064 {
0065     KStandardItemListWidget *standardItemListWidget = qobject_cast<KStandardItemListWidget *>(item);
0066     Q_ASSERT(standardItemListWidget);
0067 
0068     switch (itemLayout()) {
0069     case IconsLayout:
0070         standardItemListWidget->setLayout(KStandardItemListWidget::IconsLayout);
0071         break;
0072     case CompactLayout:
0073         standardItemListWidget->setLayout(KStandardItemListWidget::CompactLayout);
0074         break;
0075     case DetailsLayout:
0076         standardItemListWidget->setLayout(KStandardItemListWidget::DetailsLayout);
0077         break;
0078     default:
0079         Q_ASSERT(false);
0080         break;
0081     }
0082 
0083     standardItemListWidget->setHighlightEntireRow(highlightEntireRow());
0084     standardItemListWidget->setSupportsItemExpanding(supportsItemExpanding());
0085 }
0086 
0087 bool KStandardItemListView::itemSizeHintUpdateRequired(const QSet<QByteArray> &changedRoles) const
0088 {
0089     // The only thing that can modify the item's size hint is the amount of space
0090     // needed to display the text for the visible roles.
0091     // Even if the icons have a different size they are always aligned within
0092     // the area defined by KItemStyleOption.iconSize and hence result in no
0093     // change of the item-size.
0094     const auto roles = visibleRoles();
0095     for (const QByteArray &role : roles) {
0096         if (changedRoles.contains(role)) {
0097             return true;
0098         }
0099     }
0100     return false;
0101 }
0102 
0103 bool KStandardItemListView::itemLayoutHighlightEntireRow(ItemLayout layout) const
0104 {
0105     return layout == DetailsLayout;
0106 }
0107 
0108 bool KStandardItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) const
0109 {
0110     return layout == DetailsLayout;
0111 }
0112 
0113 void KStandardItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
0114 {
0115     Q_UNUSED(current)
0116     Q_UNUSED(previous)
0117     updateLayoutOfVisibleItems();
0118 }
0119 
0120 void KStandardItemListView::onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)
0121 {
0122     Q_UNUSED(current)
0123     Q_UNUSED(previous)
0124     updateLayoutOfVisibleItems();
0125 }
0126 
0127 void KStandardItemListView::onSupportsItemExpandingChanged(bool supportsExpanding)
0128 {
0129     Q_UNUSED(supportsExpanding)
0130     updateLayoutOfVisibleItems();
0131 }
0132 
0133 void KStandardItemListView::polishEvent()
0134 {
0135     switch (m_itemLayout) {
0136     case IconsLayout:
0137         applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_LargeIconSize), 2, 4, 8);
0138         break;
0139     case CompactLayout:
0140         applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize), 2, 8, 0);
0141         break;
0142     case DetailsLayout:
0143         applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize), 2, 0, 0);
0144         break;
0145     default:
0146         Q_ASSERT(false);
0147         break;
0148     }
0149 
0150     QGraphicsWidget::polishEvent();
0151 }
0152 
0153 void KStandardItemListView::applyDefaultStyleOption(int iconSize, int padding, int horizontalMargin, int verticalMargin)
0154 {
0155     KItemListStyleOption option = styleOption();
0156 
0157     if (option.iconSize < 0) {
0158         option.iconSize = iconSize;
0159     }
0160     if (option.padding < 0) {
0161         option.padding = padding;
0162     }
0163     if (option.horizontalMargin < 0) {
0164         option.horizontalMargin = horizontalMargin;
0165     }
0166     if (option.verticalMargin < 0) {
0167         option.verticalMargin = verticalMargin;
0168     }
0169 
0170     setStyleOption(option);
0171 }
0172 
0173 void KStandardItemListView::updateLayoutOfVisibleItems()
0174 {
0175     if (model()) {
0176         const auto widgets = visibleItemListWidgets();
0177         for (KItemListWidget *widget : widgets) {
0178             initializeItemListWidget(widget);
0179         }
0180     }
0181 }
0182 
0183 #include "moc_kstandarditemlistview.cpp"