aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/coreplugin/fancyactionbar.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@nokia.com>2011-11-14 17:33:28 +0100
committerhjk <qthjk@ovi.com>2011-11-15 18:25:05 +0100
commitead46746469d1ec095896b617e99edb8f7f13a32 (patch)
treecb1b9ccfead591690e45712d57675eebd814ae4b /src/plugins/coreplugin/fancyactionbar.cpp
parent4c76e40617d22d3578bb95973b54b0e266591e7c (diff)
Make build configuration on target selector a two line label
Change-Id: I9d8a21fbedf07e81f17cbb21405c2b6e7f0c161c Reviewed-by: hjk <qthjk@ovi.com>
Diffstat (limited to 'src/plugins/coreplugin/fancyactionbar.cpp')
-rw-r--r--src/plugins/coreplugin/fancyactionbar.cpp86
1 files changed, 75 insertions, 11 deletions
diff --git a/src/plugins/coreplugin/fancyactionbar.cpp b/src/plugins/coreplugin/fancyactionbar.cpp
index d6edc092c8..68dfc50250 100644
--- a/src/plugins/coreplugin/fancyactionbar.cpp
+++ b/src/plugins/coreplugin/fancyactionbar.cpp
@@ -34,6 +34,7 @@
#include "coreconstants.h"
#include <utils/stylehelper.h>
+#include <utils/stringutils.h>
#include <coreplugin/icore.h>
#include <coreplugin/imode.h>
@@ -95,6 +96,50 @@ bool FancyToolButton::event(QEvent *e)
return false;
}
+static QVector<QString> splitInTwoLines(const QString &text, const QFontMetrics &fontMetrics,
+ qreal availableWidth)
+{
+ // split in two lines.
+ // this looks if full words can be split off at the end of the string,
+ // to put them in the second line. First line is drawn with ellipsis,
+ // second line gets ellipsis if it couldn't split off full words.
+ QVector<QString> splitLines(2);
+ QRegExp rx(QLatin1String("\\s+"));
+ int splitPos = -1;
+ int nextSplitPos = text.length();
+ do {
+ nextSplitPos = rx.lastIndexIn(text,
+ nextSplitPos - text.length() - 1);
+ if (nextSplitPos != -1) {
+ int splitCandidate = nextSplitPos + rx.matchedLength();
+ if (fontMetrics.width(text.mid(splitCandidate)) <= availableWidth) {
+ splitPos = splitCandidate;
+ } else {
+ break;
+ }
+ }
+ } while (nextSplitPos > 0 && fontMetrics.width(text.left(nextSplitPos)) > availableWidth);
+ // check if we could split at white space at all
+ if (splitPos < 0) {
+ splitLines[0] = fontMetrics.elidedText(text, Qt::ElideRight,
+ availableWidth);
+ QString common = Utils::commonPrefix(QStringList()
+ << splitLines[0] << text);
+ splitLines[1] = text.mid(common.length());
+ // elide the second line even if it fits, since it is cut off in mid-word
+ while (fontMetrics.width(QChar(0x2026) /*'...'*/ + splitLines[1]) > availableWidth
+ && splitLines[1].length() > 3
+ /*keep at least three original characters (should not happen)*/) {
+ splitLines[1].remove(0, 1);
+ }
+ splitLines[1] = QChar(0x2026) /*'...'*/ + splitLines[1];
+ } else {
+ splitLines[0] = fontMetrics.elidedText(text.left(splitPos).trimmed(), Qt::ElideRight, availableWidth);
+ splitLines[1] = text.mid(splitPos);
+ }
+ return splitLines;
+}
+
void FancyToolButton::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
@@ -157,7 +202,7 @@ void FancyToolButton::paintEvent(QPaintEvent *event)
const QString buildConfiguration = defaultAction()->property("subtitle").toString();
if (!buildConfiguration.isNull())
- centerRect.adjust(0, 0, 0, -lineHeight - 4);
+ centerRect.adjust(0, 0, 0, -lineHeight*2 - 4);
iconRect.moveCenter(centerRect.center());
Utils::StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, isEnabled() ? QIcon::Normal : QIcon::Disabled);
@@ -173,8 +218,10 @@ void FancyToolButton::paintEvent(QPaintEvent *event)
penColor = Qt::gray;
painter.setPen(penColor);
+ // draw project name
const int margin = 6;
- QString ellidedProjectName = fm.elidedText(projectName, Qt::ElideMiddle, r.width() - margin);
+ const qreal availableWidth = r.width() - margin;
+ QString ellidedProjectName = fm.elidedText(projectName, Qt::ElideMiddle, availableWidth);
if (isEnabled()) {
const QRectF shadowR = r.translated(0, 1);
painter.setPen(QColor(30, 30, 30, 80));
@@ -182,18 +229,35 @@ void FancyToolButton::paintEvent(QPaintEvent *event)
painter.setPen(penColor);
}
painter.drawText(r, textFlags, ellidedProjectName);
+
+ // draw build configuration name
textOffset = iconRect.center() + QPoint(iconRect.width()/2, iconRect.height()/2);
- r = QRectF(0, textOffset.y()+5, rect().width(), lineHeight);
+ QRectF buildConfigRect[2];
+ buildConfigRect[0] = QRectF(0, textOffset.y() + 5, rect().width(), lineHeight);
+ buildConfigRect[1] = QRectF(0, textOffset.y() + 5 + lineHeight, rect().width(), lineHeight);
painter.setFont(boldFont);
- QString ellidedBuildConfiguration = boldFm.elidedText(buildConfiguration, Qt::ElideMiddle, r.width() - margin);
- if (isEnabled()) {
- const QRectF shadowR = r.translated(0, 1);
- painter.setPen(QColor(30, 30, 30, 80));
- painter.drawText(shadowR, textFlags, ellidedBuildConfiguration);
- painter.setPen(penColor);
+ QVector<QString> splitBuildConfiguration(2);
+ if (boldFm.width(buildConfiguration) <= availableWidth) {
+ // text fits in one line
+ splitBuildConfiguration[0] = buildConfiguration;
+ } else {
+ splitBuildConfiguration = splitInTwoLines(buildConfiguration, boldFm, availableWidth);
}
+ // draw the two lines for the build configuration
+ for (int i = 0; i < 2; ++i) {
+ if (splitBuildConfiguration[i].isEmpty())
+ continue;
+ if (isEnabled()) {
+ const QRectF shadowR = buildConfigRect[i].translated(0, 1);
+ painter.setPen(QColor(30, 30, 30, 80));
+ painter.drawText(shadowR, textFlags, splitBuildConfiguration[i]);
+ painter.setPen(penColor);
+ }
+ painter.drawText(buildConfigRect[i], textFlags, splitBuildConfiguration[i]);
+ }
+
+ // pop up arrow next to icon
if (!icon().isNull()) {
- painter.drawText(r, textFlags, ellidedBuildConfiguration);
QStyleOption opt;
opt.initFrom(this);
opt.rect = rect().adjusted(rect().width() - 16, 0, -8, 0);
@@ -233,7 +297,7 @@ QSize FancyToolButton::sizeHint() const
const QString buildConfiguration = defaultAction()->property("subtitle").toString();
if (!buildConfiguration.isEmpty())
- buttonSize += QSizeF(0, lineHeight + 2);
+ buttonSize += QSizeF(0, lineHeight*2 + 2);
}
return buttonSize.toSize();
}