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"