diff options
| author | Peter Penz <[email protected]> | 2012-04-21 21:28:16 +0200 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2012-04-21 21:32:42 +0200 |
| commit | ae4d11d918938fd9087f2035dac247969c1f2313 (patch) | |
| tree | 0303667797c81814b46b9ed5ed20b48ef31f2d71 /src/views/dolphinitemlistview.cpp | |
| parent | 47d7cdffdd2d2c04067a5088eaeff67add53dde3 (diff) | |
Prepare view-engine for non-KFileItem usecase
Up to now the view-engine only provided a model-implementation that
supports file-items. The view-engine always had been designed to be able
to work with any kind of model, so now a KStandardItemModel is available.
The plan is to convert the places panel to the new view-engine. It should
be no problem to fix this until the feature freeze - in the worst case
the places-panel code could be reverted while still keeping the
KStandardItemModel changes.
Diffstat (limited to 'src/views/dolphinitemlistview.cpp')
| -rw-r--r-- | src/views/dolphinitemlistview.cpp | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/src/views/dolphinitemlistview.cpp b/src/views/dolphinitemlistview.cpp new file mode 100644 index 000000000..156ca204f --- /dev/null +++ b/src/views/dolphinitemlistview.cpp @@ -0,0 +1,270 @@ +/*************************************************************************** + * Copyright (C) 2011 by Peter Penz <[email protected]> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "dolphinitemlistview.h" + +#include "dolphin_generalsettings.h" +#include "dolphin_iconsmodesettings.h" +#include "dolphin_detailsmodesettings.h" +#include "dolphin_compactmodesettings.h" +#include "dolphinfileitemlistwidget.h" + +#include <kitemviews/kfileitemlistview.h> +#include <kitemviews/kfileitemmodel.h> +#include <kitemviews/kitemlistcontroller.h> +#include <kitemviews/kitemliststyleoption.h> + +#include <KGlobalSettings> + +#include <views/viewmodecontroller.h> + +#include "zoomlevelinfo.h" + + +DolphinItemListView::DolphinItemListView(QGraphicsWidget* parent) : + KFileItemListView(parent), + m_zoomLevel(0) +{ + updateFont(); + updateGridSize(); +} + +DolphinItemListView::~DolphinItemListView() +{ + writeSettings(); +} + +void DolphinItemListView::setZoomLevel(int level) +{ + if (level < ZoomLevelInfo::minimumLevel()) { + level = ZoomLevelInfo::minimumLevel(); + } else if (level > ZoomLevelInfo::maximumLevel()) { + level = ZoomLevelInfo::maximumLevel(); + } + + if (level == m_zoomLevel) { + return; + } + + m_zoomLevel = level; + + ViewModeSettings settings(viewMode()); + if (previewsShown()) { + const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level); + settings.setPreviewSize(previewSize); + } else { + const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level); + settings.setIconSize(iconSize); + } + + updateGridSize(); +} + +int DolphinItemListView::zoomLevel() const +{ + return m_zoomLevel; +} + +void DolphinItemListView::readSettings() +{ + ViewModeSettings settings(viewMode()); + settings.readConfig(); + + beginTransaction(); + + setEnabledSelectionToggles(GeneralSettings::showSelectionToggle()); + + const bool expandableFolders = (itemLayout() && KFileItemListView::DetailsLayout) && + DetailsModeSettings::expandableFolders(); + setSupportsItemExpanding(expandableFolders); + + updateFont(); + updateGridSize(); + + const KConfigGroup globalConfig(KGlobal::config(), "PreviewSettings"); + const QStringList plugins = globalConfig.readEntry("Plugins", QStringList() + << "directorythumbnail" + << "imagethumbnail" + << "jpegthumbnail"); + setEnabledPlugins(plugins); + + endTransaction(); +} + +void DolphinItemListView::writeSettings() +{ + IconsModeSettings::self()->writeConfig(); + CompactModeSettings::self()->writeConfig(); + DetailsModeSettings::self()->writeConfig(); +} + +KItemListWidgetCreatorBase* DolphinItemListView::defaultWidgetCreator() const +{ + return new KItemListWidgetCreator<DolphinFileItemListWidget>(); +} + +void DolphinItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous) +{ + Q_UNUSED(previous); + + if (current == DetailsLayout) { + setSupportsItemExpanding(DetailsModeSettings::expandableFolders()); + setHeaderVisible(true); + } else { + setHeaderVisible(false); + } + + updateFont(); + updateGridSize(); +} + +void DolphinItemListView::onPreviewsShownChanged(bool shown) +{ + Q_UNUSED(shown); + updateGridSize(); +} + +void DolphinItemListView::onVisibleRolesChanged(const QList<QByteArray>& current, + const QList<QByteArray>& previous) +{ + KFileItemListView::onVisibleRolesChanged(current, previous); + updateGridSize(); +} + +void DolphinItemListView::updateGridSize() +{ + const ViewModeSettings settings(viewMode()); + + // Calculate the size of the icon + const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize(); + m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize)); + KItemListStyleOption option = styleOption(); + + const int padding = 2; + int horizontalMargin = 0; + int verticalMargin = 0; + + // Calculate the item-width and item-height + int itemWidth; + int itemHeight; + QSize maxTextSize; + + switch (itemLayout()) { + case KFileItemListView::IconsLayout: { + const int minItemWidth = 48; + itemWidth = minItemWidth + IconsModeSettings::textWidthIndex() * 64; + + if (previewsShown()) { + // Optimize the width for previews with a 3:2 aspect ratio instead + // of a 1:1 ratio to avoid wasting too much vertical space when + // photos. + const int minWidth = iconSize * 3 / 2; + itemWidth = qMax(itemWidth, minWidth); + } + + if (itemWidth < iconSize + padding * 2) { + itemWidth = iconSize + padding * 2; + } + + itemHeight = padding * 3 + iconSize + option.fontMetrics.lineSpacing(); + if (IconsModeSettings::maximumTextLines() > 0) { + // A restriction is given for the maximum number of textlines (0 means + // having no restriction) + const int additionalInfoCount = visibleRoles().count() - 1; + const int maxAdditionalLines = additionalInfoCount + IconsModeSettings::maximumTextLines(); + maxTextSize.rheight() = option.fontMetrics.lineSpacing() * maxAdditionalLines; + } + + horizontalMargin = 4; + verticalMargin = 8; + break; + } + case KFileItemListView::CompactLayout: { + itemWidth = padding * 4 + iconSize + option.fontMetrics.height() * 5; + const int textLinesCount = visibleRoles().count(); + itemHeight = padding * 2 + qMax(iconSize, textLinesCount * option.fontMetrics.lineSpacing()); + + if (CompactModeSettings::maximumTextWidthIndex() > 0) { + // A restriction is given for the maximum width of the text (0 means + // having no restriction) + maxTextSize.rwidth() = option.fontMetrics.height() * 10 * + CompactModeSettings::maximumTextWidthIndex(); + } + + horizontalMargin = 8; + break; + } + case KFileItemListView::DetailsLayout: { + itemWidth = -1; + itemHeight = padding * 2 + qMax(iconSize, option.fontMetrics.lineSpacing()); + break; + } + default: + itemWidth = -1; + itemHeight = -1; + Q_ASSERT(false); + break; + } + + // Apply the calculated values + option.padding = padding; + option.horizontalMargin = horizontalMargin; + option.verticalMargin = verticalMargin; + option.iconSize = iconSize; + option.maxTextSize = maxTextSize; + beginTransaction(); + setStyleOption(option); + setItemSize(QSizeF(itemWidth, itemHeight)); + endTransaction(); +} + +void DolphinItemListView::updateFont() +{ + KItemListStyleOption option = styleOption(); + + const ViewModeSettings settings(viewMode()); + + QFont font(settings.fontFamily(), qRound(settings.fontSize())); + font.setItalic(settings.italicFont()); + font.setWeight(settings.fontWeight()); + font.setPointSizeF(settings.fontSize()); + + option.font = font; + option.fontMetrics = QFontMetrics(font); + + setStyleOption(option); +} + +ViewModeSettings::ViewMode DolphinItemListView::viewMode() const +{ + ViewModeSettings::ViewMode mode; + + switch (itemLayout()) { + case KFileItemListView::IconsLayout: mode = ViewModeSettings::IconsMode; break; + case KFileItemListView::CompactLayout: mode = ViewModeSettings::CompactMode; break; + case KFileItemListView::DetailsLayout: mode = ViewModeSettings::DetailsMode; break; + default: mode = ViewModeSettings::IconsMode; + Q_ASSERT(false); + break; + } + + return mode; +} + +#include "dolphinitemlistview.moc" |
