┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kstandarditemlistwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kitemviews/kstandarditemlistwidget.cpp')
-rw-r--r--src/kitemviews/kstandarditemlistwidget.cpp54
1 files changed, 48 insertions, 6 deletions
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp
index 69c5602c7..97c8a038b 100644
--- a/src/kitemviews/kstandarditemlistwidget.cpp
+++ b/src/kitemviews/kstandarditemlistwidget.cpp
@@ -68,6 +68,14 @@ QSizeF KStandardItemListWidgetInformant::itemSizeHint(int index, const KItemList
const qreal maxWidth = itemWidth - 2 * option.padding;
QTextLine line;
+ int emptyRolesCount = 0;
+ foreach (const QByteArray& role, view->visibleRoles()) {
+ const QString text = roleText(role, values);
+ if (role != "text" && role != "rating" && text.isEmpty()) {
+ emptyRolesCount++;
+ }
+ }
+
// Calculate the number of lines required for wrapping the name
QTextOption textOption(Qt::AlignHCenter);
textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
@@ -84,7 +92,7 @@ QSizeF KStandardItemListWidgetInformant::itemSizeHint(int index, const KItemList
layout.endLayout();
// Add one line for each additional information
- textHeight += additionalRolesCount * option.fontMetrics.lineSpacing();
+ textHeight += (additionalRolesCount - emptyRolesCount) * option.fontMetrics.lineSpacing();
const qreal maxTextHeight = option.maxTextSize.height();
if (maxTextHeight > 0 && textHeight > maxTextHeight) {
@@ -263,6 +271,16 @@ void KStandardItemListWidget::paint(QPainter* painter, const QStyleOptionGraphic
painter->setFont(m_customizedFont);
painter->setPen(m_isHidden ? m_additionalInfoTextColor : textColor());
const TextInfo* textInfo = m_textInfo.value("text");
+
+ if (!textInfo) {
+ // It seems that we can end up here even if m_textInfo does not contain
+ // the key "text", see bug 306167. According to triggerCacheRefreshing(),
+ // this can only happen if the index is negative. This can happen when
+ // the item is about to be removed, see KItemListView::slotItemsRemoved().
+ // TODO: try to reproduce the crash and find a better fix.
+ return;
+ }
+
painter->drawStaticText(textInfo->pos, textInfo->staticText);
bool clipAdditionalInfoBounds = false;
@@ -464,7 +482,7 @@ QFont KStandardItemListWidget::customizedFont(const QFont& baseFont) const
return baseFont;
}
-QPalette::ColorRole KStandardItemListWidget::normalTextColorPalette() const
+QPalette::ColorRole KStandardItemListWidget::normalTextColorRole() const
{
return QPalette::Text;
}
@@ -485,8 +503,8 @@ QColor KStandardItemListWidget::textColor() const
}
const QPalette::ColorGroup group = isActiveWindow() ? QPalette::Active : QPalette::Inactive;
- const QPalette::ColorRole role = isSelected() ? QPalette::HighlightedText : normalTextColorPalette();
- return styleOption().palette.brush(group, role).color();
+ const QPalette::ColorRole role = isSelected() ? QPalette::HighlightedText : normalTextColorRole();
+ return styleOption().palette.color(group, role);
}
void KStandardItemListWidget::setOverlay(const QPixmap& overlay)
@@ -594,6 +612,11 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const
if (current.isEmpty() || !parent || current != "text") {
if (m_roleEditor) {
emit roleEditingCanceled(index(), current, data().value(current));
+
+ disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)),
+ this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant)));
+ disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)),
+ this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant)));
m_roleEditor->deleteLater();
m_roleEditor = 0;
}
@@ -965,8 +988,17 @@ void KStandardItemListWidget::updateIconsLayoutTextCache()
qreal nameHeight = 0;
QTextLine line;
+ int emptyRolesCount = 0;
+ foreach (const QByteArray& role, visibleRoles()) {
+ const QString text = roleText(role, values);
+ if (role != "text" && role != "rating" && text.isEmpty()) {
+ emptyRolesCount++;
+ }
+ }
+
const int additionalRolesCount = qMax(visibleRoles().count() - 1, 0);
- const int maxNameLines = (option.maxTextSize.height() / int(lineSpacing)) - additionalRolesCount;
+ const int maxNameLines = (option.maxTextSize.height() / int(lineSpacing)) -
+ (additionalRolesCount - emptyRolesCount);
QTextLayout layout(nameTextInfo->staticText.text(), m_customizedFont);
layout.setTextOption(nameTextInfo->staticText.textOption());
@@ -1000,7 +1032,7 @@ void KStandardItemListWidget::updateIconsLayoutTextCache()
nameTextInfo->staticText.setTextWidth(maxWidth);
nameTextInfo->pos = QPointF(padding, widgetHeight -
nameHeight -
- additionalRolesCount * lineSpacing -
+ (additionalRolesCount - emptyRolesCount)* lineSpacing -
padding);
m_textRect = QRectF(padding + (maxWidth - nameWidth) / 2,
nameTextInfo->pos.y(),
@@ -1015,6 +1047,11 @@ void KStandardItemListWidget::updateIconsLayoutTextCache()
}
const QString text = roleText(role, values);
+
+ if (role != "text" && role != "rating" && text.isEmpty()) {
+ continue;
+ }
+
TextInfo* textInfo = m_textInfo.value(role);
textInfo->staticText.setText(text);
@@ -1253,6 +1290,11 @@ void KStandardItemListWidget::closeRoleEditor()
// to transfer the keyboard focus back to the KItemListContainer.
scene()->views()[0]->parentWidget()->setFocus();
}
+
+ disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)),
+ this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant)));
+ disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)),
+ this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant)));
m_roleEditor->deleteLater();
m_roleEditor = 0;
}