numerous horizontal icon layout issues fixed
svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=781876
This commit is contained in:
parent
0bc0cfaa5c
commit
c1e480f20c
111
widgets/icon.cpp
111
widgets/icon.cpp
@ -441,38 +441,20 @@ void Icon::layoutIcons(const QStyleOptionGraphicsItem *option)
|
||||
d->verticalMargin[Private::IconMargin].top -
|
||||
d->verticalMargin[Private::IconMargin].bottom;
|
||||
}
|
||||
//Horizontal layout
|
||||
} else {
|
||||
qreal widthAvail;
|
||||
//Horizontal layout
|
||||
QFontMetricsF fm(font());
|
||||
|
||||
//make room for at most 14 characters
|
||||
qreal textWidth = qMax(fm.width(d->text.left(12)),
|
||||
fm.width(d->infoText.left(12))) +
|
||||
fm.width("xx") +
|
||||
d->horizontalMargin[Private::TextMargin].left +
|
||||
d->horizontalMargin[Private::TextMargin].right;
|
||||
|
||||
//if there is text resize the icon in order to make room for the text
|
||||
if (!d->text.isEmpty() || !d->infoText.isEmpty()) {
|
||||
widthAvail = d->currentSize.width() -
|
||||
//FIXME: fontmetrics
|
||||
textWidth -
|
||||
d->horizontalMargin[Private::TextMargin].left -
|
||||
d->horizontalMargin[Private::TextMargin].right;
|
||||
if (d->text.isEmpty() && d->infoText.isEmpty()) {
|
||||
// with no text, we just take up the whole geometry
|
||||
iconWidth = d->currentSize.width() -
|
||||
d->horizontalMargin[Private::IconMargin].left -
|
||||
d->horizontalMargin[Private::IconMargin].right;
|
||||
} else {
|
||||
widthAvail = d->currentSize.width();
|
||||
}
|
||||
|
||||
//aspect ratio very "wide"
|
||||
if (d->currentSize.height() < widthAvail) {
|
||||
iconWidth = d->currentSize.height() -
|
||||
d->verticalMargin[Private::IconMargin].top -
|
||||
d->verticalMargin[Private::IconMargin].bottom;
|
||||
} else {
|
||||
iconWidth = widthAvail -
|
||||
d->horizontalMargin[Private::IconMargin].left -
|
||||
d->horizontalMargin[Private::IconMargin].right;
|
||||
}
|
||||
}
|
||||
|
||||
@ -483,7 +465,6 @@ void Icon::layoutIcons(const QStyleOptionGraphicsItem *option)
|
||||
iconAction->setRect(d->actionRect((Private::ActionPosition)count));
|
||||
++count;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Icon::setSvg(const QString &svgFilePath, const QString &elementId)
|
||||
@ -539,14 +520,12 @@ void Icon::Private::drawBackground(QPainter *painter, IconState state)
|
||||
QColor shadow = shadowColor;
|
||||
QColor border = textColor;
|
||||
|
||||
border.setAlphaF(.20);
|
||||
|
||||
switch (state) {
|
||||
case Private::HoverState:
|
||||
shadow.setHsv(shadow.hue(),
|
||||
shadow.saturation(),
|
||||
shadow.value() + (int)(darkShadow?50*m_hoverAlpha:-50*m_hoverAlpha),
|
||||
200+(int)m_hoverAlpha*55); // opacity
|
||||
shadow.value() + (int)(darkShadow ? 50 * m_hoverAlpha: -50 * m_hoverAlpha),
|
||||
200 + (int)m_hoverAlpha * 55); // opacity
|
||||
break;
|
||||
case Private::PressedState:
|
||||
shadow.setHsv(shadow.hue(),
|
||||
@ -557,11 +536,13 @@ void Icon::Private::drawBackground(QPainter *painter, IconState state)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
border.setAlphaF(.2);
|
||||
shadow.setAlphaF(.6);
|
||||
|
||||
painter->save();
|
||||
painter->translate(0.5, 0.5);
|
||||
painter->setRenderHint(QPainter::Antialiasing);
|
||||
shadow.setAlphaF(.6);
|
||||
painter->setBrush(shadow);
|
||||
painter->setPen(QPen(border, 1));
|
||||
painter->drawPath(roundedRectangle(QRectF(QPointF(1, 1), QSize((int)currentSize.width()-2, (int)currentSize.height()-2)), 5.0));
|
||||
@ -648,21 +629,18 @@ QRectF Icon::Private::labelRectangle(const QStyleOptionGraphicsItem *option, con
|
||||
return option->rect;
|
||||
}
|
||||
|
||||
const QSizeF decoSize = addMargin(iconSize, Private::IconMargin);
|
||||
|
||||
const QSizeF decoSize = addMargin(iconSize, Private::IconMargin);
|
||||
const QRectF itemRect = subtractMargin(option->rect, Private::ItemMargin);
|
||||
QRectF textArea(QPointF(0, 0), itemRect.size());
|
||||
|
||||
|
||||
if (orientation == Qt::Vertical) {
|
||||
textArea.setTop(decoSize.height() + 1);
|
||||
//Horizontal
|
||||
}else{
|
||||
} else {
|
||||
//Horizontal
|
||||
textArea.setLeft(decoSize.width() + 1);
|
||||
}
|
||||
|
||||
textArea.translate(itemRect.topLeft());
|
||||
|
||||
return QRectF(QStyle::visualRect(iconDirection(option), option->rect, textArea.toRect()));
|
||||
}
|
||||
|
||||
@ -764,8 +742,9 @@ void Icon::Private::layoutTextItems(const QStyleOptionGraphicsItem *option,
|
||||
|
||||
QFontMetricsF fm(labelLayout->font());
|
||||
const QRectF textArea = labelRectangle(option, icon, text);
|
||||
QRectF textRect = subtractMargin(textArea, Private::TextMargin);
|
||||
QRectF textRect = subtractMargin(textArea, Private::TextMargin);
|
||||
|
||||
//kDebug() << this << "text area" << textArea << "text rect" << textRect;
|
||||
// Sizes and constraints for the different text parts
|
||||
QSizeF maxLabelSize = textRect.size();
|
||||
QSizeF maxInfoSize = textRect.size();
|
||||
@ -801,6 +780,7 @@ void Icon::Private::layoutTextItems(const QStyleOptionGraphicsItem *option,
|
||||
// Compute the positions where we should draw the layouts
|
||||
labelLayout->setPosition(QPointF(textRect.x(), textBoundingRect->y()));
|
||||
infoLayout->setPosition(QPointF(textRect.x(), textBoundingRect->y() + labelSize.height()));
|
||||
//kDebug() << "final position is" << labelLayout->position();
|
||||
}
|
||||
|
||||
QBrush Icon::Private::foregroundBrush(const QStyleOptionGraphicsItem *option) const
|
||||
@ -834,19 +814,25 @@ void Icon::Private::drawTextItems(QPainter *painter, const QStyleOptionGraphicsI
|
||||
{
|
||||
Q_UNUSED(option)
|
||||
|
||||
painter->save();
|
||||
painter->setPen(textColor);
|
||||
|
||||
// the translation prevents odd rounding errors in labelLayout.position()
|
||||
// when applied to the canvas
|
||||
painter->translate(0.5, 0.5);
|
||||
|
||||
labelLayout.draw(painter, QPointF());
|
||||
|
||||
if (!infoLayout.text().isEmpty()) {
|
||||
painter->setPen(textColor);
|
||||
infoLayout.draw(painter, QPointF());
|
||||
}
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
|
||||
void Icon::paintWidget(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
|
||||
{
|
||||
Q_UNUSED(option)
|
||||
Q_UNUSED(widget)
|
||||
|
||||
#ifdef BACKINGSTORE_BLUR_HACK
|
||||
@ -881,13 +867,9 @@ void Icon::paintWidget(QPainter *painter, const QStyleOptionGraphicsItem *option
|
||||
state = Private::HoverState;
|
||||
}
|
||||
|
||||
QPixmap icon = d->decoration(option, state != Private::NoState);
|
||||
QPixmap icon = d->decoration(option, state != Private::NoState);
|
||||
const QPointF iconPos = d->iconPosition(option, icon);
|
||||
|
||||
QTextLayout labelLayout, infoLayout;
|
||||
QRectF textBoundingRect;
|
||||
d->layoutTextItems(option, icon, &labelLayout, &infoLayout, &textBoundingRect);
|
||||
|
||||
d->drawBackground(painter, state);
|
||||
|
||||
// draw icon
|
||||
@ -896,13 +878,16 @@ void Icon::paintWidget(QPainter *painter, const QStyleOptionGraphicsItem *option
|
||||
}
|
||||
|
||||
// Draw corner actions
|
||||
foreach (IconAction *action, d->cornerActions) {
|
||||
foreach (const IconAction *action, d->cornerActions) {
|
||||
if (action->animationId()) {
|
||||
action->paint(painter);
|
||||
}
|
||||
}
|
||||
|
||||
// Draw text last because its overlayed
|
||||
QTextLayout labelLayout, infoLayout;
|
||||
QRectF textBoundingRect;
|
||||
d->layoutTextItems(option, icon, &labelLayout, &infoLayout, &textBoundingRect);
|
||||
d->drawTextItems(painter, option, labelLayout, infoLayout);
|
||||
}
|
||||
|
||||
@ -1120,6 +1105,7 @@ void Icon::setUnpressed()
|
||||
void Icon::setOrientation(Qt::Orientation orientation)
|
||||
{
|
||||
d->orientation = orientation;
|
||||
resize(sizeFromIconSize(d->iconSize.width()));
|
||||
}
|
||||
|
||||
void Icon::invertLayout(bool invert)
|
||||
@ -1134,26 +1120,34 @@ bool Icon::invertedLayout() const
|
||||
|
||||
QSizeF Icon::sizeFromIconSize(const qreal iconWidth) const
|
||||
{
|
||||
//no text, less calculations
|
||||
if (d->text.isEmpty() && d->infoText.isEmpty()) {
|
||||
return d->addMargin(d->addMargin(QSizeF(iconWidth, iconWidth),
|
||||
Private::IconMargin),
|
||||
//no text, less calculations
|
||||
return d->addMargin(d->addMargin(QSizeF(iconWidth, iconWidth), Private::IconMargin),
|
||||
Private::ItemMargin);
|
||||
}
|
||||
|
||||
QFontMetricsF fm = Plasma::Theme::self()->fontMetrics();
|
||||
//make room for at most 14 characters
|
||||
qreal width = qMax(fm.width(d->text.left(12)),
|
||||
fm.width(d->infoText.left(12))) +
|
||||
fm.width("xx") +
|
||||
d->horizontalMargin[Private::TextMargin].left +
|
||||
d->horizontalMargin[Private::TextMargin].right;
|
||||
qreal width = 0;
|
||||
|
||||
if (d->orientation == Qt::Vertical) {
|
||||
// make room for at most 14 characters
|
||||
width = qMax(fm.width(d->text.left(12)),
|
||||
fm.width(d->infoText.left(12))) +
|
||||
fm.width("xx") +
|
||||
d->horizontalMargin[Private::TextMargin].left +
|
||||
d->horizontalMargin[Private::TextMargin].right;
|
||||
|
||||
width = qMax(width,
|
||||
iconWidth +
|
||||
d->horizontalMargin[Private::IconMargin].left +
|
||||
d->horizontalMargin[Private::IconMargin].right);
|
||||
} else {
|
||||
width = iconWidth +
|
||||
d->horizontalMargin[Private::IconMargin].left +
|
||||
d->horizontalMargin[Private::IconMargin].right +
|
||||
qMax(fm.width(d->text), fm.width(d->infoText)) + fm.width("xx") +
|
||||
d->horizontalMargin[Private::TextMargin].left +
|
||||
d->horizontalMargin[Private::TextMargin].right;
|
||||
}
|
||||
|
||||
qreal height;
|
||||
@ -1170,17 +1164,14 @@ QSizeF Icon::sizeFromIconSize(const qreal iconWidth) const
|
||||
d->verticalMargin[Private::TextMargin].bottom +
|
||||
d->verticalMargin[Private::IconMargin].top +
|
||||
d->verticalMargin[Private::IconMargin].bottom;
|
||||
//Horizontal
|
||||
}else{
|
||||
} else {
|
||||
//Horizontal
|
||||
height = qMax(iconWidth +
|
||||
d->verticalMargin[Private::IconMargin].top +
|
||||
d->verticalMargin[Private::IconMargin].bottom,
|
||||
textHeight +
|
||||
d->verticalMargin[Private::TextMargin].top +
|
||||
d->verticalMargin[Private::IconMargin].bottom);
|
||||
width = width + iconWidth +
|
||||
d->horizontalMargin[Private::IconMargin].left +
|
||||
d->horizontalMargin[Private::IconMargin].right;
|
||||
d->verticalMargin[Private::TextMargin].bottom);
|
||||
}
|
||||
|
||||
return d->addMargin(QSizeF(width, height), Private::ItemMargin);
|
||||
|
Loading…
Reference in New Issue
Block a user