┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kfileitemlistwidget.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2012-03-27 00:44:39 +0200
committerPeter Penz <[email protected]>2012-03-27 00:48:34 +0200
commit793311dac163592a8b63fc4859fdc054d7a22022 (patch)
tree9645cd870530072b23d422d51fd0515f74de6c1f /src/kitemviews/kfileitemlistwidget.cpp
parent8c986e22fd8fa34ea6c29ad2e88e08c2f9b34bf2 (diff)
KItemListView interface and implementation simplification
- Remove KItemListView::preferredRoleColumnWidth() and allow implementing this as part of derived classes from KItemListWidget. Those derived classes are aware about the layout and hence also can provide the preferred role width. - Make KItemListView::itemSizeHint() non-virtual and also allow implementing the size hint as part of derived classes from KItemListWidget.
Diffstat (limited to 'src/kitemviews/kfileitemlistwidget.cpp')
-rw-r--r--src/kitemviews/kfileitemlistwidget.cpp184
1 files changed, 138 insertions, 46 deletions
diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp
index 5c865d1ca..022f3b472 100644
--- a/src/kitemviews/kfileitemlistwidget.cpp
+++ b/src/kitemviews/kfileitemlistwidget.cpp
@@ -20,8 +20,8 @@
#include "kfileitemlistwidget.h"
#include "kfileitemclipboard_p.h"
+#include "kfileitemlistview.h"
#include "kfileitemmodel.h"
-#include "kitemlistview.h"
#include "kpixmapmodifier_p.h"
#include <KIcon>
@@ -222,48 +222,62 @@ QRectF KFileItemListWidget::selectionToggleRect() const
return QRectF(pos, QSizeF(toggleSize, toggleSize));
}
-QString KFileItemListWidget::roleText(const QByteArray& role, const QHash<QByteArray, QVariant>& values)
+QSizeF KFileItemListWidget::itemSizeHint(int index, const KItemListView* view)
{
- QString text;
- const QVariant roleValue = values.value(role);
+ const QHash<QByteArray, QVariant> values = view->model()->data(index);
+ const KItemListStyleOption& option = view->styleOption();
+ const int additionalRolesCount = qMax(view->visibleRoles().count() - 1, 0);
- switch (roleTextId(role)) {
- case Name:
- case Permissions:
- case Owner:
- case Group:
- case Type:
- case Destination:
- case Path:
- text = roleValue.toString();
- break;
+ switch (static_cast<const KFileItemListView*>(view)->itemLayout()) {
+ case IconsLayout: {
+ const QString text = KStringHandler::preProcessWrap(values["name"].toString());
- case Size: {
- if (values.value("isDir").toBool()) {
- // The item represents a directory. Show the number of sub directories
- // instead of the file size of the directory.
- if (!roleValue.isNull()) {
- const int count = roleValue.toInt();
- if (count < 0) {
- text = i18nc("@item:intable", "Unknown");
- } else {
- text = i18ncp("@item:intable", "%1 item", "%1 items", count);
- }
- }
- } else {
- // Show the size in kilobytes (always round up)
- const KLocale* locale = KGlobal::locale();
- const int roundInc = (locale->binaryUnitDialect() == KLocale::MetricBinaryDialect) ? 499 : 511;
- const KIO::filesize_t size = roleValue.value<KIO::filesize_t>() + roundInc;
- text = locale->formatByteSize(size, 0, KLocale::DefaultBinaryDialect, KLocale::UnitKiloByte);
+ const qreal maxWidth = view->itemSize().width() - 2 * option.padding;
+ int textLinesCount = 0;
+ QTextLine line;
+
+ // Calculate the number of lines required for wrapping the name
+ QTextOption textOption(Qt::AlignHCenter);
+ textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
+
+ QTextLayout layout(text, option.font);
+ layout.setTextOption(textOption);
+ layout.beginLayout();
+ while ((line = layout.createLine()).isValid()) {
+ line.setLineWidth(maxWidth);
+ line.naturalTextWidth();
+ ++textLinesCount;
}
- break;
+ layout.endLayout();
+
+ // Add one line for each additional information
+ textLinesCount += additionalRolesCount;
+
+ const qreal height = textLinesCount * option.fontMetrics.height() +
+ option.iconSize +
+ option.padding * 3;
+ return QSizeF(view->itemSize().width(), height);
}
- case Date: {
- const QDateTime dateTime = roleValue.toDateTime();
- text = KGlobal::locale()->formatDateTime(dateTime);
- break;
+ case CompactLayout: {
+ // For each row exactly one role is shown. Calculate the maximum required width that is necessary
+ // to show all roles without horizontal clipping.
+ qreal maximumRequiredWidth = 0.0;
+
+ foreach (const QByteArray& role, view->visibleRoles()) {
+ const QString text = KFileItemListWidget::roleText(role, values);
+ const qreal requiredWidth = option.fontMetrics.width(text);
+ maximumRequiredWidth = qMax(maximumRequiredWidth, requiredWidth);
+ }
+
+ const qreal width = option.padding * 4 + option.iconSize + maximumRequiredWidth;
+ const qreal height = option.padding * 2 + qMax(option.iconSize, (1 + additionalRolesCount) * option.fontMetrics.height());
+ return QSizeF(width, height);
+ }
+
+ case DetailsLayout: {
+ const qreal height = option.padding * 2 + qMax(option.iconSize, option.fontMetrics.height());
+ return QSizeF(-1, height);
}
default:
@@ -271,7 +285,34 @@ QString KFileItemListWidget::roleText(const QByteArray& role, const QHash<QByteA
break;
}
- return text;
+ return QSize();
+}
+
+qreal KFileItemListWidget::preferredRoleColumnWidth(const QByteArray& role,
+ int index,
+ const KItemListView* view)
+{
+ qreal width = 0;
+
+ const QHash<QByteArray, QVariant> values = view->model()->data(index);
+ const KItemListStyleOption& option = view->styleOption();
+
+ const QString text = KFileItemListWidget::roleText(role, values);
+ if (!text.isEmpty()) {
+ const qreal columnPadding = option.padding * 3;
+ width = qMax(width, qreal(2 * columnPadding + option.fontMetrics.width(text)));
+ }
+
+ if (role == "name") {
+ // Increase the width by the expansion-toggle and the current expansion level
+ const int expandedParentsCount = values.value("expandedParentsCount", 0).toInt();
+ width += option.padding + (expandedParentsCount + 1) * view->itemSize().height() + KIconLoader::SizeSmall;
+
+ // Increase the width by the required space for the icon
+ width += option.padding * 2 + option.iconSize;
+ }
+
+ return width;
}
void KFileItemListWidget::invalidateCache()
@@ -924,6 +965,17 @@ QPixmap KFileItemListWidget::pixmapForIcon(const QString& name, int size)
return pixmap;
}
+void KFileItemListWidget::applyCutEffect(QPixmap& pixmap)
+{
+ KIconEffect* effect = KIconLoader::global()->iconEffect();
+ pixmap = effect->apply(pixmap, KIconLoader::Desktop, KIconLoader::DisabledState);
+}
+
+void KFileItemListWidget::applyHiddenEffect(QPixmap& pixmap)
+{
+ KIconEffect::semiTransparent(pixmap);
+}
+
KFileItemListWidget::TextId KFileItemListWidget::roleTextId(const QByteArray& role)
{
static QHash<QByteArray, TextId> rolesHash;
@@ -942,15 +994,55 @@ KFileItemListWidget::TextId KFileItemListWidget::roleTextId(const QByteArray& ro
return rolesHash.value(role);
}
-void KFileItemListWidget::applyCutEffect(QPixmap& pixmap)
+QString KFileItemListWidget::roleText(const QByteArray& role, const QHash<QByteArray, QVariant>& values)
{
- KIconEffect* effect = KIconLoader::global()->iconEffect();
- pixmap = effect->apply(pixmap, KIconLoader::Desktop, KIconLoader::DisabledState);
-}
+ QString text;
+ const QVariant roleValue = values.value(role);
-void KFileItemListWidget::applyHiddenEffect(QPixmap& pixmap)
-{
- KIconEffect::semiTransparent(pixmap);
-}
+ switch (roleTextId(role)) {
+ case Name:
+ case Permissions:
+ case Owner:
+ case Group:
+ case Type:
+ case Destination:
+ case Path:
+ text = roleValue.toString();
+ break;
+
+ case Size: {
+ if (values.value("isDir").toBool()) {
+ // The item represents a directory. Show the number of sub directories
+ // instead of the file size of the directory.
+ if (!roleValue.isNull()) {
+ const int count = roleValue.toInt();
+ if (count < 0) {
+ text = i18nc("@item:intable", "Unknown");
+ } else {
+ text = i18ncp("@item:intable", "%1 item", "%1 items", count);
+ }
+ }
+ } else {
+ // Show the size in kilobytes (always round up)
+ const KLocale* locale = KGlobal::locale();
+ const int roundInc = (locale->binaryUnitDialect() == KLocale::MetricBinaryDialect) ? 499 : 511;
+ const KIO::filesize_t size = roleValue.value<KIO::filesize_t>() + roundInc;
+ text = locale->formatByteSize(size, 0, KLocale::DefaultBinaryDialect, KLocale::UnitKiloByte);
+ }
+ break;
+ }
+
+ case Date: {
+ const QDateTime dateTime = roleValue.toDateTime();
+ text = KGlobal::locale()->formatDateTime(dateTime);
+ break;
+ }
+
+ default:
+ Q_ASSERT(false);
+ break;
+ }
+ return text;
+}
#include "kfileitemlistwidget.moc"