diff --git a/src/filewidgets/kdiroperator.h b/src/filewidgets/kdiroperator.h --- a/src/filewidgets/kdiroperator.h +++ b/src/filewidgets/kdiroperator.h @@ -607,7 +607,7 @@ bool isInlinePreviewShown() const; /** - * Returns the icon zoom. + * Returns the icon zoom level. * @since 4.2 */ int iconsZoom() const; @@ -784,6 +784,20 @@ */ void setIconsZoom(int value); + /** + * Returns the icon size for a given zoom level. + * Typically the level should be between 0 (very small) and 16 (enormous). + * @since 5.47 + */ + int iconSizeForZoomLevel(int level); + + /** + * Returns the zoom level for a given icon size. + * Typically the size should be between 16 (very small) and 256 (enormous). + * @since 5.47 + */ + int zoomLevelForIconSize(int size); + /** * Set the URL schemes that the file widget should allow navigating to. * @@ -910,7 +924,7 @@ * trigger this signal to be emitted. * @since 4.2 */ - void currentIconSizeChanged(int size); + void currentIconSizeChanged(int zoomLevel); private: class Private; diff --git a/src/filewidgets/kdiroperator.cpp b/src/filewidgets/kdiroperator.cpp --- a/src/filewidgets/kdiroperator.cpp +++ b/src/filewidgets/kdiroperator.cpp @@ -911,23 +911,51 @@ return; } - int value = _value; - value = qMin(100, value); - value = qMax(0, value); - - d->iconsZoom = value; + d->iconsZoom = _value; if (!d->previewGenerator) { return; } - const int maxSize = KIconLoader::SizeEnormous - KIconLoader::SizeSmall; - const int val = (maxSize * value / 100) + KIconLoader::SizeSmall; - d->itemView->setIconSize(QSize(val, val)); + int size = iconSizeForZoomLevel(_value); + + d->itemView->setIconSize(QSize(size, size)); d->updateListViewGrid(); d->previewGenerator->updatePreviews(); - emit currentIconSizeChanged(value); + emit currentIconSizeChanged(_value); +} + +int KDirOperator::iconSizeForZoomLevel(int level) +{ + int size; + + switch (level) { + case 0: size = KIconLoader::SizeSmall; break; + case 1: size = KIconLoader::SizeSmallMedium; break; + case 2: size = KIconLoader::SizeMedium; break; + case 3: size = KIconLoader::SizeLarge; break; + case 4: size = KIconLoader::SizeHuge; break; + default: size = KIconLoader::SizeHuge + ((level - 4) << 4); + } + + return size; +} + +int KDirOperator::zoomLevelForIconSize(int size) +{ + int level; + + switch (size) { + case KIconLoader::SizeSmall: level = 0; break; + case KIconLoader::SizeSmallMedium: level = 1; break; + case KIconLoader::SizeMedium: level = 2; break; + case KIconLoader::SizeLarge: level = 3; break; + case KIconLoader::SizeHuge: level = 4; break; + default: level = 4 + ((size - KIconLoader::SizeHuge) >> 4); + } + + return level; } void KDirOperator::close() @@ -1378,9 +1406,9 @@ QWheelEvent *evt = static_cast(event); if (evt->modifiers() & Qt::ControlModifier) { if (evt->delta() > 0) { - setIconsZoom(d->iconsZoom + 10); + setIconsZoom(d->iconsZoom + 1); } else { - setIconsZoom(d->iconsZoom - 10); + setIconsZoom(d->iconsZoom - 1); } return true; } @@ -1637,21 +1665,17 @@ const bool previewForcedToTrue = d->inlinePreviewState == Private::ForcedToTrue; const bool previewShown = d->inlinePreviewState == Private::NotForced ? d->showPreviews : previewForcedToTrue; d->previewGenerator = new KFilePreviewGenerator(d->itemView); - const int maxSize = KIconLoader::SizeEnormous - KIconLoader::SizeSmall; - const int val = (maxSize * d->iconsZoom / 100) + KIconLoader::SizeSmall; - d->itemView->setIconSize(previewForcedToTrue ? QSize(KIconLoader::SizeHuge, KIconLoader::SizeHuge) : QSize(val, val)); + d->itemView->setIconSize(QSize(KIconLoader::SizeHuge, KIconLoader::SizeHuge)); d->previewGenerator->setPreviewShown(previewShown); d->actionCollection->action(QStringLiteral("inline preview"))->setChecked(previewShown); // ensure we change everything needed d->_k_slotChangeDecorationPosition(); emit viewChanged(view); - const int zoom = previewForcedToTrue ? (KIconLoader::SizeHuge - KIconLoader::SizeSmall + 1) * 100 / maxSize : d->iconSizeForViewType(view); - // this will make d->iconsZoom be updated, since setIconsZoom slot will be called - emit currentIconSizeChanged(zoom); + emit currentIconSizeChanged(zoomLevelForIconSize(d->iconSizeForViewType(view))); } void KDirOperator::setDirLister(KDirLister *lister) @@ -2227,7 +2251,7 @@ if (d->inlinePreviewState == Private::NotForced) { configGroup.writeEntry(QStringLiteral("Show Inline Previews"), d->showPreviewsConfigEntry); if (qobject_cast(d->itemView)) { - configGroup.writeEntry(QStringLiteral("listViewIconSize"), d->iconsZoom); + configGroup.writeEntry(QStringLiteral("listViewIconSize"), iconSizeForZoomLevel(d->iconsZoom)); } else { configGroup.writeEntry(QStringLiteral("detailedViewIconSize"), d->iconsZoom); } diff --git a/src/filewidgets/kfilewidget.cpp b/src/filewidgets/kfilewidget.cpp --- a/src/filewidgets/kfilewidget.cpp +++ b/src/filewidgets/kfilewidget.cpp @@ -512,8 +512,8 @@ d->iconSizeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); d->iconSizeSlider->setMinimumWidth(40); d->iconSizeSlider->setOrientation(Qt::Horizontal); - d->iconSizeSlider->setMinimum(0); - d->iconSizeSlider->setMaximum(100); + d->iconSizeSlider->setPageStep(1); + d->iconSizeSlider->setRange(0, 10); // 16px to 160px d->iconSizeSlider->installEventFilter(this); connect(d->iconSizeSlider, SIGNAL(valueChanged(int)), d->ops, SLOT(setIconsZoom(int))); @@ -2131,37 +2131,19 @@ void KFileWidgetPrivate::_k_zoomOutIconsSize() { - const int currValue = ops->iconsZoom(); - const int futValue = qMax(0, currValue - 10); - iconSizeSlider->setValue(futValue); - _k_slotIconSizeSliderMoved(futValue); + iconSizeSlider->setValue(ops->iconsZoom() - 1); + _k_slotIconSizeSliderMoved(ops->iconsZoom()); } void KFileWidgetPrivate::_k_zoomInIconsSize() { - const int currValue = ops->iconsZoom(); - const int futValue = qMin(100, currValue + 10); - iconSizeSlider->setValue(futValue); - _k_slotIconSizeSliderMoved(futValue); + iconSizeSlider->setValue(ops->iconsZoom() + 1); + _k_slotIconSizeSliderMoved(ops->iconsZoom()); } void KFileWidgetPrivate::_k_slotIconSizeChanged(int _value) { - int maxSize = KIconLoader::SizeEnormous - KIconLoader::SizeSmall; - int value = (maxSize * _value / 100) + KIconLoader::SizeSmall; - switch (value) { - case KIconLoader::SizeSmall: - case KIconLoader::SizeSmallMedium: - case KIconLoader::SizeMedium: - case KIconLoader::SizeLarge: - case KIconLoader::SizeHuge: - case KIconLoader::SizeEnormous: - iconSizeSlider->setToolTip(i18n("Icon size: %1 pixels (standard size)", value)); - break; - default: - iconSizeSlider->setToolTip(i18n("Icon size: %1 pixels", value)); - break; - } + iconSizeSlider->setToolTip(i18n("Icon size: %1 pixels", ops->iconSizeForZoomLevel(_value))); } void KFileWidgetPrivate::_k_slotIconSizeSliderMoved(int _value)