From 23f72f348defe10a37c95c39fdd48c90ea88b96d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 9 Sep 2013 09:08:23 +0300 Subject: Label width issue fixed Task-number: QTRD-2248 Change-Id: I6b17ac4d6e6a647ea627bdd55bac9eae272554d4 Reviewed-by: Miikka Heikkinen --- src/datavis3d/engine/axisrendercache.cpp | 27 ++++++++++++++++-- src/datavis3d/engine/axisrendercache_p.h | 2 ++ src/datavis3d/engine/drawer.cpp | 10 +++++-- src/datavis3d/engine/drawer_p.h | 3 +- src/datavis3d/utils/utils.cpp | 48 +++++++++++++++++++------------- src/datavis3d/utils/utils_p.h | 3 +- 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 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); -- cgit v1.2.3