#include <QStyleOption>
#include <QTextLayout>
#include <QTextLine>
+#include <QPixmapCache>
// #define KSTANDARDITEMLISTWIDGET_DEBUG
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);
layout.endLayout();
// Add one line for each additional information
- textHeight += (additionalRolesCount - emptyRolesCount) * option.fontMetrics.lineSpacing();
+ textHeight += additionalRolesCount * option.fontMetrics.lineSpacing();
const qreal maxTextHeight = option.maxTextSize.height();
if (maxTextHeight > 0 && textHeight > maxTextHeight) {
m_additionalInfoTextColor(),
m_overlay(),
m_rating(),
- m_roleEditor(0)
+ m_roleEditor(0),
+ m_oldRoleEditor(0)
{
}
m_textInfo.clear();
delete m_roleEditor;
+ delete m_oldRoleEditor;
}
void KStandardItemListWidget::setLayout(Layout layout)
{
Q_UNUSED(previous);
- QGraphicsView* parent = scene()->views()[0];
- if (current.isEmpty() || !parent || current != "text") {
+ QGraphicsView* parent = scene()->views()[0];
+ if (current.isEmpty() || !parent || current != "text") {
if (m_roleEditor) {
emit roleEditingCanceled(index(), current, data().value(current));
this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant)));
disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)),
this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant)));
- m_roleEditor->deleteLater();
+ m_oldRoleEditor = m_roleEditor;
+ m_roleEditor->hide();
m_roleEditor = 0;
}
return;
+ } else if (m_oldRoleEditor) {
+ // Delete the old editor before constructing the new one to
+ // prevent a memory leak.
+ m_oldRoleEditor->deleteLater();
+ m_oldRoleEditor = 0;
}
Q_ASSERT(!m_roleEditor);
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 - emptyRolesCount);
+ const int maxNameLines = (option.maxTextSize.height() / int(lineSpacing)) - additionalRolesCount;
QTextLayout layout(nameTextInfo->staticText.text(), m_customizedFont);
layout.setTextOption(nameTextInfo->staticText.textOption());
nameTextInfo->staticText.setTextWidth(maxWidth);
nameTextInfo->pos = QPointF(padding, widgetHeight -
nameHeight -
- (additionalRolesCount - emptyRolesCount)* lineSpacing -
+ additionalRolesCount * lineSpacing -
padding);
m_textRect = QRectF(padding + (maxWidth - nameWidth) / 2,
nameTextInfo->pos.y(),
}
const QString text = roleText(role, values);
-
- if (role != "text" && role != "rating" && text.isEmpty()) {
- continue;
- }
-
TextInfo* textInfo = m_textInfo.value(role);
textInfo->staticText.setText(text);
QRect siblingRect(x, 0, siblingSize, siblingSize);
QStyleOption option;
+ option.palette.setColor(QPalette::Text, option.palette.color(normalTextColorRole()));
bool isItemSibling = true;
const QBitArray siblings = siblingsInformation();
void KStandardItemListWidget::closeRoleEditor()
{
+ 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)));
+
if (m_roleEditor->hasFocus()) {
// If the editing was not ended by a FocusOut event, we have
// 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_oldRoleEditor = m_roleEditor;
+ m_roleEditor->hide();
m_roleEditor = 0;
}
QPixmap KStandardItemListWidget::pixmapForIcon(const QString& name, int size)
{
- const KIcon icon(name);
-
- int requestedSize;
- if (size <= KIconLoader::SizeSmall) {
- requestedSize = KIconLoader::SizeSmall;
- } else if (size <= KIconLoader::SizeSmallMedium) {
- requestedSize = KIconLoader::SizeSmallMedium;
- } else if (size <= KIconLoader::SizeMedium) {
- requestedSize = KIconLoader::SizeMedium;
- } else if (size <= KIconLoader::SizeLarge) {
- requestedSize = KIconLoader::SizeLarge;
- } else if (size <= KIconLoader::SizeHuge) {
- requestedSize = KIconLoader::SizeHuge;
- } else if (size <= KIconLoader::SizeEnormous) {
- requestedSize = KIconLoader::SizeEnormous;
- } else if (size <= KIconLoader::SizeEnormous * 2) {
- requestedSize = KIconLoader::SizeEnormous * 2;
- } else {
- requestedSize = size;
- }
+ const QString key = "KStandardItemListWidget:" % name % ":" % QString::number(size);
+ QPixmap pixmap;
+
+ if (!QPixmapCache::find(key, pixmap)) {
+ const KIcon icon(name);
+
+ int requestedSize;
+ if (size <= KIconLoader::SizeSmall) {
+ requestedSize = KIconLoader::SizeSmall;
+ } else if (size <= KIconLoader::SizeSmallMedium) {
+ requestedSize = KIconLoader::SizeSmallMedium;
+ } else if (size <= KIconLoader::SizeMedium) {
+ requestedSize = KIconLoader::SizeMedium;
+ } else if (size <= KIconLoader::SizeLarge) {
+ requestedSize = KIconLoader::SizeLarge;
+ } else if (size <= KIconLoader::SizeHuge) {
+ requestedSize = KIconLoader::SizeHuge;
+ } else if (size <= KIconLoader::SizeEnormous) {
+ requestedSize = KIconLoader::SizeEnormous;
+ } else if (size <= KIconLoader::SizeEnormous * 2) {
+ requestedSize = KIconLoader::SizeEnormous * 2;
+ } else {
+ requestedSize = size;
+ }
+
+ pixmap = icon.pixmap(requestedSize, requestedSize);
+ if (requestedSize != size) {
+ KPixmapModifier::scale(pixmap, QSize(size, size));
+ }
- QPixmap pixmap = icon.pixmap(requestedSize, requestedSize);
- if (requestedSize != size) {
- KPixmapModifier::scale(pixmap, QSize(size, size));
+ QPixmapCache::insert(key, pixmap);
}
return pixmap;