Warning, file /system/dolphin/src/views/dolphinitemlistview.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "dolphinitemlistview.h" 0008 0009 #include "dolphin_compactmodesettings.h" 0010 #include "dolphin_contentdisplaysettings.h" 0011 #include "dolphin_detailsmodesettings.h" 0012 #include "dolphin_generalsettings.h" 0013 #include "dolphin_iconsmodesettings.h" 0014 #include "dolphinfileitemlistwidget.h" 0015 #include "settings/viewmodes/viewmodesettings.h" 0016 #include "zoomlevelinfo.h" 0017 0018 #include <KIO/PreviewJob> 0019 #include <QtMath> 0020 0021 DolphinItemListView::DolphinItemListView(QGraphicsWidget *parent) 0022 : KFileItemListView(parent) 0023 , m_zoomLevel(0) 0024 { 0025 DolphinItemListView::updateFont(); 0026 updateGridSize(); 0027 } 0028 0029 DolphinItemListView::~DolphinItemListView() 0030 { 0031 writeSettings(); 0032 } 0033 0034 void DolphinItemListView::setZoomLevel(int level) 0035 { 0036 if (level < ZoomLevelInfo::minimumLevel()) { 0037 level = ZoomLevelInfo::minimumLevel(); 0038 } else if (level > ZoomLevelInfo::maximumLevel()) { 0039 level = ZoomLevelInfo::maximumLevel(); 0040 } 0041 0042 if (level == m_zoomLevel) { 0043 return; 0044 } 0045 0046 m_zoomLevel = level; 0047 0048 ViewModeSettings settings(itemLayout()); 0049 if (previewsShown()) { 0050 const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level); 0051 settings.setPreviewSize(previewSize); 0052 } else { 0053 const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level); 0054 settings.setIconSize(iconSize); 0055 } 0056 0057 updateGridSize(); 0058 } 0059 0060 int DolphinItemListView::zoomLevel() const 0061 { 0062 return m_zoomLevel; 0063 } 0064 0065 void DolphinItemListView::setEnabledSelectionToggles(DolphinItemListView::SelectionTogglesEnabled selectionTogglesEnabled) 0066 { 0067 m_selectionTogglesEnabled = selectionTogglesEnabled; 0068 switch (m_selectionTogglesEnabled) { 0069 case True: 0070 return setEnabledSelectionToggles(true); 0071 case False: 0072 return setEnabledSelectionToggles(false); 0073 case FollowSetting: 0074 return setEnabledSelectionToggles(GeneralSettings::showSelectionToggle()); 0075 } 0076 } 0077 0078 void DolphinItemListView::readSettings() 0079 { 0080 // We load the settings for all view modes now because we don't load them when the view mode changes. 0081 IconsModeSettings::self()->load(); 0082 CompactModeSettings::self()->load(); 0083 DetailsModeSettings::self()->load(); 0084 0085 ContentDisplaySettings::self()->load(); 0086 0087 beginTransaction(); 0088 0089 setEnabledSelectionToggles(m_selectionTogglesEnabled); 0090 setHighlightEntireRow(itemLayoutHighlightEntireRow(itemLayout())); 0091 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(itemLayout())); 0092 0093 updateFont(); 0094 updateGridSize(); 0095 0096 const KConfigGroup globalConfig(KSharedConfig::openConfig(), QStringLiteral("PreviewSettings")); 0097 setEnabledPlugins(globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins())); 0098 setLocalFileSizePreviewLimit(globalConfig.readEntry("MaximumSize", 0)); 0099 endTransaction(); 0100 } 0101 0102 void DolphinItemListView::writeSettings() 0103 { 0104 IconsModeSettings::self()->save(); 0105 CompactModeSettings::self()->save(); 0106 DetailsModeSettings::self()->save(); 0107 } 0108 0109 KItemListWidgetCreatorBase *DolphinItemListView::defaultWidgetCreator() const 0110 { 0111 return new KItemListWidgetCreator<DolphinFileItemListWidget>(); 0112 } 0113 0114 bool DolphinItemListView::itemLayoutHighlightEntireRow(ItemLayout layout) const 0115 { 0116 return layout == DetailsLayout && DetailsModeSettings::highlightEntireRow(); 0117 } 0118 0119 bool DolphinItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) const 0120 { 0121 return layout == DetailsLayout && DetailsModeSettings::expandableFolders(); 0122 } 0123 0124 void DolphinItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous) 0125 { 0126 setHeaderVisible(current == DetailsLayout); 0127 0128 updateFont(); 0129 updateGridSize(); 0130 0131 KFileItemListView::onItemLayoutChanged(current, previous); 0132 } 0133 0134 void DolphinItemListView::onPreviewsShownChanged(bool shown) 0135 { 0136 Q_UNUSED(shown) 0137 updateGridSize(); 0138 } 0139 0140 void DolphinItemListView::onVisibleRolesChanged(const QList<QByteArray> ¤t, const QList<QByteArray> &previous) 0141 { 0142 KFileItemListView::onVisibleRolesChanged(current, previous); 0143 updateGridSize(); 0144 } 0145 0146 void DolphinItemListView::updateFont() 0147 { 0148 const ViewModeSettings settings(itemLayout()); 0149 0150 if (settings.useSystemFont()) { 0151 KItemListView::updateFont(); 0152 } else { 0153 QFont font(settings.viewFont()); 0154 0155 KItemListStyleOption option = styleOption(); 0156 option.font = font; 0157 option.fontMetrics = QFontMetrics(font); 0158 0159 setStyleOption(option); 0160 } 0161 } 0162 0163 void DolphinItemListView::updateGridSize() 0164 { 0165 const ViewModeSettings settings(itemLayout()); 0166 0167 // Calculate the size of the icon 0168 const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize(); 0169 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize)); 0170 KItemListStyleOption option = styleOption(); 0171 0172 const int padding = 2; 0173 int horizontalMargin = 0; 0174 int verticalMargin = 0; 0175 0176 // Calculate the item-width and item-height 0177 int itemWidth; 0178 int itemHeight; 0179 int maxTextLines = 0; 0180 int maxTextWidth = 0; 0181 0182 switch (itemLayout()) { 0183 case KFileItemListView::IconsLayout: { 0184 // an exponential factor based on zoom, 0 -> 1, 4 -> 1.36 8 -> ~1.85, 16 -> 3.4 0185 auto zoomFactor = qExp(m_zoomLevel / 13.0); 0186 // 9 is the average char width for 10pt Noto Sans, making fontFactor =1 0187 // by each pixel the font gets larger the factor increases by 1/9 0188 auto fontFactor = option.fontMetrics.averageCharWidth() / 9.0; 0189 itemWidth = 48 + IconsModeSettings::textWidthIndex() * 64 * fontFactor * zoomFactor; 0190 0191 if (itemWidth < iconSize + padding * 2 * zoomFactor) { 0192 itemWidth = iconSize + padding * 2 * zoomFactor; 0193 } 0194 0195 itemHeight = padding * 3 + iconSize + option.fontMetrics.lineSpacing(); 0196 0197 horizontalMargin = 4; 0198 verticalMargin = 8; 0199 maxTextLines = IconsModeSettings::maximumTextLines(); 0200 break; 0201 } 0202 case KFileItemListView::CompactLayout: { 0203 itemWidth = padding * 4 + iconSize + option.fontMetrics.height() * 5; 0204 const int textLinesCount = visibleRoles().count(); 0205 itemHeight = padding * 2 + qMax(iconSize, textLinesCount * option.fontMetrics.lineSpacing()); 0206 0207 if (CompactModeSettings::maximumTextWidthIndex() > 0) { 0208 // A restriction is given for the maximum width of the text (0 means 0209 // having no restriction) 0210 maxTextWidth = option.fontMetrics.height() * 10 * CompactModeSettings::maximumTextWidthIndex(); 0211 } 0212 0213 horizontalMargin = 8; 0214 break; 0215 } 0216 case KFileItemListView::DetailsLayout: { 0217 itemWidth = -1; 0218 itemHeight = padding * 2 + qMax(iconSize, option.fontMetrics.lineSpacing()); 0219 break; 0220 } 0221 default: 0222 itemWidth = -1; 0223 itemHeight = -1; 0224 Q_ASSERT(false); 0225 break; 0226 } 0227 0228 // Apply the calculated values 0229 option.padding = padding; 0230 option.horizontalMargin = horizontalMargin; 0231 option.verticalMargin = verticalMargin; 0232 option.iconSize = iconSize; 0233 option.maxTextLines = maxTextLines; 0234 option.maxTextWidth = maxTextWidth; 0235 beginTransaction(); 0236 setStyleOption(option); 0237 setItemSize(QSizeF(itemWidth, itemHeight)); 0238 endTransaction(); 0239 } 0240 0241 #include "moc_dolphinitemlistview.cpp"