From: Peter Penz Date: Fri, 6 Apr 2012 21:06:05 +0000 (+0200) Subject: Allow to specify whether an upscaling of images should be done X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/dc555b8e56162bb908ad398341c5d7828d443bf3?ds=sidebyside 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 --- 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();