summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-09-09 09:08:23 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-09-09 09:24:16 +0300
commit23f72f348defe10a37c95c39fdd48c90ea88b96d (patch)
tree72da08dc039c1cd15a9b4d1c40c6eb8c6c395f98 /src
parent078a13fdeb00c055dbc0dfed23492a1963b71de3 (diff)
Label width issue fixed
Task-number: QTRD-2248 Change-Id: I6b17ac4d6e6a647ea627bdd55bac9eae272554d4 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/datavis3d/engine/axisrendercache.cpp27
-rw-r--r--src/datavis3d/engine/axisrendercache_p.h2
-rw-r--r--src/datavis3d/engine/drawer.cpp10
-rw-r--r--src/datavis3d/engine/drawer_p.h3
-rw-r--r--src/datavis3d/utils/utils.cpp48
-rw-r--r--src/datavis3d/utils/utils_p.h3
6 files changed, 68 insertions, 25 deletions
diff --git a/src/datavis3d/engine/axisrendercache.cpp b/src/datavis3d/engine/axisrendercache.cpp
index e35018b5..f44aa3b9 100644
--- a/src/datavis3d/engine/axisrendercache.cpp
+++ b/src/datavis3d/engine/axisrendercache.cpp
@@ -18,6 +18,7 @@
#include "axisrendercache_p.h"
#include "qmath.h"
+#include <QFontMetrics>
QT_DATAVIS3D_BEGIN_NAMESPACE
@@ -27,6 +28,7 @@ AxisRenderCache::AxisRenderCache()
m_max(10.0),
m_segmentCount(5),
m_subSegmentCount(1),
+ m_font(QFont(QStringLiteral("Arial"))),
m_drawer(0),
m_segmentStep(10.0f),
m_subSegmentStep(10.0f)
@@ -42,6 +44,7 @@ AxisRenderCache::~AxisRenderCache()
void AxisRenderCache::setDrawer(Drawer *drawer)
{
m_drawer = drawer;
+ m_font = m_drawer->font();
if (m_drawer) {
QObject::connect(m_drawer, &Drawer::drawerChanged, this, &AxisRenderCache::updateTextures);
updateTextures();
@@ -90,6 +93,8 @@ void AxisRenderCache::setLabels(const QStringList &labels)
m_labelItems.reserve(newSize);
+ int widest = maxLabelWidth(labels);
+
for (int i = 0; i < newSize; i++) {
if (i >= oldSize)
m_labelItems.append(new LabelItem);
@@ -97,7 +102,7 @@ void AxisRenderCache::setLabels(const QStringList &labels)
if (labels.at(i).isEmpty())
m_labelItems[i]->clear();
else if (i >= oldSize || labels.at(i) != m_labels.at(i))
- m_drawer->generateLabelItem(*m_labelItems[i], labels.at(i));
+ m_drawer->generateLabelItem(*m_labelItems[i], labels.at(i), widest);
}
}
m_labels = labels;
@@ -130,16 +135,20 @@ void AxisRenderCache::setSubSegmentCount(int count)
void AxisRenderCache::updateTextures()
{
+ m_font = m_drawer->font();
+
if (m_title.isEmpty())
m_titleItem.clear();
else
m_drawer->generateLabelItem(m_titleItem, m_title);
+ int widest = maxLabelWidth(m_labels);
+
for (int i = 0; i < m_labels.size(); i++) {
if (m_labels.at(i).isEmpty())
m_labelItems[i]->clear();
else
- m_drawer->generateLabelItem(*m_labelItems[i], m_labels.at(i));
+ m_drawer->generateLabelItem(*m_labelItems[i], m_labels.at(i), widest);
}
}
@@ -160,4 +169,18 @@ void AxisRenderCache::updateSubSegmentStep()
m_subSegmentStep = m_segmentStep;
}
+int AxisRenderCache::maxLabelWidth(const QStringList &labels) const
+{
+ int labelWidth = 0;
+ QFont labelFont = m_font;
+ labelFont.setPointSize(50);
+ QFontMetrics labelFM(labelFont);
+ for (int i = 0; i < labels.size(); i++) {
+ int newWidth = labelFM.width(labels.at(i));
+ if (labelWidth < newWidth)
+ labelWidth = newWidth;
+ }
+ return labelWidth;
+}
+
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/engine/axisrendercache_p.h b/src/datavis3d/engine/axisrendercache_p.h
index 876ec077..e4f965f4 100644
--- a/src/datavis3d/engine/axisrendercache_p.h
+++ b/src/datavis3d/engine/axisrendercache_p.h
@@ -73,6 +73,7 @@ public slots:
private:
void updateSegmentStep();
void updateSubSegmentStep();
+ int maxLabelWidth(const QStringList &labels) const;
// Cached axis values
Q3DAbstractAxis::AxisType m_type;
@@ -83,6 +84,7 @@ private:
int m_segmentCount;
int m_subSegmentCount;
QString m_labelFormat;
+ QFont m_font;
// Renderer items
Drawer *m_drawer; // Not owned
diff --git a/src/datavis3d/engine/drawer.cpp b/src/datavis3d/engine/drawer.cpp
index 6f2941d6..284d5675 100644
--- a/src/datavis3d/engine/drawer.cpp
+++ b/src/datavis3d/engine/drawer.cpp
@@ -74,6 +74,11 @@ void Drawer::setFont(const QFont &font)
emit drawerChanged();
}
+QFont Drawer::font() const
+{
+ return m_font;
+}
+
void Drawer::setTransparency(QDataVis::LabelTransparency transparency)
{
m_transparency = transparency;
@@ -316,7 +321,7 @@ void Drawer::generateSelectionLabelTexture(AbstractRenderItem *item)
generateLabelItem(labelItem, item->selectionLabel());
}
-void Drawer::generateLabelItem(LabelItem &item, const QString &text)
+void Drawer::generateLabelItem(LabelItem &item, const QString &text, int widestLabel)
{
initializeOpenGL();
@@ -329,7 +334,8 @@ void Drawer::generateLabelItem(LabelItem &item, const QString &text)
text,
m_theme.m_textBackgroundColor,
m_theme.m_textColor,
- m_transparency);
+ m_transparency,
+ widestLabel);
// Set label size
item.setSize(label.size());
diff --git a/src/datavis3d/engine/drawer_p.h b/src/datavis3d/engine/drawer_p.h
index 19109861..82b3b6cf 100644
--- a/src/datavis3d/engine/drawer_p.h
+++ b/src/datavis3d/engine/drawer_p.h
@@ -70,6 +70,7 @@ public:
void setTheme(const Theme &theme);
void setFont(const QFont &font);
+ QFont font() const;
void setTransparency(QDataVis::LabelTransparency transparency);
void drawObject(ShaderHelper *shader, AbstractObjectHelper *object, GLuint textureId = 0,
@@ -85,7 +86,7 @@ public:
Qt::AlignmentFlag alignment = Qt::AlignCenter);
void generateSelectionLabelTexture(AbstractRenderItem *item);
- void generateLabelItem(LabelItem &item, const QString &text);
+ void generateLabelItem(LabelItem &item, const QString &text, int widestLabel = 0);
Q_SIGNALS:
void drawerChanged();
diff --git a/src/datavis3d/utils/utils.cpp b/src/datavis3d/utils/utils.cpp
index 61583151..b4a6ae03 100644
--- a/src/datavis3d/utils/utils.cpp
+++ b/src/datavis3d/utils/utils.cpp
@@ -119,30 +119,31 @@ void Utils::printText(QPainter *painter, const QString &text, const QSize &posit
}
QImage Utils::printTextToImage(const QFont &font, const QString &text, const QColor &bgrColor,
- const QColor &txtColor, QDataVis::LabelTransparency transparency)
+ const QColor &txtColor, QDataVis::LabelTransparency transparency,
+ int maxLabelWidth)
{
GLuint paddingWidth = 15;
GLuint paddingHeight = 15;
// Calculate text dimensions
QFont valueFont = font;
- valueFont.setPointSize(30);
+ valueFont.setPointSize(50);
QFontMetrics valueFM(valueFont);
int valueStrWidth = valueFM.width(text);
+ if (maxLabelWidth && QDataVis::TransparencyNoBackground != transparency)
+ valueStrWidth = maxLabelWidth;
int valueStrHeight = valueFM.height();
QSize labelSize;
#if defined(Q_OS_ANDROID)
// Android can't handle textures with dimensions not in power of 2. Resize labels accordingly.
// Add some padding before converting to power of two to avoid too tight fit
- GLuint prePadding = 10;
+ GLuint prePadding = 5;
+ // Android needs to use this always because of the power of 2 -issue.
+ valueStrWidth = maxLabelWidth;
labelSize = QSize(valueStrWidth + prePadding, valueStrHeight + prePadding);
//qDebug() << "label size before padding" << labelSize;
labelSize.setWidth(getNearestPowerOfTwo(labelSize.width(), paddingWidth));
labelSize.setHeight(getNearestPowerOfTwo(labelSize.height(), paddingHeight));
- paddingWidth += prePadding;
- paddingHeight += prePadding;
- paddingWidth /= 2;
- paddingHeight /= 2;
//qDebug() << "label size after padding" << labelSize << paddingWidth << paddingHeight;
#else
if (QDataVis::TransparencyNoBackground == transparency)
@@ -161,14 +162,21 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setCompositionMode(QPainter::CompositionMode_Source);
switch (transparency) {
- // TODO: Texture size padding fix for Android f**ks this up for axis labels. Fix or disable for android.
case QDataVis::TransparencyNoBackground: {
painter.setFont(valueFont);
painter.setPen(txtColor);
+#if defined(Q_OS_ANDROID)
+ painter.drawText((labelSize.width() - valueStrWidth) / 2.0f,
+ (labelSize.height() - valueStrHeight) / 2.0f,
+ valueStrWidth, valueStrHeight,
+ Qt::AlignCenter | Qt::AlignVCenter,
+ text);
+#else
painter.drawText(0, 0,
valueStrWidth, valueStrHeight,
Qt::AlignCenter | Qt::AlignVCenter,
text);
+#endif
break;
}
case QDataVis::TransparencyFromTheme: {
@@ -177,7 +185,8 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
painter.drawRoundedRect(0, 0, labelSize.width(), labelSize.height(), 10.0, 10.0f);
painter.setFont(valueFont);
painter.setPen(txtColor);
- painter.drawText(paddingWidth, paddingHeight,
+ painter.drawText((labelSize.width() - valueStrWidth) / 2.0f,
+ (labelSize.height() - valueStrHeight) / 2.0f,
valueStrWidth, valueStrHeight,
Qt::AlignCenter | Qt::AlignVCenter,
text);
@@ -189,7 +198,8 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
painter.drawRect(0, 0, labelSize.width(), labelSize.height());
painter.setFont(valueFont);
painter.setPen(txtColor);
- painter.drawText(paddingWidth, paddingHeight,
+ painter.drawText((labelSize.width() - valueStrWidth) / 2.0f,
+ (labelSize.height() - valueStrHeight) / 2.0f,
valueStrWidth, valueStrHeight,
Qt::AlignCenter | Qt::AlignVCenter,
text);
@@ -207,14 +217,14 @@ QVector3D Utils::getSelection(QPoint mousepos, int height)
// This is the only one that works with ANGLE (ES 2.0)
// Item count will be limited to 256*256*256
GLubyte pixel[4];
- glReadPixels(mousepos.x(), height - mousepos.y(), 1, 1,
- GL_RGBA, GL_UNSIGNED_BYTE, (void *)pixel);
+ glReadPixels(mousepos.x(), height - mousepos.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
+ (void *)pixel);
//qDebug() << "rgba" << pixel[0] << pixel[1] << pixel[2] << pixel[3] << "mousepos:" << mousepos << "height:" << height;
//#else
- //// These work with desktop OpenGL
- //// They offer a lot higher possible object count and a possibility to use object ids
+ // These work with desktop OpenGL
+ // They offer a lot higher possible object count and a possibility to use object ids
//GLuint pixel[3];
//glReadPixels(mousepos.x(), height - mousepos.y(), 1, 1,
// GL_RGB, GL_UNSIGNED_INT, (void *)pixel);
@@ -235,13 +245,13 @@ Utils::ParamType Utils::mapFormatCharToParamType(const QChar &formatChar)
{
ParamType retVal = ParamTypeUnknown;
if (formatChar == QLatin1Char('d')
- || formatChar == QLatin1Char('i')
- || formatChar == QLatin1Char('c')) {
+ || formatChar == QLatin1Char('i')
+ || formatChar == QLatin1Char('c')) {
retVal = ParamTypeInt;
} else if (formatChar == QLatin1Char('u')
- || formatChar == QLatin1Char('o')
- || formatChar == QLatin1Char('x')
- || formatChar == QLatin1Char('X')) {
+ || formatChar == QLatin1Char('o')
+ || formatChar == QLatin1Char('x')
+ || formatChar == QLatin1Char('X')) {
retVal = ParamTypeUInt;
} else if (formatChar == QLatin1Char('f')
|| formatChar == QLatin1Char('F')
diff --git a/src/datavis3d/utils/utils_p.h b/src/datavis3d/utils/utils_p.h
index ac96b901..1fd261e6 100644
--- a/src/datavis3d/utils/utils_p.h
+++ b/src/datavis3d/utils/utils_p.h
@@ -59,7 +59,8 @@ public:
const QString &text,
const QColor &bgrColor,
const QColor &txtColor,
- QDataVis::LabelTransparency transparency);
+ QDataVis::LabelTransparency transparency,
+ int maxLabelWidth = 0);
static QVector3D getSelection(QPoint mousepos, int height);
static ParamType findFormatParamType(const QString &format);