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> &current, 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"