From dc555b8e56162bb908ad398341c5d7828d443bf3 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Fri, 6 Apr 2012 23:06:05 +0200 Subject: [PATCH] Allow to specify whether an upscaling of images should be done The option is currently hidden as up to now only Nuno requested it, but it seems to be urgent: "my icon making productivity has drop subtantialy" ((c) 2012 Nuno) As I don't want to get blamed for an outdated Oxygen-icon-set I have no other choice ;-) CCMAIL: nuno.pinheiro@kdab.com --- src/kitemviews/kfileitemlistview.cpp | 16 +++- src/kitemviews/kfileitemlistview.h | 8 ++ src/kitemviews/kfileitemmodelrolesupdater.cpp | 76 ++++++++++++++----- src/kitemviews/kfileitemmodelrolesupdater.h | 23 +++++- src/kitemviews/kpixmapmodifier.cpp | 6 ++ src/kitemviews/kpixmapmodifier_p.h | 1 + src/settings/dolphin_generalsettings.kcfg | 4 + src/views/dolphinitemlistcontainer.cpp | 4 +- 8 files changed, 115 insertions(+), 23 deletions(-) diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp index 8f7c9c899..11760fed1 100644 --- a/src/kitemviews/kfileitemlistview.cpp +++ b/src/kitemviews/kfileitemlistview.cpp @@ -82,13 +82,25 @@ KFileItemListView::~KFileItemListView() void KFileItemListView::setPreviewsShown(bool show) { if (m_modelRolesUpdater) { - m_modelRolesUpdater->setPreviewShown(show); + m_modelRolesUpdater->setPreviewsShown(show); } } bool KFileItemListView::previewsShown() const { - return m_modelRolesUpdater->isPreviewShown(); + return m_modelRolesUpdater ? m_modelRolesUpdater->previewsShown() : false; +} + +void KFileItemListView::setEnlargeSmallPreviews(bool enlarge) +{ + if (m_modelRolesUpdater) { + m_modelRolesUpdater->setEnlargeSmallPreviews(enlarge); + } +} + +bool KFileItemListView::enlargeSmallPreviews() const +{ + return m_modelRolesUpdater ? m_modelRolesUpdater->enlargeSmallPreviews() : false; } void KFileItemListView::setItemLayout(Layout layout) diff --git a/src/kitemviews/kfileitemlistview.h b/src/kitemviews/kfileitemlistview.h index 40808c4de..8f7ca9063 100644 --- a/src/kitemviews/kfileitemlistview.h +++ b/src/kitemviews/kfileitemlistview.h @@ -54,6 +54,14 @@ public: void setPreviewsShown(bool show); bool previewsShown() const; + /** + * If enabled a small preview gets upscaled to the icon size in case where + * the icon size is larger than the preview. Per default enlarging is + * enabled. + */ + void setEnlargeSmallPreviews(bool enlarge); + bool enlargeSmallPreviews() const; + void setItemLayout(Layout layout); Layout itemLayout() const; diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index b81a4a1a3..2907a126d 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -67,6 +67,7 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO m_iconSizeChangedDuringPausing(false), m_rolesChangedDuringPausing(false), m_previewShown(false), + m_enlargeSmallPreviews(true), m_clearPreviews(false), m_model(model), m_iconSize(), @@ -155,7 +156,7 @@ void KFileItemModelRolesUpdater::setVisibleIndexRange(int index, int count) } } -void KFileItemModelRolesUpdater::setPreviewShown(bool show) +void KFileItemModelRolesUpdater::setPreviewsShown(bool show) { if (show == m_previewShown) { return; @@ -166,30 +167,35 @@ void KFileItemModelRolesUpdater::setPreviewShown(bool show) m_clearPreviews = true; } - if (m_paused) { - m_previewChangedDuringPausing = true; - } else { - sortAndResolveAllRoles(); - } + updateAllPreviews(); } -bool KFileItemModelRolesUpdater::isPreviewShown() const +bool KFileItemModelRolesUpdater::previewsShown() const { return m_previewShown; } -void KFileItemModelRolesUpdater::setEnabledPlugins(const QStringList& list) +void KFileItemModelRolesUpdater::setEnlargeSmallPreviews(bool enlarge) { - if (m_enabledPlugins == list) { - return; + if (enlarge != m_enlargeSmallPreviews) { + m_enlargeSmallPreviews = enlarge; + if (m_previewShown) { + updateAllPreviews(); + } } +} - m_enabledPlugins = list; - if (m_previewShown) { - if (m_paused) { - m_previewChangedDuringPausing = true; - } else { - sortAndResolveAllRoles(); +bool KFileItemModelRolesUpdater::enlargeSmallPreviews() const +{ + return m_enlargeSmallPreviews; +} + +void KFileItemModelRolesUpdater::setEnabledPlugins(const QStringList& list) +{ + if (m_enabledPlugins == list) { + m_enabledPlugins = list; + if (m_previewShown) { + updateAllPreviews(); } } } @@ -390,7 +396,34 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi const int slashIndex = mimeType.indexOf(QLatin1Char('/')); const QString mimeTypeGroup = mimeType.left(slashIndex); if (mimeTypeGroup == QLatin1String("image")) { - KPixmapModifier::applyFrame(scaledPixmap, m_iconSize); + if (m_enlargeSmallPreviews) { + KPixmapModifier::applyFrame(scaledPixmap, m_iconSize); + } else { + // Assure that small previews don't get enlarged. Instead they + // should be shown centered within the frame. + const QSize contentSize = KPixmapModifier::sizeInsideFrame(m_iconSize); + const bool enlargingRequired = scaledPixmap.width() < contentSize.width() && + scaledPixmap.height() < contentSize.height(); + if (enlargingRequired) { + QSize frameSize = scaledPixmap.size(); + frameSize.scale(m_iconSize, Qt::KeepAspectRatio); + + QPixmap largeFrame(frameSize); + largeFrame.fill(Qt::transparent); + + KPixmapModifier::applyFrame(largeFrame, frameSize); + + QPainter painter(&largeFrame); + painter.drawPixmap((largeFrame.width() - scaledPixmap.width()) / 2, + (largeFrame.height() - scaledPixmap.height()) / 2, + scaledPixmap); + scaledPixmap = largeFrame; + } else { + // The image must be shrinked as it is too large to fit into + // the available icon size + KPixmapModifier::applyFrame(scaledPixmap, m_iconSize); + } + } } else { KPixmapModifier::scale(scaledPixmap, m_iconSize); } @@ -968,4 +1001,13 @@ int KFileItemModelRolesUpdater::subItemsCount(const QString& path) const #endif } +void KFileItemModelRolesUpdater::updateAllPreviews() +{ + if (m_paused) { + m_previewChangedDuringPausing = true; + } else { + sortAndResolveAllRoles(); + } +} + #include "kfileitemmodelrolesupdater.moc" diff --git a/src/kitemviews/kfileitemmodelrolesupdater.h b/src/kitemviews/kfileitemmodelrolesupdater.h index d22867511..e5e105e04 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.h +++ b/src/kitemviews/kfileitemmodelrolesupdater.h @@ -81,8 +81,16 @@ public: * of the file. If \a show is false the MIME type icon will be used for the "iconPixmap" * role. */ - void setPreviewShown(bool show); - bool isPreviewShown() const; + void setPreviewsShown(bool show); + bool previewsShown() const; + + /** + * If enabled a small preview gets upscaled to the icon size in case where + * the icon size is larger than the preview. Per default enlarging is + * enabled. + */ + void setEnlargeSmallPreviews(bool enlarge); + bool enlargeSmallPreviews() const; /** * If \a paused is set to true the asynchronous resolving of roles will be paused. @@ -187,6 +195,12 @@ private: */ int subItemsCount(const QString& path) const; + /** + * Must be invoked if a property has been changed that affects + * the look of the preview. Takes care to update all previews. + */ + void updateAllPreviews(); + private: // Property for setPaused()/isPaused(). bool m_paused; @@ -197,9 +211,12 @@ private: bool m_iconSizeChangedDuringPausing; bool m_rolesChangedDuringPausing; - // Property for setPreviewShown()/previewShown(). + // Property for setPreviewsShown()/previewsShown(). bool m_previewShown; + // Property for setEnlargeSmallPreviews()/enlargeSmallPreviews() + bool m_enlargeSmallPreviews; + // True if the role "iconPixmap" should be cleared when resolving the next // role with resolveRole(). Is necessary if the preview gets disabled // during the roles-updater has been paused by setPaused(). diff --git a/src/kitemviews/kpixmapmodifier.cpp b/src/kitemviews/kpixmapmodifier.cpp index 91f22da3c..475f36a64 100644 --- a/src/kitemviews/kpixmapmodifier.cpp +++ b/src/kitemviews/kpixmapmodifier.cpp @@ -392,3 +392,9 @@ void KPixmapModifier::applyFrame(QPixmap& icon, const QSize& scaledSize) icon = framedIcon; } +QSize KPixmapModifier::sizeInsideFrame(const QSize& frameSize) +{ + return QSize(frameSize.width() - TileSet::LeftMargin - TileSet::RightMargin, + frameSize.height() - TileSet::TopMargin - TileSet::BottomMargin); +} + diff --git a/src/kitemviews/kpixmapmodifier_p.h b/src/kitemviews/kpixmapmodifier_p.h index bca5e442a..4f863c349 100644 --- a/src/kitemviews/kpixmapmodifier_p.h +++ b/src/kitemviews/kpixmapmodifier_p.h @@ -30,6 +30,7 @@ class LIBDOLPHINPRIVATE_EXPORT KPixmapModifier public: static void scale(QPixmap& pixmap, const QSize& scaledSize); static void applyFrame(QPixmap& icon, const QSize& scaledSize); + static QSize sizeInsideFrame(const QSize& frameSize); }; #endif diff --git a/src/settings/dolphin_generalsettings.kcfg b/src/settings/dolphin_generalsettings.kcfg index 3e1d47415..9f261dc5f 100644 --- a/src/settings/dolphin_generalsettings.kcfg +++ b/src/settings/dolphin_generalsettings.kcfg @@ -83,5 +83,9 @@ true + + + true + diff --git a/src/views/dolphinitemlistcontainer.cpp b/src/views/dolphinitemlistcontainer.cpp index 391dc648f..5b7522f00 100644 --- a/src/views/dolphinitemlistcontainer.cpp +++ b/src/views/dolphinitemlistcontainer.cpp @@ -48,9 +48,11 @@ DolphinItemListContainer::DolphinItemListContainer(KDirLister* dirLister, controller()->setModel(new KFileItemModel(dirLister, this)); m_fileItemListView = new KFileItemListView(); + controller()->setView(m_fileItemListView); + m_fileItemListView->setWidgetCreator(new KItemListWidgetCreator()); m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle()); - controller()->setView(m_fileItemListView); + m_fileItemListView->setEnlargeSmallPreviews(GeneralSettings::enlargeSmallPreviews()); updateAutoActivationDelay(); updateFont(); -- 2.47.3